【发布时间】:2013-08-13 07:20:55
【问题描述】:
我已阅读多篇文章,包括 Jon Bentley 关于二分搜索的章节。这就是我对正确二分搜索逻辑的理解,它适用于我所做的简单测试:
binarysearch (arr, low, high, k)
1. while (low < high)
2. mid = low + (high - low)/2
3. if (arr[mid] == k)
return mid
4. if (arr[mid] < k )
high = mid -1
5. else
low = mid + 1
现在要找到第一次出现的排序重复项,如果条件继续,您将有机会在第 3 行 而不是以
的形式返回 midbinarysearch_get_first_occur_with_duplicates (arr, low, high, k)
1. while (low < high)
2. mid = low + (high - low)/2
3. if (arr[mid] == k)
high = mid - 1
low_so_far = arr[mid]
4. if (arr[mid] < k )
high = mid -1
5. else
low = mid + 1
return low_so_far
同样要获得重复元素的最高索引,你会做low = mid + 1 并继续如果arr[mid]==k
这个逻辑似乎有效,但在多个地方我看到循环不变量为
while (low + 1 < high)
我很困惑,想了解您何时可能想改用 low + 1 < high
的low < high。
在我上面描述的逻辑low + 1 < high 中,如果您使用简单示例进行测试,条件会导致错误。
有人能解释一下为什么以及何时我们可能希望在 while 循环中使用 low + 1 < high 而不是 low < high?
【问题讨论】:
-
猜测一下,如果您的不变量是目标必须位于
low <= i <= high,那么您使用while (low < high);如果您的不变量是目标必须位于low <= i < high,那么您使用while (low + 1 < high)。说了这么多,我还没查! -
@Rafe 你的猜测是正确的。继续并将其作为答案发布。
标签: algorithm binary-search loop-invariant