搞懂对数器,这篇文章就够了!
1. 对数器
1.1 what is the 对数器?
当你写了一个程序,但你不知道写得对不对并且没有一个完全能够验证正确性的平台时,你就需要对数器帮助你去验证你写得对不对。也就是说,对数器是用来验证程序算法的正确性的。
1.2 对数器原理
首先,假设你有一个不知道正不正确的方法1,同时有一个一定正确但是算法效率并不是很高的方法2,接着利用随机生成数函数,生成n次随机数用来验证方法1和方法2的结果是否一致。如果有一个样本的结果不一致,我们就可以打印报错去查看;如果多次验证的结果都一直,我们就可以认为方法1是正确的,从而判断程序的正确性。
1.3 示例代码及说明
以选择排序为例,实现对数器方法代码如下:
import java.util.Arrays;
public class selectionSort {
//方法1
public static void SelectionSort(int[] arr) {
if(arr==null || arr.length <2) { //假设数组为空或者数组中只有一个数,直接返回
return;
}
// 0 ~ N-1 找到最小值,在哪,放到0位置上
// 1 ~ n-1 找到最小值,在哪,放到1 位置上
// 2 ~ n-1 找到最小值,在哪,放到2 位置上
for(int i=0;i<arr.length-1;i++) { //从下标为0的位置开始
int minIndex=i;
for(int j=i+1;j<arr.length;j++) { //与数组中其他的数依次对比
minIndex =arr[j]<arr[minIndex] ? j:minIndex;
}
swap(arr,i,minIndex);
}
}
public static void swap(int[] arr,int i,int j) {
//交换函数
int b;
b= arr[i];
arr[i]=arr[j];
arr[j]=b;
}
//方法2
public static void comparator(int[] arr) {
Arrays.sort(arr);
}
//生成随机数数组
public static int[] generateRandomArray(int maxSize,int maxValue) {
// Math.random() [0,1)
// Math.random() * N [0,N)
// (int)(Math.random() * N) [0, N-1]
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;
}
//复制数组
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[] arr= {1,6,8,2};
// System.out.println(Arrays.toString(arr));//打印排序前的数组
// SelectionSort(arr);
// System.out.print(Arrays.toString(arr)); //打印排序后的数组
int testTime = 500000;//测试次数
int maxSize = 50;//最大测试容量
int maxValue = 50 ;//最大测试数据
boolean succeed =true;
for(int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize,maxValue);
int[] arr2 = copyArray(arr1);
//这两个数组除了数值相同内存地址完全没关系,数值是一样的
SelectionSort(arr1); //用方法1排序,也就是不确定正确性的方法
comparator(arr2);//用java.util.Arrays包的排序算法排序
if(!isEqual(arr1,arr2)) {//比较是否相同
succeed = false;
printArray(arr1);
printArray(arr2);
break;
}
}
if(succeed == true) {
System.out.println("恭喜你!!!没问题。");
}else {
System.out.println("噢出错啦……");
}
int[] arr =generateRandomArray(maxSize,maxValue);
printArray(arr);
SelectionSort(arr);
printArray(arr);
}
}
相关文章: