每当我迭代地执行二进制搜索时,我总是对使用while (low < high)
还是while(low <= high)
感到困惑。
虽然两者都有效但有人能告诉我一个人的实际优势是什么?
答案 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或长度)
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.
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次时超出范围。