Java对数器的使用
参考:https://blog.csdn.net/itcats_cn/article/details/81389063
0、有一个你想要测的方法A 1、实现一个绝对正确但是复杂度不好的方法B 2、实现一个随机样本产生器 3、实现比对的方法 4、把方法a和方法b比对很多次来验证方法a是否正确 5、如果有一个样本使得比对出错,打印样本分析是哪个方法出错 6、当样本数量很多时比对测试依然正确,可以确定方法a已经正确。
我这里使用的是选择排序跟Java提供的排序做对比:
import java.util.Arrays; /** * @author zhangzhixi * @version 1.0 * @date 2021-8-20 0:00 */ public class Demo { /*选择排序*/ private static void choiceSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { /*假设第一个数是擂主*/ int maxIndex = i; for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[maxIndex]) { /*擂主易主*/ maxIndex = j; } } /*擂主不是先前的,就交换*/ if (maxIndex != i) { swap(arr, i, maxIndex); } } } /** * 使用按位与运算进行交换数据 * * @param arr 数组 * @param i 数据 * @param 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]; } /** * 插入排序 * @param arr 数组数据 */ private static void insertSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int insertVal = arr[i + 1]; int index = i; while (index >= 0 && insertVal < arr[index]) { arr[index + 1] = arr[index]; index--; } arr[index + 1] = insertVal; } } /** * 定义一个绝对正确的比较器 * * @param arr 数组 */ public static void comparator(int[] arr) { Arrays.sort(arr); } /** * 实现一个随机样本产生器 * * @param maxSize 区间 * @param maxValue 区间 * @return 随机数组 */ public static int[] generateRandomArray(int maxSize, int maxValue) { //产生随机数范围为[0,maxSize] int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; for (int i = 0; i < arr.length; i++) { //产生[-maxValue,maxValue]的元素 arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); } return arr; } /** * 拷贝数组 * * @param arr 要进行拷贝的数组 * @return 拷贝后的数组 */ public static int[] copyArray(int[] arr) { if (arr == null) { return null; } int[] res = new int[arr.length]; /*使用System的这个拷贝,因为Arrays.copyOf底层也是使用的这个*/ System.arraycopy(arr, 0, res, 0, arr.length); return res; } /** * 实现比对的方法 * * @param arr1 数组1 * @param arr2 数组2 * @return 相同返回true,不同返回false */ 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; } /** * 如果有一个样本使得比对出错,打印样本分析是哪个方法出错 * * @param arr 出错的数组 */ public static void printArray(int[] arr) { if (arr == null) { return; } for (int j : arr) { System.out.print(j + " "); } System.out.println(); } public static void main(String[] args) { /*比较次数、最大区间、最小区间、是否比对成功*/ int testTime = 500000; int maxSize = 100; int maxValue = 100; boolean succeed = true; /*数组信息*/ int[] arr1 = null; int[] arr2 = null; for (int i = 0; i < testTime; i++) { /*产生随机数组,并进行拷贝*/ arr1 = generateRandomArray(maxSize, maxValue); arr2 = copyArray(arr1); /*对数组进行排序*/ choiceSort(arr1); comparator(arr2); /*不相等*/ if (!isEqual(arr1, arr2)) { succeed = false; printArray(arr1); printArray(arr2); break; } } System.out.println(succeed ? "比对成功!" : "比对失败!"); System.out.println("-----------成功比对后的数组---------------"); System.out.println(Arrays.toString(arr1)); System.out.println(Arrays.toString(arr2)); } }
测试结果: