【问题标题】:Infinite loop in binary search二分查找中的无限循环
【发布时间】:2014-01-30 06:24:17
【问题描述】:

我正在尝试使用以下函数实现二进制搜索:

def buggy_binary_search(input, key):
    low = 0
    high = len(input)-1
    mid = (low + high)/2
    while low <= high:
        if input[mid] == key:
            return mid
        if input[mid] > key:
            high = mid - 1
        else:
            low = mid
    return -1

上述函数在运行时,进入一个无限循环。我该如何纠正?

【问题讨论】:

  • 你应该在 while 循环中更新 mid
  • 我应该更新低值吗??@Dmitry Bychenko
  • 你应该把 "mid = (low + high)/2" 放到 while 循环中;你也应该更新低值和高值(你做的)
  • 让我告诉你一些事情,在 while 循环中打印 low, high 看看值是否更新,在你可能想在哪里改变它之后。

标签: python infinite-loop binary-search


【解决方案1】:

由于您没有更新 mid 的值,因此 while 循环不断检查相同的元素并进入无限循环,为了纠正许多人指出的错误,请在 while 循环中更新 mid
此外,您应该使用low = mid+1 而不是low = mid

完整代码如下:-

    def binary_search(input, key):
       low = 0
       high = len(input)-1
       mid = (low + high)/2
       while low <= high:
          mid = (low + high)/2
          if input[mid] == key:
             return mid
          if input[mid] > key:
             high = mid - 1
          else:
             low = mid + 1
       return -1

确保输入已排序!

【讨论】:

  • 在 python 2 中如果 high == sys.maxint?
【解决方案2】:
def binary_search(input, key):
    low = 0
    high = len(input)-1
    mid = (low + high)/2
    while low <= high:
       mid = (low + high)/2
       if input[mid] == key:
           return mid
       if input[mid] > key:
           high = mid - 1
       else:
           low = mid + 1
    return -1

正如 Dmitry Bychenko 所说,您应该将 mid = (low + high)/2 放入循环中。

【讨论】:

  • 输入的数据是什么?
  • @Ramya 是您的input,按升序或降序排列。
  • 既然项目不在input[mid],范围应该调整为low = mid + 1,不是吗?
  • @JonathanLeffler 对,low = mid+1 正确,应该调整一下。
【解决方案3】:
"""don't use "input" as a variable name. its a python keyword.
make sure your array is sorted
use integer division when computing midpoint
"""

def bsearch(input_array,target):
    lo,hi=0,len(input_array)-1
    while lo<=hi:
        mid=(lo+hi)//2
        if input_array[mid]==target:
            print "found at ",mid
            return mid
        if input_array[mid]>target:
            print "look left"
            hi=mid-1
        if input_array[mid]<target:
            print "look right"
            lo=mid+1
    return -1

a=[2,4,7,8,12,88,99,101]
target=7

assert bsearch(a,1134)==-1,"value 1134 isn't in array but says it is"
assert bsearch(a,2)==0,"value 2 is in the zero element of array.begenning"
assert bsearch(a,101)==7,"value 101 is in the 7th element of array. end"
assert bsearch(a,12)==4,"value 12 is in the 4th element of array. midpoint"

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2015-12-17
    相关资源
    最近更新 更多