对数器的应用

365 阅读2分钟

对数器的概念和使用:因为我们在算法笔试的时候不能总是依赖在线调试,所以我们需要自己实现这一功能来保证自己写的算法正确性。

  1. 有一个你想要测得方法a
  2. 有一个复杂度不好但好实现的方法b,如果可以的话可以调用系统的功能
  3. 实现一个随机样本产生器
  4. 方法a和方法b跑相同的随机样本,比较结果是否一样
  5. 如果有不一样的地方,打印样本进行人为干预,改对方法a或者方法b
  6. 当样本数量很多时它们的结果依然正确,可以确定方法a已经正确

下面进行一个举例帮助理解:

判断自己写的插入排序是否正确:

    public static void main(String[] args) {
        int testTime = 500000;
        int maxSize = 100;
        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;
                System.out.println("插入排序");
                printArray(arr1);
                System.out.println("系统排序");
                printArray(arr2);
                break;
            }
        }
        System.out.println(succeed);
    }
    public static void insertionSort(int[] arr) {
        if(arr == null || arr.length < 2){
            return;
        }
        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);
            }
        }
    }
    public static void swap(int[] arr, int i, int j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    //对数器
    public static void comparator(int[] arr){
        Arrays.sort(arr);
    }
    //产生随机数组
    //Math.random() 指的是[0,1)所有的小数,等概率返回一个
    //(int)(Math.random() * N) 指的是[0,N-1]中所有的整数等概率返回一个
    public static int[] generateRandomArray(int maxSize,int maxValue) {
        int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
        for(int i = 0; i < arr.length; i++){
            //maxValue + 1才可以保证取到我们设置的最大值
            arr[i] = (int)((maxValue + 1) * Math.random()) - (int)(maxValue * Math.random());
        }
        return arr;
    }
    //随机对数器产生出来的数组,进行拷贝一份,分别用常规方法和自己写的改进算法进行对比
    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;
    }
    public static boolean isEqual(int[] arr1, int[] arr2){
        if((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)){
            return false;
        }
        if(arr1 == null && arr2 == null){
            return true;
        }
        if (arr1.length != arr2.length){
            return false;
        }
        for (int i = 0; i < arr1.length; i++){
            if (arr1[i] != arr2[i]){
                return false;
            }
        }
        return true;
    }
    public static void printArray(int[] arr){
        if(arr == null){
            return;
        }
        for (int i = 0; i < arr.length; i++){
            //print保证打印到一行上
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }