zoukankan      html  css  js  c++  java
  • Java对数器的使用

    参考:https://blog.csdn.net/itcats_cn/article/details/81389063

    0、有一个你想要测的方法A
    
    1、实现一个绝对正确但是复杂度不好的方法B
    
    2、实现一个随机样本产生器 
    
    3、实现比对的方法
    
    4、把方法a和方法b比对很多次来验证方法a是否正确 
    
    5、如果有一个样本使得比对出错,打印样本分析是哪个方法出错
    
    6、当样本数量很多时比对测试依然正确,可以确定方法a已经正确。
    

    我这里使用的是选择排序跟Java提供的排序做对比:

    import java.util.Arrays;
    
    /**
     * @author zhangzhixi
     * @version 1.0
     * @date 2021-8-20 0:00
     */
    public class Demo {
    
        /*选择排序*/
        private static void choiceSort(int[] arr) {
            for (int i = 0; i < arr.length - 1; i++) {
                /*假设第一个数是擂主*/
                int maxIndex = i;
                for (int j = i + 1; j < arr.length; j++) {
                    if (arr[j] < arr[maxIndex]) {
                        /*擂主易主*/
                        maxIndex = j;
                    }
                }
                /*擂主不是先前的,就交换*/
                if (maxIndex != i) {
                    swap(arr, i, maxIndex);
                }
            }
        }
    
        /**
         * 使用按位与运算进行交换数据
         *
         * @param arr 数组
         * @param i   数据
         * @param j   数据
         */
        public 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 数组数据
         */
        private static void insertSort(int[] arr) {
            for (int i = 0; i < arr.length - 1; i++) {
                int insertVal = arr[i + 1];
                int index = i;
                while (index >= 0 && insertVal < arr[index]) {
                    arr[index + 1] = arr[index];
                    index--;
                }
                arr[index + 1] = insertVal;
            }
        }
    
        /**
         * 定义一个绝对正确的比较器
         *
         * @param arr 数组
         */
        public static void comparator(int[] arr) {
            Arrays.sort(arr);
        }
    
        /**
         * 实现一个随机样本产生器
         *
         * @param maxSize  区间
         * @param maxValue 区间
         * @return 随机数组
         */
        public static int[] generateRandomArray(int maxSize, int maxValue) {
            //产生随机数范围为[0,maxSize]
            int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
            for (int i = 0; i < arr.length; i++) {
                //产生[-maxValue,maxValue]的元素
                arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
            }
            return arr;
        }
    
        /**
         * 拷贝数组
         *
         * @param arr 要进行拷贝的数组
         * @return 拷贝后的数组
         */
        public static int[] copyArray(int[] arr) {
            if (arr == null) {
                return null;
            }
            int[] res = new int[arr.length];
            /*使用System的这个拷贝,因为Arrays.copyOf底层也是使用的这个*/
            System.arraycopy(arr, 0, res, 0, arr.length);
            return res;
        }
    
        /**
         * 实现比对的方法
         *
         * @param arr1 数组1
         * @param arr2 数组2
         * @return 相同返回true,不同返回false
         */
        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;
        }
    
        /**
         * 如果有一个样本使得比对出错,打印样本分析是哪个方法出错
         *
         * @param arr 出错的数组
         */
        public static void printArray(int[] arr) {
            if (arr == null) {
                return;
            }
            for (int j : arr) {
                System.out.print(j + " ");
            }
            System.out.println();
        }
    
        public static void main(String[] args) {
            /*比较次数、最大区间、最小区间、是否比对成功*/
            int testTime = 500000;
            int maxSize = 100;
            int maxValue = 100;
            boolean succeed = true;
            /*数组信息*/
            int[] arr1 = null;
            int[] arr2 = null;
            for (int i = 0; i < testTime; i++) {
                /*产生随机数组,并进行拷贝*/
                arr1 = generateRandomArray(maxSize, maxValue);
                arr2 = copyArray(arr1);
                /*对数组进行排序*/
                choiceSort(arr1);
                comparator(arr2);
    
                /*不相等*/
                if (!isEqual(arr1, arr2)) {
                    succeed = false;
                    printArray(arr1);
                    printArray(arr2);
                    break;
                }
            }
    
            System.out.println(succeed ? "比对成功!" : "比对失败!");
            System.out.println("-----------成功比对后的数组---------------");
            System.out.println(Arrays.toString(arr1));
            System.out.println(Arrays.toString(arr2));
        }
    }

    测试结果:

     

  • 相关阅读:
    sqlmap的学习以及使用
    SQL查询关于相对路径、矢代、绝对路径、递归、计算列的速度对比跟优化-SOD群记录
    新版本打印控件插件
    vs2013 遇到的web性能记录器无法使用问题
    sql数据库 管理处理问题--维护计划
    nopcommerce 初学2
    控制饭庄
    递归问题==优化 还有数据库sqlreader
    Java基础 -3.2
    Java基础 -3
  • 原文地址:https://www.cnblogs.com/zhangzhixi/p/15165404.html
Copyright © 2011-2022 走看看