如何实现二进制搜索?

时间:2017-01-26 21:25:36

标签: python algorithm python-3.x sorting binary-search

我正在尝试创建二进制搜索功能,我已尝试使用下面的代码,但我是python的初学者;我收到错误"列表索引必须是整数,而不是str"在i == alist[i]行。你能帮我解决一下这个问题吗?这是整个代码:

def bsort(alist, i):
    left = 0
    right = len(alist)-1
    i == alist[i]

    [mid] = (left + right)//2

    if alist[mid] < i :
        left = [mid] + 1

    elif alis[mid] > i :
        right = [mid] + 1

    elif alist[mid] == i :
        print ("word found at", i )

    elif left > right:
        print ("Not Found!")       


i = input("Enter a search >")
alist = ["rat","cat","bat","sat","spat"]
bsort(alist, i)

3 个答案:

答案 0 :(得分:1)

你得到'列表索引必须是整数,而不是str',因为你在列表中使用字符串作为二进制搜索的输入,在第4行使用它作为列表的索引,导致列表中的错误通过整数索引。

另一个问题: 1.在应用二进制搜索之前,必须对列表进行排序, 2.line 6导致另一个错误,因为int对象不可迭代。 3.为了在列表中进行完整的搜索,你必须包含一个while循环,它将感知前两个条件并帮助循环遍历列表。

这段代码可以帮到你:

def bsort(alist,blist,i):

msbuild ..\something.sln /p:Configuration=Release /p:DeployOnBuild=true /p:PublishProfile=Filesystem /p:publishUrl=$publishPath 

i =输入(“输入搜索&gt;”)#string你想搜索 alist = [“rat”,“cat”,“bat”,“sat”,“spat”] blist = alist [:]#创建另一个列表,以了解原始列表中的元素索引 alist.sort()#排序列表执行二进制搜索 bsort(ALIST,blist,i)的

答案 1 :(得分:0)

首先它是==,它检查相等性并且不分配值。使用single =代替==进行分配。

此外,您的方法将i作为字符串,然后使用字符串来引用列表的索引。这会产生错误。

您正在使用二分搜索的整数方法来查找不正确的字符串。特别是因为您的字符串既不按长度排序,也不按字母顺序排序。请参阅其他一些方法来执行此操作。

请参阅Binary string search in Python 3.x

答案 2 :(得分:0)

因此,从您的问题的声音,您正试图获得二进制搜索为您的示例工作。首先,知道二进制搜索仅在排序数据上可靠地工作是有用的。这与标准线性搜索完全不同,标准线性搜索总是会找到值,而不管顺序如何。您可能已经知道二进制搜索是首选,因为它每次迭代消除了一半的潜在候选者,而线性搜索只消除了一个元素。话虽如此,让我们讨论一下我对你的程序所做的修改。首先,一些外观变化可以大大提高程序的清晰度。

1。)使用描述性变量名称非常重要,可以作为读取代码的其他人的注释,以及变量的内容和功能。这在像python这样的语言中尤其重要,因为只需通过读取代码就不容易推断变量类型。因此,我没有多次重复使用变量i,而是重命名了函数参数target,因为这是我们尝试定位的搜索词,即我们的“目标”。我还从'bsort'重命名了你的函数,这意味着函数将某些内容排序为'bsearch',这是一个更合适的名称,因为它更准确地描述了函数的作用。

2.。)可以使用循环或递归来实现二进制搜索。为简单起见,我使用循环选择了迭代路由。正如我之前提到的,二进制搜索通过在每次迭代中消除一半潜在搜索候选者来工作。没有循环,你确实消除了一半的候选人(只有一次),但除非你非常幸运,否则你可能找不到你要搜索的术语!相反,您需要继续此过程,直到找到要搜索的术语为止。这是while True:循环的功能。

3.)最后,我们确保使用整数来访问列表的索引。 python中的所有列表都是从0 to n-1索引的,其中n是列表中元素的数量。我们无法使用浮点值(例如2.5)访问列表,因为这与列表中的任何特定“槽”都不对应。类似地,我们不能使用字符串来访问我们的元素,因为列表再次需要一个整数来执行查找。这是mid = int((left + right)/2)的目的。

尽管如此,这应该适用于您的预期目的。我希望这可以帮助你!我还鼓励您查看一些如何实现二分搜索的示例,例如this one

def bsearch(alist, target):
    left = 0
    right = len(alist)-1

    while True:
        mid = int((left + right)/2)
        if alist[mid] < target :
            left = mid + 1
        elif alist[mid] > target :
            right = mid + 1
        elif alist[mid] == target :
            print ("word '" + target + "' found at " + str(mid))
            break
        elif left > right:
            print ("Not Found!")
            break       


i = input("Enter a search >")
alist = ["rat","cat","bat","sat","spat"]
alist.sort()
bsearch(alist, i)