对数器使用——排序算法对数器模板

对数器:

相当与自己为自己的算法提供了一共测试,类似于OJ的判断,但是样本容量比OJ提供的用例更多。ACM比赛的选手都会使用对数器来进行测试,因为ACM比赛提交一次如果失败是会罚时的。

所以对数器就是自己为自己的算法进行测试。怎么使用呢?

对数器的使用:

判断自己写的算法是否正确,可以编写一个绝对正确的算法(比如Java提供的sort()方法、暴力解法)而不关注复杂度情况。

实现一个随机样本产生器,产生测试用例。

实现一个比对的方法;

将两个算法使用相同的随机样本,看看得到的结果是否一样。

当样本数量很多时,比对测试依然正确,说明自己所写的算法是正确的。

如果有一个随机样本使得比对结果不一致,打印样本进行人工干预,对算法进行修改。

/**
     * 排序算法的对数器实现
     *
     * @param arr
     */
    //首先实现一个复杂度不怎么好,但是一定正确的方法
    public static void comparator(int[] arr) {
        Arrays.sort(arr);
    }

    //实现一个随机样本产生器
    public static int[] generateRandomArray(int size, int value) {
        //Math.random() -> [0,1) double 等概率返回一个在此范围上的double数
        //Math.random() * n -> [0,n) double 等概率返回一个在此范围上的double数
        //(int)Math.random() *n -> [0,n-1] int 等概率返回一个在此范围上的整数
        //设置数组长度 长度为[0,size]随机
        int[] randomArray = new int[(int) (Math.random() * (size + 1))];
        //为随机数组赋值 赋值范围[-value,value]
        for (int i = 0; i < randomArray.length; i++) {
            //两个随机数相减,产生负数[-value,value]
            randomArray[i] = (int) ((value + 1) * Math.random()) - (int) (Math.random() * (value + 1));
        }
        return randomArray;
    }

    //生成拷贝数组的方法
    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++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

在选择排序中使用对数器:

public static void main(String[] args) {
        int testTime = 500000;      //测试次数
        int size = 100;             //数组长度
        int value = 100;            //数组最大值
        boolean succeed = true;

        //测试
        for (int i = 0;i<testTime;i++){
            int[] arr1 = generateRandomArray(size,value);
            int[] arr2 = copyArray(arr1);
            selectionSort(arr1);
            comparator(arr2);
            if (!isEqual(arr1,arr2)){
                succeed = false;
                printArray(arr1);
                printArray(arr2);
                break;
            }
        }
        System.out.println(succeed ? "你的算法是正确的!":"你的算法有误");

        int[] arr = generateRandomArray(size,value);
        printArray(arr);
        selectionSort(arr);
        printArray(arr);
    }

posted @ 2020-07-07 15:12  硬盘红了  阅读(224)  评论(0编辑  收藏  举报