对数器的概念
对数器主要用于在没有OJ或OJ不提示出错的测试用例时测试自己写的方法是否正确并找出出错的测试用例。
0、 有一个你想要测的方法a
1、 实现一个绝对正确但是复杂度不好的方法b
2、 实现一个随机样本产生器
3、 实现比对的方法
4、 把方法a和方法b比对很多次来验证方法a是否正确
5、 如果有一个样本使得比对出错, 打印样本分析是哪个方法出错
6、当样本数量很多时比对测试依然正确, 可以确定方法a已经
正确
对数器的实现
下面以数组对数器为例,并用于验证冒泡排序
0、想要测的方法a 冒泡排序
public static void bobbleSort(int[] arr){
if(arr==null || arr.length<2){
return;
}
for(int i=arr.length-1;i>0;i--){
for(int j=0;j<i;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
}
}
}
}
public static void swap(int[] arr,int x,int y){
int temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
1、 实现一个绝对正确但是复杂度不好的方法b
这里使用系统提供的排序方法
//一个绝对正确的方法
public static void rightMathod(int[] arr){
Arrays.sort(arr);
}
2、 实现一个随机样本产生器
这里是数组,还有二叉树的随机发生器等
//随机数组发生器
public static int[] generateRandomArray(int size,int value){
//生成长度随机的数组(最大长度size)
int[] arr=new int[(int)((size+1)*Math.random())];
for(int i=0;i<arr.length;i++){
//两个随机数相减,产生的随机数可能正也可能负
arr[i]=(int)((value+1)*Math.random()-(int)(value*Math.random()));
}
return arr;
}
3、 把方法a和方法b比对很多次来验证方法a是否正确
//会用到的 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;
}
//会用到的 判断数组是否相等
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;
int value = 100;
boolean succeed = true;
for (int i=0;i<testTime;i++){
int[] arr1=generateRandomArray(size,value);
int[] arr2=copyArray(arr1);
int[] arr3=copyArray(arr1);
bobbleSort(arr1);
rightMathod(arr2);
if(!isEqual(arr1,arr2)){
succeed=false;
printArray(arr3);
break;
}
}
System.out.println(succeed ? "Nice!" : "Fucking fucked!");
}
进行多次测试,如果有一个样本使得比对出错, 打印样本分析是哪个方法出错 。当样本数量很多时比对测试依然正确, 可以确定方法a已经
正确