what 、why、how 对数器

文章介绍了对数器的概念和原理,它用于验证程序算法的正确性。通过对比选择排序的自定义实现和已知正确的`Arrays.sort`方法,使用随机生成的数组进行多次测试,来判断自定义排序算法是否正确。如果多次验证结果一致,则认为自定义方法正确。文章还提供了生成随机数组、复制数组、比较数组相等等相关辅助方法的代码示例。
摘要由CSDN通过智能技术生成

搞懂对数器,这篇文章就够了!

目录

1. 对数器

1.1 what is the 对数器?

1.2 对数器原理

1.3 示例代码及说明


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);
	}
}



相关文章:

简单排序:简单排序——选择排序、冒泡排序、插入排序 - 掘金 (juejin.cn)

作者:ee在努力
链接:https://juejin.cn/post/7236635191380787260
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值