对数器使用——排序算法对数器模板
对数器:
相当与自己为自己的算法提供了一共测试,类似于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); }
学习的博客多用于在笔记中,防止笔记过于臃肿,所以将样例及运行结果放在博客中,后以超链接的形式记录在笔记中,所以有些博文过于单薄。如果有小伙伴遇到问题欢迎评论,看到就会回复,学渣一枚,加油努力。