2015-02-09 45 views
1

這與C++中的lower_bound類似,用於二進制搜索的Javadoc也提到:「搜索關鍵字的索引,如果它包含在數組中;否則,( - (插入點)-1)。」對於缺失元素的二分查找是否總是在元素出現之前返回元素?

我已經能夠驗證它是真的幾個例子,我敢肯定它是真的。但是,我無法證明這一點,所以我不確定。

我試圖通過矛盾做某種證明。它沿着線條運行:如果元素在那裏,那麼我們必須通過消除包含該元素的範圍來忽略它。潛在的位置和它應該處於的位置之間的差距必須很小。最後,如果有兩個元素,並檢查第一個元素,即元素或元素可能位置後面的元素。

我也試着去考慮減少存在的元素的情況下,沒有元素的情況下,但這種做法導致無處。我覺得我手揮着證據,抓着吸管。

問題中的陳述是否屬實?如果是這樣,你能證明嗎?

+0

我可以證明我自己的代碼,但不適合你(即使你已經包括它)。這真的取決於你如何跟蹤搜索範圍。 – 2015-02-09 23:40:24

+1

明顯的非答案:不,它不會:在C++'std :: binary_search''返回一個'bool',所以它不是索引/迭代器;-) – stefan 2015-02-09 23:42:20

+0

@stefan但是'std :: lower_bound'。 – 2015-02-10 00:12:48

回答

5

這取決於你如何實現二分搜索。

例如,像你描述的一種實現方法是讓它搜索大於或等於你的元素的第一個元素。然後,當二分查找停止時,停止的位置就是答案(實際元素或應該插入的位置)。

示例代碼:

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 + 1high = K - 1

由於元素沒有被發現,返回low會返回一個你感興趣的。

+0

謝謝你的回答,IVlad,但我已經意識到它是如何實現的。這只是我觀察了我在關於示例的問題中發佈的聲明,並且類似的API文檔進一步證實了這一點。我完全按照你自己的例子來實現和測試它。我試圖理解的是我如何證明這是真的。 – ssh 2015-02-10 03:51:55

+2

@ssh - 證明來自算法的構造:「搜索大於或等於您的元素的第一個元素」。如果你的元素存在,它會返回它。如果不是,它將返回第一個更大的元素,這是您的元素應該插入的位置。那麼這只是一個實現算法的問題。註釋行是關注該特定實現的:即使我們發現元素與我們正在搜索的元素相等,我們仍然移動到左側區間,以找到** first **這樣的元素。 – IVlad 2015-02-10 09:32:46

+0

謝謝,我瞭解您的證明對您實施的二進制搜索的作用。我想知道是否可以解釋它是如何用於標準二分搜索(在> =部分中不包含=)作爲二分搜索的「標準」實現:http://grepcode.com/file/repository.grepcode.com/ java/root/jdk/openjdk/6-b14/java/util/Arrays.java#Arrays.binarySearch%28byte%5B%5D%2Cbyte%29 – ssh 2015-02-12 00:05:59

相關問題