如何修复二进制搜索中的“找不到元素”?

时间:2019-08-07 08:35:03

标签: python-3.x recursion binary-search

我一直在尝试执行此代码,其工作是使用二进制搜索来查找特定元素。现在,如果列表中存在元素,则代码可以正常工作,但如果不包含搜索元素,则无法显示预期的块目前。我假设该列表按升序排列。对此将有所帮助

我尝试用while赋予其他部分:但这没有帮助。它无法显示找不到元素的错误

def binarysearch(l,item):
    low=0
    u=len(l)-1
    while low<=u:
        mid=int((low+u)/2)
        if item==l[mid]:
            return mid
        elif item<l[mid]:
            high=mid-1
        else:
            low=mid+1
l=eval(input("Enter the list of elements"))
item=int(input("Enter search item:"))
index=binarysearch(l,item)
if index>=0:
    print(item,"found at index",index)
else:
    print("Element not found") #i am unable to reach this part 

如果输入为: 输入元素列表[8,12,19,23] 输入搜索项:10

我希望结果是“找不到元素”。但是在这种情况下程序什么也不做

1 个答案:

答案 0 :(得分:0)

我会给你一个提示,稍后我将更好地测试此代码并尝试解释它为什么发生。 提示是使用in检查列表中是否存在项目。 In比使用循环更具表现力。 示例工作:

def binarysearch(elem, item):
    if item in elem:
        return elem.index(item)
    else:
        return -1 # because your if verifying if the return is equal or greater than 0.

更新1 当我尝试运行您的代码时,我陷入了一个无限循环,这是由于表达式mid=int((low+u)/2)导致的-我不明白您为什么这样做。如果我们运行此代码,则会发生以下情况:

  1. 列出[8,12,19,23]和项目10
  2. u=len(l)-1 u = 3,因为4-1
  3. 加入while,因为条件为True
  4. mid=int((low+u)/2),此处mid将为(0 + 3)/ 2,因为您将其强制为int,结果将为1
  5. if item==l[mid]: 10 == 12-l [mid]-l [1]-错误
  6. elif item<l[mid]: 10 <12是
  7. high=mid-1高将是1-1 = 0
  8. 从数字3开始进入下一个迭代,这就是为什么陷入无限循环的原因 要遍历列表中的所有位置,可以使用以0开头的low,如果item不是该位置的值==则增加。因此您可以使用while,但可以这样:
def binarysearch(l,item):
    low=0
    u=len(l)-1
    while low<=u:
        if item==l[low]:
            return low
        else:
            low+=1

    return -1
l=eval(input("Enter the list of elements"))
item=int(input("Enter search item:"))
index=binarysearch(l,item)
if index>=0:
    print(item,"found at index",index)
else:
    print("Element not found")

要调试代码,您可以使用[1]:https://docs.python.org/3/library/pdb.html