這取決於你如何實現二分搜索。
例如,像你描述的一種實現方法是讓它搜索大於或等於你的元素的第一個元素。然後,當二分查找停止時,停止的位置就是答案(實際元素或應該插入的位置)。
示例代碼:
binary_search(v: value to search, a: list to search in, n: list size):
left = 0, right = n
while left < right:
m = (left + right)/2
if a[m] >= v: // this is the important part:
// even if we find it, we continue,
// so we find the first such value.
right = m
else:
left = m + 1
return left
實施例輸出:
binary_search(3, {1, 2, 4}, 3) = 2
binary_search(0, {1, 2, 3}, 3) = 0
binary_search(2, {1, 2, 3}, 3) = 1
這應該是微不足道適應你提到的格式返回值。
對於實現here,我們可以證明它是這樣的:如果元素被找到,它的位置顯然會返回,所以我們關注未找到的情況。最終,二進制搜索循環將退出,因爲low == high + 1
。
讓我們來看看如果在出口之前發現元素會發生什麼情況,例如考慮low = high = K
。然後該元素將在位置K
處找到。由於不是,我們將設置low = K + 1
或high = K - 1
。
由於元素沒有被發現,返回low
會返回一個你感興趣的。
我可以證明我自己的代碼,但不適合你(即使你已經包括它)。這真的取決於你如何跟蹤搜索範圍。 – 2015-02-09 23:40:24
明顯的非答案:不,它不會:在C++'std :: binary_search''返回一個'bool',所以它不是索引/迭代器;-) – stefan 2015-02-09 23:42:20
@stefan但是'std :: lower_bound'。 – 2015-02-10 00:12:48