对数器的概念和使用

简介: 对数器的概念和使用

左神给出了对数器的概念和使用 :七天刷爆LeetCode,顶级算法大神

对数器的使用场景

  • 在写出一个算法程序的时候,我们往往无法通过手动输入各种各样的测试数据来验证,在OJ平台上也无法找到对应的题目来进行验证。
  • 在一些样本量很大的情况下,我们往往无法考虑到所有的边界情况。
  • 尤其是一些贪心算法是很难通过数学的方式来进行验证的,这时使用对数器来判断算法程序是否正确

概念

  • 1.有一个想要测的方法
  • 2.实现复杂度不好但是容易实现的方法b
  • 3.实现一个随机样本产生器
  • 4.把方法a和方法b跑相同的随机样本,看看得到的结果是否一样
  • 5.如果有一个随机样本使得比对结果不一致,打印样本进行人工干预,改对方法a或者方法b
  • 6.当样本数量很多时比对测试依然正确,可以确定方法a已经正确

具体使用

step1: 创建一个绝对正确的方法

public static void comparator(int[] arr) {
        //方法b
        Arrays.sort(arr);
    }
复制代码

step2:生成一个随机数组

maxSize为数组的大小,maxValue为数组的元素的大小的范围

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++) {
            //值随机
            arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
        }
        return arr;
    }
复制代码

step3:copy数组

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;
    }
复制代码

step4:判断两数组是否相同

public static boolean isEqual(int[] arr1, int[] arr2) {
        if (arr1 == null && arr2 == null) {
            return true;
        }
        if (arr1 == null || arr2 == null) {
            return false;
        }
        if (arr1.length != arr2.length) {
            return false;
        }
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != arr2[i]) {
                return false;
            }
        }
        return true;
    }
复制代码

step5:大样本测试

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);
            bubbleSort(arr1);
            comparator(arr2);
            if (!isEqual(arr1, arr2)) {
                succeed = false;
                break;
            }
        }
        System.out.println(succeed ? "Nice" : "Bad");
        int[] arr = generateRandomArray(maxSize, maxValue);
        printArray(arr); //没排序打印
        bubbleSort(arr); //排序
        printArray(arr); //排序完打印,程序员自己观察是否正确
    }
复制代码

step6:对冒泡排序测试

public static void bubbleSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int end = arr.length-1; end > 0; end--) {
            for (int i = 0; i < end; i++) {
                if (arr[i] > arr[i+1]) {
                    swap(arr,i,i+1);
                }
            }
        }
    }
复制代码

完整的代码

public class ComparatorTest {
    //冒泡排序 方法a
    public static void bubbleSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int end = arr.length-1; end > 0; end--) {
            for (int i = 0; i < end; i++) {
                if (arr[i] > arr[i+1]) {
                    swap(arr,i,i+1);
                }
            }
        }
    }
    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];
    }
    //for test
    public static void comparator(int[] arr) {
        //方法b
        Arrays.sort(arr);
    }
    //for test
    //生成随机数组
    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++) {
            //值随机
            arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
        }
        return arr;
    }
    //for test
    //复制数组
    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) {
            return true;
        }
        if (arr1 == null || arr2 == null) {
            return false;
        }
        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();
    }
    //for test
    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);
            bubbleSort(arr1);
            comparator(arr2);
            if (!isEqual(arr1, arr2)) {
                succeed = false;
                break;
            }
        }
        System.out.println(succeed ? "Nice" : "Bad");
        int[] arr = generateRandomArray(maxSize, maxValue);
        printArray(arr); //没排序打印
        bubbleSort(arr); //排序
        printArray(arr); //排序完打印,程序员自己观察是否正确
    }
}



相关文章
【概率论基础】条件概率 | 乘法法则 | 事件的独立性
【概率论基础】条件概率 | 乘法法则 | 事件的独立性
100 0
【概率论基础】条件概率 | 乘法法则 | 事件的独立性
|
7月前
【视频】什么是非线性模型与R语言多项式回归、局部平滑样条、 广义相加GAM分析工资数据|数据分享(上)
【视频】什么是非线性模型与R语言多项式回归、局部平滑样条、 广义相加GAM分析工资数据|数据分享
|
4月前
|
机器学习/深度学习 数据处理 Python
深入理解双变量(二元)正态投影:理论基础、直观解释与应用实例
本文探讨了统计学与机器学习中的二元投影技术,它基于二元正态分布,用于预测一个变量在给定另一变量值时的期望值。文章分为三部分:首先介绍了二元正态投影的基本公式及其在回归中的应用;接着通过直观解释和模拟展示了不同相关性下变量间的关系;最后运用投影公式推导出线性回归的参数估计,并通过实例说明其在预测房屋价格等场景中的应用。附录中详细推导了二元线性投影的过程。二元投影作为一种强大工具,在数据分析中帮助简化复杂问题并揭示数据背后的规律。
59 1
深入理解双变量(二元)正态投影:理论基础、直观解释与应用实例
【概率论基础】Probability | 数学性概率 | 统计性概率 | 几何概率 | 概率论三大公理
【概率论基础】Probability | 数学性概率 | 统计性概率 | 几何概率 | 概率论三大公理
118 0
|
7月前
【视频】什么是非线性模型与R语言多项式回归、局部平滑样条、 广义相加GAM分析工资数据|数据分享(下)
【视频】什么是非线性模型与R语言多项式回归、局部平滑样条、 广义相加GAM分析工资数据|数据分享
|
机器学习/深度学习 自然语言处理 JavaScript
数学基础之——熵与散度的灵魂摆渡(解析大全)(一)
数学基础之——熵与散度的灵魂摆渡(解析大全)(一)
193 0
|
移动开发 JavaScript 算法
数学基础之——熵与散度的灵魂摆渡(解析大全)(二)
数学基础之——熵与散度的灵魂摆渡(解析大全)(二)
338 0
|
人工智能 开发者
回归方程求解小例子 | 学习笔记
快速学习回归方程求解小例子
回归方程求解小例子 | 学习笔记
|
机器学习/深度学习 小程序
实例复习机器学习数学 - 2. 几种典型离散随机变量分布
实例复习机器学习数学 - 2. 几种典型离散随机变量分布
实例复习机器学习数学 - 2. 几种典型离散随机变量分布
|
机器学习/深度学习
【组合数学】组合数学简介 ( 组合思想 3 : 上下界逼近 | 上下界逼近示例 Remsey 数 )
【组合数学】组合数学简介 ( 组合思想 3 : 上下界逼近 | 上下界逼近示例 Remsey 数 )
251 0
【组合数学】组合数学简介 ( 组合思想 3 : 上下界逼近 | 上下界逼近示例 Remsey 数 )