二进制搜索终止条件

时间:2016-02-07 17:08:30

标签: algorithm binary-search

每当我迭代地执行二进制搜索时,我总是对使用while (low < high)还是while(low <= high)感到困惑。

虽然两者都有效但有人能告诉我一个人的实际优势是什么?

2 个答案:

答案 0 :(得分:4)

通常会使用您列出的两个终止条件,具体取决于低和高是包含还是排他。如果你的边界是包容性的,那么当low = high时,数组中剩下的一个元素要检查,内部循环应该再运行一次。因此,测试低≤高是否合适。另一方面,如果低是包含性而高则是排他性的,那么当低=高时,你已经耗尽了所有元素并且完成了,所以形式低的测试&lt;高是更合适的。

答案 1 :(得分:0)

除了@templatetypedef所说的内容之外,还必须提到当边界包含时,终止条件应该只是low <= high,如果终止条件保持低<&lt; 1}。高会导致搜索中跳过1个元素。此外,当边界为独占时,终止条件应仅为low < high,如果条件低且<=高,则会导致索引超出范围。

我将尝试用这里的例子来解释它:

假设数组是[4,5,6],我们想要搜索元素6.这里数组的长度是3。

初始化:我们设置low = 0.我们可以设置high = 2或high = 3.(即长度-1或长度)

使用Length - 1

初始化high的运行循环

低= 0,高= 2

In first iteration
    low = 0, high = 2 and middle = 1.
    array[middle] is 5, so low = middle + 1 i.e. 2

在if(低&lt; high)循环的第二次迭代将终止而不搜索位置2处的元素,所以它应该是if(low&lt; = high)

 In second iteration with if (low <= high) 
    low = 2, high = 2, middle = 2, array[middle] == x, so we return 2.

使用Length

初始化high的运行循环

低= 0,高= 3

In first iteration
    low = 0, high = 3 and middle = 1.
    array[middle] is 5, so low = middle + 1 i.e. 2

In second iteration with if(low < high)
    low = 2, high = 3, middle = 2. array[middle] == x, we return 2.

注意该条件不能低<=高,因为如果数组中不存在x,则会导致循环在第二次迭代中运行low = 3和high = 3,这将导致索引循环运行第3次时超出范围。