90%程序员写不出无BUG的二分查找程序?

news/2024/11/9 12:14:56

  90%程序员写不出无BUG的二分查找程序?

相关文章链接如下:
  • 微软过桥问题与测试人员素养
  • 等价类分法 新解
  • 测试用例设计中的NP难题
  • 测试驱动需求分析--需求文档评审实例
  • C/C++代码检视实例
《编程珠玑》(第二版)一书第四章中提及过100多名专业程序员使用两个小时的充足时间编写一个简单的二分查找程序,结果发现90%的人编出的代码都有BUG,Knuth也在他的《Sorting and Searching》一书中提过,第一个二分查找程序在1946年已经公布,但是到了1962年才出现第一个没有BUG的二分查找程序,期间经历了16年的时间。那么为什么一个简单的二分查找程序会这么容易出错呢?看一看有序表的查找的测试用例设计也许能明白为什么。
要对有序表查找进行用例设计,我们可以先分析输入域,实际上有两个输入域,一个是要查找的数据,另外一个是有序表,可以先对有序表数据的个数进行分类,有序表中可能有0,1,2,3,…个数据。因此我们可以将目标数据分为以下几个类:
 
完成第1级分类后,我们可以再对数据的特点进行分类,因为有序表是一个有顺序的表,是有大小顺序的,因此可以根据数据特点再进行分类,以3个数据为例可以进行以下分类:
有序表有0、1、2、4个以上数据的情况都可以按照以上的类似的方式进行再分类。
当按有序表中分类好后,可以再按要查找的数据进行分类
当对查找的数据和有序表分别分好类后,就可以把这两种分类组合起来,比如将有序表有3个数据的分类情况和查找数据的分类情况组合起来就可以得到以下的分类:
 
组合完后,还需要将一些不可能或不需要的组合删除掉,比如在3个数据都相等的情况下,查找数据介于集合两个相邻数据之间的情况就不存在,需要删除掉这种情况,查找数据在有序表中的3种分类也由于集合中数据都相等而变成了一个分类,下图便是3个数据都相等情况下的一个分类:
这样7个最终分类减少到只有4个最终分类,查找数据为空的情况并不是所有情况下都需要测试的,其实只要测试有序表中有数据和没有数据两种情况就够了,因此查找数据为空的情况如果在其他情况中有了分类,那么也可以将其删去,这样3个数据都相等的情况就只有3个最终分类,如下图所示:
有序表有0个数据时可以所见成测试两种情况,一种是查找的数据为空,一种是查找的数据不为空。
有序表中有1个数据时的分类可以缩减成以下3种分类情况:
 
有序表中有2个数据的分类可以缩减成以下8种分类:
这样一来,即使不考虑4个以上数据以及3个数据在有两个数据相等情况下的分类,总共的最终分类也有20多种,每种分类至少需要设计一个测试用例,总共至少需要20多个测试用例,一个简单的二分查找的测试用例都至少需要20多个,看到这里大家也许会明白为什么90%的专业程序员写不出一个无BUG的二分查找程序来。
 




http://www.niftyadmin.cn/n/3657693.html

相关文章

pytorch 实现 GRL Gradient Reversal Layer

在GRL中,要实现的目标是:在前向传导的时候,运算结果不变化,在梯度传导的时候,传递给前面的叶子节点的梯度变为原来的相反方向。举个例子最好说明了: import torch from torch.autograd import Functionx…

多核编程中的负载平衡难题

多核编程中的负载平衡难题作者:周伟明相关文章链接:多核编程中的锁竞争难题 多核编程的几个难题及其应对策略(难题一) OpenMP并行程序设计(二) OpenMP并行程序设计(一) 双核CPU上的快…

对于pytorch中的detach copy 讲解很好的一篇博文

https://blog.csdn.net/guofei_fly/article/details/104486708

测试驱动需求分析--需求文档评审实例

相关文章链接如下:微软过桥问题与测试人员素养 等价类分法 新解 测试用例设计中的NP难题 C/C代码检视实例 90%程序员写不出无BUG的二分查找程序? 需求文档评审实例软件的开发文档质量一般只能通过评审来进行保证,如何有效发…

[Invariance Matters: Exemplar Memory for Domain Adaptive Person Re-identification 魔改代码

最近在看这篇文章,以及试着整改代码,按照最初的github设定,跑出来的性能和论文中是一样的,由于论文说了使用camstyle 后的生成图片,我就在想,如果不用这个部分会怎样,我就取消了使用这个数据&am…

使用radix sort 基排序对字符串进行排序

这部分的代码实现的操作是,对一个列表里面的字符串按照字母顺序排序,就像字典里面的单词排序一样,举例子如下: input [jkttsszzo, zie, iukddrjdba, bwjahzwiv, yslzvnjdjg, xkm, aszcnljjl, syniimbq, hqgyd, itvis]output [a…

模块分解原理的探索

模块分解原理的探索在软件高层设计中,如何分解模块是首要考虑的问题。目前业界公认模块划分要按照“高内聚,低耦合”的原则来进行,那么如何划分才能满足“高内聚,低耦合”呢?下面来对模块分解原理方面进行一些探索&…

利用radix sort 基排序对数字进行排序,指定基的基排序实现

基排序的概念就不做解释了,要说的一点是基排序中的这个基是可以任意选择的,只不过网上的大部分radix sort代码都是将10作为了基,我的这个代码是可以任意指定基的,代码如下: import random def numerical_radix_sort(n…