对数器就是让你能不依赖线上测试的情况下,写对代码。
写对数器前,首先写好当前算法,然后按照一下步骤:
- 随机生成测试案例
- 开发出一种绝对正确的算法(实在不好想也可以无)
- 两种算法对比结果(没有两种算法,就采取验证开发算法结构的方式)
随机测试案例:
/**
* 随机生成平衡二叉树
* @param maxSize 最大结点树
* @param maxValue 结点最大值(不含)
* @return 树的根结点
*/
public static TreeNode<Integer> generateBalanceIntValueTree(int maxSize, int maxValue) {
Random random = new Random();
int size = random.nextInt(maxSize); // tree 的节点树
if (size == 0) {
return null;
}
int NodeValue = random.nextInt(maxValue);
TreeNode<Integer> root = new TreeNode<>(NodeValue);
size--;
/* 模拟栈结构 */
int index = 0;
TreeNode[] stack = new TreeNode[maxSize];
stack[index++] = root;
while (size > -1) {
TreeNode node = stack[--index];
node.left = new TreeNode<>(random.nextInt(maxValue));
stack[index++] = node.left;
size -- ;
if (size < 0) {
break;
}
node.right = new TreeNode<>(random.nextInt(maxValue));
stack[index++] = node.right;
size -- ;
}
return root;
}
两种实现算法参考链接:https://blog.csdn.net/u011471105/article/details/119569380
验证代码:
int testTimes = 10000000;
int maxSize = 100;
int maxValue = 10000;
for (int i = 0; i < testTimes; i++) {
TreeNode<Integer> root = generateBalanceIntValueTree(maxSize, maxValue);
if (isBinarySearchTree(root) ^ isBinarySearchTreeV2(root)) {
System.out.println(levelOrderBottom(root));
System.out.println("bad");
break;
}
}
System.out.println("nice");
第二类对数器,只实现了一种算法,采取了结果验证的方式。如下,首先随机生成测试案例:
/**
* 产生随机长度随机内容的数组
* @param maxLen 数组的最大程度
* @param maxValue 数组中每个值的最大值
*/
public static int[] lenRandomAndValueRandom(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;
}
排序算法参考连接:https://blog.csdn.net/caobaoyindedipan/article/details/119617510
验证算法:
/**
* 验证数组是升序的
*/
public static boolean isSort(int[] arr) {
if (arr == null) return false;
int length = arr.length;
if (length < 2) return true;
for (int i = 1; i < length; i++) {
if (arr[i] < arr[i-1]) return false;
}
return true;
}
测试:
int maxValue = 100; // 数组最大值
int maxLen = 100; // 数组最大长度
int testTimes = 1000000;// 测试次数
for (int i = 0; i < testTimes; i++) {
int[] array = Class2.lenRandomAndValueRandom(maxLen, maxValue);
mergeSortV2(array);
if (!Class1.isSort(array)) {
Class1.show(array);
System.out.println("bad");
break;
}
}
System.out.println("nice");