Java对数器的使用
参考:https://blog.csdn.net/itcats_cn/article/details/81389063
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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)); } }
测试结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话