1.对数器是干嘛的?
当你写一个方法在少量数据上可行时,但不知道在大量数据测试中是否可行,可以通过对数器证明。
2.如何实现对数器?
- 首先要写一个或者找一个能够实现同样功能的绝对正确的方法,该方法可以不必有多高效,但一定要正确。
- 要随机产生样本数据
- 将随机产生的数据在两种方法上运行并进行比较
以排序方法的对数器为例,假设我写了个冒泡排序,但我并不知道在大量数据上是否可行时,我就可以写一个对数器。
首先放个冒泡排序代码:
public class BubbleSort{
public static void bubbleSort(int [] a){
/*
* 如果是从小到大按排序的话,每两个相邻的数比一下,
* 比完一轮后把最大的数沉底,小一点的数往前移,是
* 谓冒泡。
*/
for(int i = 0;i<a.length-1;i++){//a.length-1是要比的轮数
for(int k = 0;k<a.length-i-1;k++){//a.length-i-1是每一轮要比的次数。
if(a[k]>a[k+1]){
int temp=0;
temp = a[k];
a[k] = a[k+1];
a[k+1] = temp;
}
}
对数器代码:
package textbookcode;
import java.util.Arrays;
import java.util.Random;
/**
* @author hpc
* @Date:2018-9-23下午5:05:51
* 功能:实现数组排序的对数器
*/
public class duishuqi_sort {
public static void main(String[] args) {
int testtime = 5000000;//测试5000000组数据
int length = 10;//数组长度在10以内不等
int value = 100;
boolean success = true;
for(int i = 1;i<=testtime;i++){
int[] a = randomArrays(length,value);
int[] b = arrayCopy(a);
int[] c = arrayCopy(a);
rightMethod(a);
BubbleSort.bubbleSort(b);
if(!isEqual(a,b)){
success = false;
System.out.println("原数组:");
print(c);
System.out.println("正确排序: ");
print(a);
System.out.println("错误排序:");
print(b);
break;
}
}
System.out.println(success);
}
//首先提供一个绝对正确的方法,使用java提供的
public static void rightMethod(int arr[]){
Arrays.sort(arr);
}
//其次,随机生成数组,长度在0~length之间
public static int[] randomArrays(int length,int value){
int [] a = new int[(int) ((length+1)*Math.random())];
for(int i = 0;i<a.length;i++){
a[i] = (int) ((int)value*Math.random());
}
return a;
}
//写一个两个数组之间比较的方法
public static boolean isEqual(int x[],int y[]){
if(x.length!=y.length)
return false;
if((x==null&&y!=null)||(x!=null&&y==null))
return false;
if(x==null&&y==null)
return true;
for(int i = 0;i < x.length;i++){
if(x[i]!=y[i])
return false;
}
return true;
}
//因为当一个方法调用后数组就改变了,所以要提前备份,所以写一个复制方法
public static int[] arrayCopy(int[] x){
int[] a = new int[x.length];
for(int i = 0;i < x.length;i++){
a[i]=x[i];
}
return a;
}
//打印一个数组的方法
public static void print(int a[]){
for(int i = 0;i < a.length;i++){
System.out.print(a[i]+" ");
if(i==a.length-1)System.out.println();
}
}
}
结果:
true
假设我的排序算法有误,比如
public static void bubbleSort(int [] a){
/*
* 如果是从小到大按排序的话,每两个相邻的数比一下,
* 比完一轮后把最大的数沉底,小一点的数往前移,是
* 谓冒泡。
*/
for(int i = 0;i<a.length-1;i++){//a.length-1是要比的轮数
for(int k = 0;k<a.length-i-1;k++){//a.length-i-1是每一轮要比的次数。
if(a[k]>a[k+1]){
int temp=0;
temp = a[k];
a[k] = a[k+1];
a[k+1] = temp;
a[k+1] = 0;//加一句能够导致错误的代码
}
结果如下: