我已经阅读了多篇文章,包括 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
现在要找到第一次出现的排序重复项,如果条件继续而不是返回 mid 作为
binarysearch_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
如果您使用简单的示例进行测试,则会导致错误。
有人可以澄清为什么以及何时我们可能想要low + 1 < high
在 while 循环中使用而不是low < high
?