java实现二分查找思路
算法是由静态方法rank() 实现的,它接受一个整数键和一个已经有序的int 数组作为参数。如果该键存在于数组中则返回它的索引,否则返回-1。
算法使用两个变量lo 和hi,并保证如果键在数组中则它一定在a[lo..hi] 中,然后方法进入一个循环,不断将数组的中间键(索引为mid)和被查找的键比较。
如果被查找的键等于a[mid],返回mid;否则算法就将查找范围缩小一半,如果被查找的键小于a[mid] 就继续在左半边查找,如果被查找的键大于a[mid] 就继续在右半边查找。
算法找到被查找的键或是查找范围为空时该过程结束。
二分查找之所以快是因为它只需检查很少几个条目(相对于数组的大小)就能够找到目标元素(或者确认目标元素不存在)。
在有序数组中进行二分查找的示例如图所示。

计算机用rank() 方法的暴力实现处理大量输入(比如含有100 万个条目的白名单和1000 万条交易)非常慢。没有如二分查找或者归并排序这样的高效算法,解决大规模的白名单问题是不可能的。良好的性能常常是极为重要的。
测试用例通过模拟实际情况来展示当前算法的必要性。这里该过程被称为白名单过滤。具体来说,可以想象一家信用卡公司,它需要检查客户的交易账号是否有效。为此,它需要:
将客户的账号保存在一个文件中,我们称它为白名单;
从标准输入中得到每笔交易的账号;
使用这个测试用例在标准输出中打印所有与任何客户无关的账号,公司很可能拒绝此类交易。
在一家有上百万客户的大公司中,需要处理数百万甚至更多的交易都是很正常的。
数据抽象的主要思想是鼓励程序定义自己的数据类型(一系列值和对这些值的操作),而不仅仅是那些操作预定义的数据类型的静态方法。
数据抽象允许通过模块化编程复用代码。排序算法和二分查找以及其他算法,都允许调用者用同一段代码处理任意类型的数据(而不仅限于整数),包括调用者自定义的数据类型。
数据抽象使我们可以轻易构造多种所谓的链式数据结构,它们比数组更灵活,在许多情况下都是高效算法的基础。
借助数据抽象,我们可以准确地定义所面对的算法问题。比如union-find 算法、队列算法和符号表算法,它们解决问题的方式都是定义数据结构并高效地实现它们的一组操作。这些问题都能够用数据抽象很好地解决。

浙公网安备 33010602011771号