对数器
1. 对数器概念和使用
(1)有一个你想要的测的方法a
(2)实现一个绝对正确但是复杂度不好的方法b
(3)实现对比的方法
(4)把方法a和方法b对比很多次来验证方法a是否是正确的
(5)如果有个样本使得对比出错,打印出样本分析是哪个方法出错的
(6)当样本数量很多的时候,对比测试依然正确,可以确定方法a已经正确
2.在笔试的时候要准备模板,二叉树的随机样本发生器,数组的随机样本发生器,在上笔试之前要准备一个随机样本发生器和一个对数器,当你出错网站不弹出出错报告的时候,可以比别人快,准备一个模板上考场要快。
下面是对数器的模型展示:
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); BubbleSort.bubbleSort(arr1); rightMethod(arr2); if(!isEqual(arr1,arr2)){ succeed=false; printArray(arr3); break; } } } //产生一个随机数组,数组的长度和值都是随机的, public static int[] generateRandomArray(int size,int value){ //在java中,Math.random() ->double(0,1) //(int)((size+1)*Math.random())--->产生的是[0,size]之间的整数 //生成长度随机的数组,数组的最大长度是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; } //复制数组 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 void rightMethod(int[] arr){ Arrays.sort(arr); } // 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.println(arr[i]+" "); } System.out.println(); }