【发布时间】:2016-05-17 08:03:36
【问题描述】:
每当我迭代地执行二分搜索时,我总是对应该使用while (low < high) 还是while(low <= high) 感到困惑。
虽然两者都可以,但有人能告诉我其中一个比另一个有什么实际优势吗?
【问题讨论】:
-
取决于您如何更新您的
low和high
每当我迭代地执行二分搜索时,我总是对应该使用while (low < high) 还是while(low <= high) 感到困惑。
虽然两者都可以,但有人能告诉我其中一个比另一个有什么实际优势吗?
【问题讨论】:
low 和high
除了@templatetypedef 所说的,还有一点很重要的一点是,当bounds是inclusive时,终止条件应该只有low <= high,如果终止条件保持低exclusive时,终止条件只能是low < high,如果条件低
我将尝试在这里用一个例子来解释它:
假设数组是 [4, 5, 6] 并且我们要搜索元素 6。这里数组的长度是 3。
初始化:我们设置低 = 0。我们可以设置高 = 2 或高 = 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(low
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.
注意条件不能为低
【讨论】:
您列出的两个终止条件通常根据 low 和 high 是包含还是排除来使用。如果您的界限是包容性的,那么当 low = high 时,数组中还有一个元素需要检查,内部循环应该再运行一次。因此,低≤高的测试是合适的。另一方面,如果 low 是包容性的, high 是排斥性的,那么当 low = high 时,你已经用尽了所有元素并完成了,所以低
【讨论】:
high 更新为mid - 1 并将low 更新为mid + 1,那么包含低和独占高假设元素在数组内,因此可以安全地终止而不检查最后一个元素。但是,包含边界可以安全地检查最后一个元素,并用于我们不确定该元素是否存在的情况?
lo = 0 和 hi = nums.length - 1
low <= high,这样您就不会在缩小范围后停止循环单个元素的有效范围。
low <= high 时,我发现决定是返回 nums[high] 还是 nums[low] 作为最终结果令人困惑。我总是花时间跟踪索引。有没有更简单的方法来设想回报指数?谢谢!