算法进阶(二)——对数器
对于某一个算法问题,我们设计了一个算法的实现方式,如果直接提交测试,那么可能会因为某些条件不满足而导致code失败,那么我们考虑是否可以设计一个程序,用于生成大量的测试数据,通过大量测试数据来检验我们设计的算法是否正确。
而这一个过程,其实就是对数器,即设计一个程序,来对我们的程序进行数据检验
一、设计对数器
1、有一个你想要测试的方法a
例如,我们实现一个冒泡排序的方法
2、实现一个绝对正确但是复杂度不好的方法b
例如,我们使用O(N^2)的遍历方式实现一个排序算法
3、实现一个随机样本产生器
主要用于产生对应的数据样本,用于大量测试
例如:
1 /** 2 * 产生随机长度的数组 3 */ 4 @JvmStatic 5 fun generateRandomArray(size: Int, value: Int): IntArray { 6 // 长度随机 7 val randomArray = IntArray(((size + 1) * Math.random()).toInt()) 8 for (i in randomArray.indices) { 9 randomArray[i] = ((((value + 1) * Math.random()).toInt()) - (value * Math.random())).toInt() 10 } 11 return randomArray 12 }
4、实现比对方法
通过比较方法,我们可以比较绝对正确的方法得到的结果与我们实现算法的结果是否正确
例如:
1 /** 2 * 判断两个数组是否相等 3 */ 4 @JvmStatic 5 fun isArrayEquals(a: IntArray, b: IntArray): Boolean { 6 var isEquals = true 7 if (a.size != b.size) { 8 return false 9 } 10 11 a.forEachIndexed { index, i -> 12 if (b[index] != i) { 13 isEquals = false 14 return@forEachIndexed 15 } 16 } 17 return isEquals 18 }
5、把绝对正确的方法和我们自己实现的方法对比多次来验证方法是否正确
6、如果有一个样本使得对比出错,那么打印样本,分析是哪个方法出错
7、当样本数量很多对比结果仍然正确,那么可以确定方法已经正确了
代码如下:
1 // 测试次数 2 val testTime = 50000 3 // 数组大小 4 val size = 10 5 val value = 100 6 // 结果是否成功 7 var isSucceed = true 8 for (i in 0 until testTime) { 9 val array1 = GenerateRandomArray.generateRandomArray(size, value) 10 // println("产生的随机数组为:") 11 // BigNumberTest.printlnArray(array1) 12 val array2 = BigNumberTest.copyArray(array1) 13 val array3 = BigNumberTest.copyArray(array1) 14 // 执行我们优化的方法处理arr1 15 BubbleSort.bubbleSort(array1) 16 // 执行一定正确的方法处理arr2 17 Arrays.sort(array2) 18 if (!BigNumberTest.isArrayEquals(array1, array2)) { 19 isSucceed = false 20 println("打印发生错误时的原随机数组:") 21 BigNumberTest.printlnArray(array3) 22 println("打印发生错误时一定正确的数组结果") 23 BigNumberTest.printlnArray(array2) 24 println("打印发生错误时错误数组结果") 25 BigNumberTest.printlnArray(array1) 26 break 27 } 28 } 29 30 println(if (isSucceed) "Nice!!" else "Fucking fucked")
每天进步一点点