我正在通过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怎么可能知道索引中的某个位置是否大于或小于键的位置,而不知道我们正在寻找的键的位置?
这感觉就像一个愚蠢的问题,但是当我们不知道其中一个时,我不明白如何比较数组中的两个位置。
答案 0 :(得分:2)
二进制搜索的一个关键点是它正在搜索排序列表,在这种情况下,我相信它假设按字母顺序排序。
考虑到这一点,if语句实际上是比较字符串,而不是数字,这意味着它正在查看当前键是在当前中间位置之前还是之后。然后一旦发现,它将占据位置的一半,直到找到钥匙的位置。
答案 1 :(得分:2)
name_list[middle_pos]
会有一些价值,例如Ratigan the Rat
。在您的示例中,key
为Morgiana the Shrew
。
比较name_list[middle_pos] < key
将决定Ratigan
是否在Morgiana
之前。由于他不是(按字母顺序),我们然后将搜索范围缩小到他之前的名字范围,并将其切成两半。然后再问这个问题,缩小范围。
您不断缩小范围,直到只剩下一个值。这是正确与否。如果没有,则Morgiana
根本不在列表中。或者我们找到了她的索引。
答案 2 :(得分:1)
它假定列表name_list
按排序顺序排列。然后,如果位于middle_pos
的名称在我们搜索的名称之前按字母顺序出现(在这种情况下为key
),我们知道我们可以跳过从lower_bound
到middle_pos
的所有名称