算法对数器

对数器

先说一个痛点,自己代码出bug的时候,由于没有具体的测试用例,或者说具体的测试用例不好代入代码中去,那么只好干蹬着代码,有时候眼睛蹬出血丝说不定也定位不到问题,这时候对数器就来了。
一.对数器的作用

我们可以自定义测试样本的容量,通过大量的样本来保证代码的正确性,也可以控制样本容量找出适合的测试用例,待入代码找出bug。

二.使用具体案例
1.就以排序数据举例吧,写好一个返回随机长度、随机值的方法
/**
	 * 返回一个arr,arr的长度[0,maxLen - 1];arr的值范围[0,maxValue - 1]
	 * @param maxLen
	 * @param maxValue
	 * @return
	 */
	public static int[] LenRondomValueRondom(int maxLen, int maxValue){
		 int len = (int)(Math.random() * maxLen);
		 int[] arr = new int[len];
		 for (int i = 0; i  < len; i++) {
			 arr[i] =  (int)(Math.random() * maxValue);
		 }
		
		return arr;
	}
2.找个选择排序的代码
/**
	 * 选择排序
	 * @param arr
	 */
	public static void selectSort(int [] arr) {
		if(arr == null || arr.length < 2) {
			return;
		}
		int N = arr.length;
		// 0 ~ n - 1
		for(int i = 0; i < N; i++) {
			int minValueIndex = i;
			for(int j = i+1; j < N;j++) {
				minValueIndex = arr[j] < arr[minValueIndex] ? j : minValueIndex;
			}
			swap(arr,i,minValueIndex);
		}
	}
	/**
	 * 交换两个数的值
	 * @param arr
	 * @param i
	 * @param j
	 */
	public static void swap(int [] arr, int i,int j) {
		int temp = arr[i];
		arr[i]  = arr[j];
		arr[j] = temp;
	}
3.进行主方法测试
 /**
	  * 备份数组
	  * @param arr
	  * @return
	  */
	 public static int[] copyArray(int [] arr) {
		 int [] ans = new int[arr.length];
		 for(int i = 0; i < arr.length; i++) {
			 ans[i] = arr[i];
		 }
		 return ans;
	 }
	 /**
	  * 判断是否有效
	  * @param arr
	  * @return
	  */
	 public static boolean isSorted(int [] arr) {
		 if(arr.length < 2) {
			 return true;
		 }
		int max = arr[0];
		 
	   for(int i = 1; i  < arr.length;i++) {
		   if(max > arr[i]) {
			   return false;
		   }
		   max = Math.max(max, arr[i]);
	   }
		 return true;
	 }
	
	 
	 
	
	public static void main(String[] args) {
		int maxLen = 50;
		int maxValue = 1000;
		int testTime = 10000; //设置测试次数
		for(int i = 0; i  < testTime; i++) {
			int[] arr1 = lenRandomValueRandom(maxLen, maxValue);//产生随机数组
			int[] temp = copyArray(arr1);  //留下数组备份,方便找出初始测试用例,因为排序后顺序乱了
			selectSort(arr1);   //测试选择排序
			if(!isSorted(arr1)) {//isSorted()为测试是否有序函数
				for(int j = 0; j  < temp.length;j++) {
					System.out.print(temp[j]+" ");
				}                         //打印备份数组
				System.out.println();
				System.out.println("选择排序错了");
				return;
			}
			
		}
		System.out.println("结束了");
		
		
	}

}

测试结果:

在这里插入图片描述

4.修改正确代码,缩小样本容量

修改如下:

public static void selectSort(int [] arr) {
		if(arr == null || arr.length < 2) {
			return;
		}
		int N = arr.length;
		// 0 ~ n - 1
		for(int i = 0; i < N; i++) {
			int minValueIndex = i;
			for(int j = i+1; j < N;j++) {
				minValueIndex = arr[j] >= arr[minValueIndex] ? j : minValueIndex;
			}
			swap(arr,i,minValueIndex);
		}
	}

在这里插入图片描述

将<改成>=,跑一下

在这里插入图片描述

得到错误的测试用例,短小精悍
参考视频:【【算法与数据结构入门篇】零基础5天快速入门算法,超详细的手绘图解思路+代码讲解】https://www.bilibili.com/video/BV1Zr4y1W7ww?p=16&vd_source=4f74ec47d55d3a418ba7440d219e1ed4

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值