2017-06-15 113 views
0

我對Python很新,並試圖學習算法,我想問爲什麼它在邏輯上錯誤,如果我在查看列表時使用low < hi,正確的邏輯操作是low <= hi,什麼是它防止的邊緣情況。瞭解while循環python

def binary_search(input_array, value): 
    """Your code goes here.""" 
    #O(log(n)) 
    low = 0 
    hi = len(input_array) - 1 
    while low <= hi: #why cant it be low < hi 
     mid = (low + hi)//2 
     if input_array[mid] == value: 
      return mid 
     elif input_array[mid] < value: 
      print(low, hi) 
      low = mid + 1 
     else: 
      hi = mid - 1 
    return -1 


test_list = [1,3,9,11,15,19,29] 
test_val1 = 25 
test_val2 = 15 
print(binary_search(test_list, test_val1)) 
print(binary_search(test_list, test_val2)) 
+0

考慮編輯的問題,並追加引發的異常你遇到。猜測遊戲在這裏遭到嚴厲的否決:D – Juggernaut

+2

@Juggernaut - 這裏沒有猜謎遊戲。他沒有得到一個例外,他問的算法的邏輯。正如答案指出的那樣,如果你改變了邏輯,你不會得到一個例外,但你會遇到更糟糕的情況:錯誤的答案。 –

回答

0

當你的目標是,例如,15:

第一次迭代指標: low == 4,hi == 6

第2次迭代索引:low == 4,hi == 4

如果您使用較低的<高,您將不會在第二次迭代中進入循環,因爲4 < 4返回false。你的程序會認爲即使值是指數4

0

我們使用「< =」,而不是僅僅「<」,因爲在所需的值恰好是最後一個索引(低時= HI)的情況下,我們將需要包括一個等號檢查這種情況。

5

考慮你只有一個元素[1],你正在尋找1

<:返回-1既然你只想跳過循環

<=:在你的情況下返回正確的值

0

你可以如果你寫
hi = len(input_array)
while low < hi: # now this works.
...

事實上,它無法找到值通常這是我怎麼寫一般這些循環。利用len()總是比最後一個索引多1的事實,並且僅在索引爲<那個值時運行循環。

如果從len(input_array)減去1,這樣爲hi最大值爲數組中的最後一個索引,那麼爲了毀掉你需要的low <= hi

=一部分最後一個元素上環通常,(精神上)更容易設置hi = len(input_array),這是最後一個索引之後的1,然後僅在low<hi時運行循環。 (打字少,心理體操少)。
在這種情況下,一旦low==hi我們已經超過了最後一個索引,那麼它會超出範圍。

您提到的「邊緣案例」是,您要確保在所有元素(索引)上運行循環。 所以不管怎樣,你需要查看數組中最後一個索引/元素。

基本上有兩種常見的方法來編碼,但你不能混用它們。確保您的最終條件與您的初始條件相關。

你所設置hi到(或者是數組的長度,或數組的最後一個索引)確定您是否要使用low < hilow <= hi

+1

非常感謝:) @SherylHohman – Danny