对数器的概念和使用:因为我们在算法笔试的时候不能总是依赖在线调试,所以我们需要自己实现这一功能来保证自己写的算法正确性。
- 有一个你想要测得方法a
- 有一个复杂度不好但好实现的方法b,如果可以的话可以调用系统的功能
- 实现一个随机样本产生器
- 方法a和方法b跑相同的随机样本,比较结果是否一样
- 如果有不一样的地方,打印样本进行人为干预,改对方法a或者方法b
- 当样本数量很多时它们的结果依然正确,可以确定方法a已经正确
下面进行一个举例帮助理解:
判断自己写的插入排序是否正确:
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTime; i++){
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
insertionSort(arr1);
comparator(arr2);
if(!isEqual(arr1, arr2)){
succeed = false;
System.out.println("插入排序");
printArray(arr1);
System.out.println("系统排序");
printArray(arr2);
break;
}
}
System.out.println(succeed);
}
public static void insertionSort(int[] arr) {
if(arr == null || arr.length < 2){
return;
}
for (int i = 1; i < arr.length; i++){
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--){
swap(arr, j, j + 1);
}
}
}
public static void swap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
//对数器
public static void comparator(int[] arr){
Arrays.sort(arr);
}
//产生随机数组
//Math.random() 指的是[0,1)所有的小数,等概率返回一个
//(int)(Math.random() * N) 指的是[0,N-1]中所有的整数等概率返回一个
public static int[] generateRandomArray(int maxSize,int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for(int i = 0; i < arr.length; i++){
//maxValue + 1才可以保证取到我们设置的最大值
arr[i] = (int)((maxValue + 1) * Math.random()) - (int)(maxValue * 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 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++){
//print保证打印到一行上
System.out.print(arr[i] + " ");
}
System.out.println();
}