對數器的概念與使用
- 有一個你想要測的方法a
- 實現一個絕對正確但是複雜度不好的方法b
- 實現一個隨機樣本產生器
- 實現比對的方法
- 把方法a和方法b比對很多次來驗證方法a是否正確
- 如果有一個樣本使得比對出錯,打印樣本分析是哪個方法出錯
- 當樣本數量很多時比對測試依然正確,可以確定方法a已經正確
對數器的使用背景
當我們做一個面試題或者一個算法比賽的時候,有時候給的測試數據或oj比較少,不能覆蓋算法的各種情況,導致不能通過,這時候,一個對數器就相當重要了,用大量的數據測試我們的算法,如果依然正確,就可以確定算法是正確的。
參考代碼如下
import java.util.Arrays;
/**
* 對數器,驗證算法正確性
*
* @author 西郵陳冠希
* @date 2019/8/9
**/
public class Counter {
/**
* 要測試的算法-插入排序
*
* @param arr
*/
public static int[] insertionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return new int[] {0};
}
for (int i = 1; i < arr.length; i++) {
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
swap(arr, j, j + 1);
}
}
return arr;
}
/**
* 交換兩個數
*
* @param arr
* @param i
* @param j
*/
private static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
/**
* 時間複雜度很差,但是絕對正確的排序算法
*
* @param arr
*/
public static void comparator(int[] arr) {
Arrays.sort(arr);
}
/**
* 生成一個長度隨機,元素隨機的數組
*
* @param maxSize 數組最大長度
* @param maxValue 數組最大元素
* @return
*/
public static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) (Math.random() * (maxSize + 1))];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((Math.random() * (maxValue + 1)) - (Math.random() * maxValue));
}
return arr;
}
/**
* 拷貝一個和原隨機數組一模一樣的數組
*
* @param arr
* @return
*/
public static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
/**
* 判斷兩個數組是否一模一樣
*
* @param arr1
* @param arr2
* @return
*/
public static boolean isEqual(int[] arr1, int[] arr2) {
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
/**
* 打印數組
*
* @param arr
*/
public static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int testTime = 100000;
int maxSize = 10;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
insertionSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
break;
}
}
System.out.println(succeed ? "OK" : "Fucking fucked");
int[] arr = generateRandomArray(maxSize, maxValue);
printArray(arr);
insertionSort(arr);
printArray(arr);
}
}