为什么要使用对数器
比如,自己手写了一个冒泡排序,怎么测试自己写的排序算法是否正确呢,就要去试各种数据,各种情况,但是我们并不是能够照顾到每一种情况,也可以依赖OJ但是并不一定能找到自己想要测试的方法,此时就需要对数器来检验方法是否正确
对数器的概念和使用
0,有一个你想要测的方法a,
1,实现一个绝对正确但是复杂度不好的方法b,
2,实现一个随机样本产生器
3,实现比对的方法
4,把方法a和方法b比对很多次来验证方法a是否正确。
5,如果有一个样本使得比对出错,打印样本分析是哪个方法出
错
6,当样本数量很多时比对测试依然正确,可以确定方法a已经
正确
以冒泡排序为例
对数器的思路就是随机生成一个长度随机,各个元素的值也随机的数组,也就是随机样本产生器,然后将该数组复制给另一个数组,然后一个数组采用绝对正确方法的排序,另一个数组采用自己手写的方法排序,比较两个数组的内容是否相等,将以上步骤放入到循环中,设置N多次的比对,就可验证该方法是否正确,即使方法不对,通过出错的样本也能分析出错误的地方,进而改对
对数器源码实现测试案例
package basic_01;
import java.util.*;
public class BubbleSort {
//冒泡排序
public static void bubbleSort(int arr[]){
if(arr == null || arr.length < 2){
return ;
}
int temp;
for(int i = 0; i < arr.length - 1; i++){
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
//对数器的实现
//实现一个随机样本产生器
public static int[] generateRandomArray(int maxSize,int maxValue) {
int[] res = new int[(int)((maxSize + 1) * Math.random())];
for (int i = 0; i < res.length; i++) {
res[i] = (int)((maxValue + 1) * Math.random()) - (int)((maxValue) * Math.random());
}
return res;
}
//复制数组
public static int[] copyArray(int arr[]) {
if(arr == null)
return null;
int[] copy = new int[arr.length];
for(int i = 0; i < arr.length; i++){
copy[i] = arr[i];
}
return copy;
}
//判断两个数组各自排序后是否相同
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 = 10; //生成数组的长度在0 - 10之间
int value = 100; //产生的随机值在-100到+100之间
boolean succed = true;
for(int i = 0; i <testTime; i++){
int[] arr1 = generateRandomArray(size, value);
int[] arr2 = copyArray(arr1); //将生成的随机长度和随机内容的数组复制给arr2
bubbleSort(arr1); //通过冒泡排序
Arrays.sort(arr2); //通过Arrays的sort方法排序
if(!isEqual(arr1,arr2)){
succed = false;
printArray(arr1);//如果测试方法出错,则输出错误的case
printArray(arr2);
break;
}
}
System.out.println(succed ? "Nice!":"Fucke!");
int[] arr = generateRandomArray(size, value);
printArray(arr);
bubbleSort(arr);
printArray(arr);
}
}