何时使用低<高或低+ 1<高为循环不变量

时间:2013-08-12 03:38:09

标签: algorithm binary-search loop-invariant

我读过多篇文章,包括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行

而不是返回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条件会导致错误。

有人可以澄清为什么以及何时我们可能希望在while循环中使用low + 1 < high而不是low < high

1 个答案:

答案 0 :(得分:3)

如果您的不变量是目标必须位于low <= i <= high,那么您使用while (low < high);如果您的不变量是目标必须位于low <= i < high,那么您使用while (low + 1 < high)。 [感谢David Eisenstat确认此事。]