对数器定义和示例

对数器就是让你能不依赖线上测试的情况下,写对代码。

写对数器前,首先写好当前算法,然后按照一下步骤:

  1. 随机生成测试案例
  2. 开发出一种绝对正确的算法(实在不好想也可以无)
  3. 两种算法对比结果(没有两种算法,就采取验证开发算法结构的方式)

随机测试案例:

/**
     * 随机生成平衡二叉树
     * @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");

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值