算法进阶(二)——对数器

本文介绍了如何设计一个对数器来验证算法的正确性。通过对数器,我们可以生成大量测试数据,使用已知正确但效率低的方法与自定义算法进行对比,通过大量对比确保算法实现无误。文章详细阐述了设计对数器的七个步骤,并提供了具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、设计对数器

1、有一个你想要测试的方法a

2、实现一个绝对正确但是复杂度不好的方法b

3、实现一个随机样本产生器

4、实现比对方法

5、把绝对正确的方法和我们自己实现的方法对比多次来验证方法是否正确

6、如果有一个样本使得对比出错,那么打印样本,分析是哪个方法出错

7、当样本数量很多对比结果仍然正确,那么可以确定方法已经正确了


对于某一个问题,我们设计了一个算法的实现方式,如果直接提交测试,那么可能会因为某些条件不满足而导致code失败,那么我们考虑是否可以设计一个程序,用于生成大量的测试数据,通过大量测试数据来检验我们设计的算法是否正确。

而这一个过程,其实就是对数器,即设计一个程序,来对我们的程序进行数据检验

一、设计对数器

1、有一个你想要测试的方法a

例如,我们实现一个冒泡排序的方法

2、实现一个绝对正确但是复杂度不好的方法b

例如,我们使用O(N^2)的遍历方式实现一个排序算法

3、实现一个随机样本产生器

主要用于产生对应的数据样本,用于大量测试

例如:

      /**
         * 产生随机长度的数组
         */
        @JvmStatic
        fun generateRandomArray(size: Int, value: Int): IntArray {
            // 长度随机
            val randomArray = IntArray(((size + 1) * Math.random()).toInt())
            for (i in randomArray.indices) {
                randomArray[i] = ((((value + 1) * Math.random()).toInt()) - (value * Math.random())).toInt()
            }
            return randomArray
        }

4、实现比对方法

通过比较方法,我们可以比较绝对正确的方法得到的结果与我们实现算法的结果是否正确

例如:

     /**
         * 判断两个数组是否相等
         */
        @JvmStatic
        fun isArrayEquals(a: IntArray, b: IntArray): Boolean {
            var isEquals = true
            if (a.size != b.size) {
                return false
            }

            a.forEachIndexed { index, i ->
                if (b[index] != i) {
                    isEquals = false
                    return@forEachIndexed
                }
            }
            return isEquals
        }

5、把绝对正确的方法和我们自己实现的方法对比多次来验证方法是否正确

6、如果有一个样本使得对比出错,那么打印样本,分析是哪个方法出错

7、当样本数量很多对比结果仍然正确,那么可以确定方法已经正确了

代码如下:

  // 测试次数
    val testTime = 50000
    // 数组大小
    val size = 10
    val value = 100
    // 结果是否成功
    var isSucceed = true
    for (i in 0 until testTime) {
        val array1 = GenerateRandomArray.generateRandomArray(size, value)
//        println("产生的随机数组为:")
//        BigNumberTest.printlnArray(array1)
        val array2 = BigNumberTest.copyArray(array1)
        val array3 = BigNumberTest.copyArray(array1)
        // 执行我们优化的方法处理arr1
        BubbleSort.bubbleSort(array1)
        // 执行一定正确的方法处理arr2
        Arrays.sort(array2)
        if (!BigNumberTest.isArrayEquals(array1, array2)) {
            isSucceed = false
            println("打印发生错误时的原随机数组:")
            BigNumberTest.printlnArray(array3)
            println("打印发生错误时一定正确的数组结果")
            BigNumberTest.printlnArray(array2)
            println("打印发生错误时错误数组结果")
            BigNumberTest.printlnArray(array1)
            break
        }
    }

    println(if (isSucceed) "Nice!!" else "Fucking fucked")

博客园地址:算法进阶(二)——对数器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值