二进制搜索如何工作?

时间:2015-09-21 21:22:26

标签: python binary-search

我正在通过this website.

学习python

这是一个很棒的资源,但当他解释binary searches时,我有点困惑。

这是他提供的用于搜索超级恶棍名称的文本文件的代码:

file = open("super_villains.txt")

name_list = []
for line in file:
    line = line.strip()
    name_list.append(line)

file.close()

# Binary search
key = "Morgiana the Shrew"
lower_bound = 0
upper_bound = len(name_list)-1
found = False
while lower_bound <= upper_bound and not found:
    middle_pos = (lower_bound+upper_bound) // 2
    if name_list[middle_pos] < key:
        lower_bound = middle_pos + 1
    elif name_list[middle_pos] > key:
        upper_bound = middle_pos - 1
    else:
        found = True

if found:
    print("The name is at position", middle_pos)
if not found:
    print("The name was not in the list.")

这是让我困惑的部分:if name_list[middle_pos] < key: python怎么可能知道索引中的某个位置是否大于或小于键的位置,而不知道我们正在寻找的键的位置?

这感觉就像一个愚蠢的问题,但是当我们不知道其中一个时,我不明白如何比较数组中的两个位置。

3 个答案:

答案 0 :(得分:2)

二进制搜索的一个关键点是它正在搜索排序列表,在这种情况下,我相信它假设按字母顺序排序。

考虑到这一点,if语句实际上是比较字符串,而不是数字,这意味着它正在查看当前键是在当前中间位置之前还是之后。然后一旦发现,它将占据位置的一半,直到找到钥匙的位置。

答案 1 :(得分:2)

name_list[middle_pos]会有一些价值,例如Ratigan the Rat。在您的示例中,keyMorgiana the Shrew

比较name_list[middle_pos] < key将决定Ratigan是否在Morgiana之前。由于他不是(按字母顺序),我们然后将搜索范围缩小到他之前的名字范围,并将其切成两半。然后再问这个问题,缩小范围。

您不断缩小范围,直到只剩下一个值。这是正确与否。如果没有,则Morgiana根本不在列表中。或者我们找到了她的索引。

答案 2 :(得分:1)

它假定列表name_list按排序顺序排列。然后,如果位于middle_pos的名称在我们搜索的名称之前按字母顺序出现(在这种情况下为key),我们知道我们可以跳过从lower_boundmiddle_pos的所有名称