作用分析
对数器是验证一个算法是否正确的一个手段,在分析自己设计的代码时间复杂度和空间复杂度等等都已经达到了要求,但是 ,怎么验证自己设计的算法一定是正确的? 正确的思路是使用一个时间空间复杂度比较低,性能比较差,但是算法绝对正确解决问题的另一个算法,和设计的算法通过的数据,一对一的进行比较。看最终测试的数据结果是否为一致的 ?
如果是一致 ,你自己设计的算法已经成功。
基本概念
- 有一个你想测试的算法a
- 实现一个绝对正确但复杂度高的算法b
- 实现一个随机样本产生器(测试数据)
- 实现比对算法a和b的方法
- 多次(100000+)比对a和b来验证a是否正确
测试数据通过时,算法a,算法b结果不一致 ,输出。并分析实验结果,排除问题所在,改进算法。
算法a , 算法b通过的数据都相同时,判断算法a正确。
注意点
1.算法a是时间复杂度比较低,但不确定是否正确的算法,算法b唯一要求是保证算法的正确性。
2. 待测样本个数尽量的多,每个样本的样本量不必太大(为了便于分析)。
案例示例
1.假设待测算法a为 BubbleSort
public static void BubbleSort(int[] arr){
if( arr.length < 2 || arr == null){
return;
}
for(int i = arr.length - 1 ; i > 0 ; i--){
for(int j = 0 ; j < i ; j ++){
if(arr[j + 1] < arr[j ]){
swap(arr, j + 1 ,j);
}
}
}
}
public static void swap(int[] arr , int i , int j){
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
2.绝对正确的算法b为 jdk的Arrays.sort()
3.样本数量产生器:
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++) {
arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
}
return arr;
}
4.实现对比两个算法的方法
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 main(String[] args) {
int testTime = 1000000; // test times
int maxSize = 50;
int maxValue = 200;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
BubbleSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
break;
}
}
System.out.println(succeed ? "算法通过 " : "算法不通过");
int[] arr = generateRandomArray(maxSize, maxValue);
printArray(arr);
BubbleSort(arr);
printArray(arr);
}
总结
对数器在工程和算法竞赛,或者是参加工作时的算法面试用以作为算法正确性的验证非常的