我读过多篇文章,包括Jon Bentleys关于二元搜索的章节。这就是我对CORRECT二进制搜索逻辑的理解,它适用于我所做的简单测试:
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
?
答案 0 :(得分:3)
如果您的不变量是目标必须位于low <= i <= high
,那么您使用while (low < high)
;如果您的不变量是目标必须位于low <= i < high
,那么您使用while (low + 1 < high)
。 [感谢David Eisenstat确认此事。]