【编程总结】对数器的概念和使用(java实现)
步骤
①:有一个你想要测的方法a。
②:实现一个绝对正确但是时间复杂度不好的方法b。
③:实现一个随机样本产生器。
④:实现比对的方法。
⑤:把方法a和方法b比对很多次来验证方法a是否正确。
⑥:如果有一个样本使得比对出错,打印样本分析是哪个方法出错。
⑦:当样本数量很多时比对测试依然正确,可以确定方法a已经正确。
排序测试
package sort;
import java.util.Arrays;
public class GenerateRandomArray {
public static void main(String[] args){
int testTime=500000;
int size=10;
int value=100;
boolean success=true;
for(int i=0;i<testTime;i++){
int[] arr1=generateRandomArray(size,value);
int[] arr2=copyArray(arr1);
int[] arr3=copyArray(arr1);
rightMethod(arr2);
insertionSort(arr1);
if(!isEqual(arr1,arr2)){
success=false;
printArray(arr3);
break;
}
}
System.out.println(success?"Nice!":"Fucking fucked!");
}
/**
* 插入排序
* @param arr 传入的待排序数组
*/
public static void insertionSort(int[] arr){
int len=arr.length;
if(len<=1)return;
for(int i=1;i<len;i++) {
for(int j=i-1;j>=0&&arr[j]>arr[j+1];j--){
swap(arr,j,j+1);
}
}
}
/**
* 数组元素的交换
* @param arr 待交换数组
* @param i 第一个位置
* @param j 第二个位置
*/
private static void swap(int[] arr,int i,int j){
int tem=arr[i];
arr[i]=arr[j];
arr[j]=tem;
}
/**
* 随机数组发生器
* @param size 最大数组长度
* @param value 数组中的值
* @return 返回数组
*/
public static int[] generateRandomArray(int size,int value){
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;
}
/**
* 绝对正确的数组
* @param arr 传入需要排序的数组
*/
public static void rightMethod(int[] arr){
Arrays.sort(arr);
}
/**数组复制函数
* @param arr 待复制数组
* @return 新复制数组
*/
public static int[] copyArray(int[] arr){
if(arr==null)
return null;
int[] tem=new int[arr.length];
for(int i=0;i<arr.length;i++){
tem[i]=arr[i];
}
return tem;
}
/**
* 打印数组函数
* @param arr 待打印数组
*/
public static void printArray(int[] arr){
if(arr==null||arr.length<=0)
return;
for(int i=0,len=arr.length;i<len;i++){
System.out.println(arr[i]);
}
}
/**
* 判断两个数组的值是否相同
* @param arr1 第一个数组
* @param arr2 第二个数组
* @return 是否相同的结果
*/
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,len=arr1.length;i<len;i++){
if(arr1[i]!=arr2[i])
return false;
}
return true;
}
}