對數器(隨機樣本產生器)

對數器的概念與使用

  1. 有一個你想要測的方法a
  2. 實現一個絕對正確但是複雜度不好的方法b
  3. 實現一個隨機樣本產生器
  4. 實現比對的方法
  5. 把方法a和方法b比對很多次來驗證方法a是否正確
  6. 如果有一個樣本使得比對出錯,打印樣本分析是哪個方法出錯
  7. 當樣本數量很多時比對測試依然正確,可以確定方法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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章