二分查找

来源:互联网 发布:钉钉管理员能看到数据 编辑:程序博客网 时间:2024/06/07 07:08

       二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

       基本原理:一个工人要维修一条 10km 长的电话线,首先他 需要定位出故障所在,如果沿着线路一小段一小段地查找,显然非常得困难,每查一个点都要爬一次电线杆,10km 长 的距离会有大约 200 多根电线杆。假设电线两端分别为 A、B,这时他会很自然地首先从中间的C 开始查起,用话机 向两端测试时,发现 AC 段正常,故而断定故障在 BC 段, 再到 BC段的中点 D,如果发现 BD 段正常,则故障在 CD 段,然后再到 CD 的中间点 E 查找,这样每查一次,就可以把待查线路的 长度缩减一半,因而经过 7 次查找,就可以将故障发生的范围缩小到 50~100m 左右, 即在一两根电线杆附近。如此一来要 节省很多的精力与时间。这是二分查找法在生活中的一个典型应用,实际上,查 找内核的 bug 与查找电话线的故障相比,本质上都是相同的,并没有高深到哪里去,都是首先要定位出 故障的位置,然后去解决它。比如你在使用某个版本的内核时,发现了一个内核 bug, 这时你需要知道它究竟是在应用哪个补丁时被引入的,如果一个一个的去还原那些补丁,每还原一个补丁就要测试一次内核,那么必然会浪费过多的时间,而应用二分查找法,首先确定一个肯定没有出现该 bug 的内核版本,然后去测试位于这两个版本中间的那个版 本,这样重复筛选,就能够很容易的定位出是从哪个版本开始出现了这个 bug。

      如果一个非循环单链表,长度未知,要找到中间那个结点的方法:采用两个指针p1、p2都指向头结点,p1每次跳一步,p2每次跳两步,当p2指向NULL时,p1指向的那个结点即为中间那个结点。







0 0