我已经在python中实现了二进制搜索和线性搜索。我用它来搜索113809排序单词列表中的单词。但是二进制搜索比线性搜索需要更多的时间,尽管从理论上讲,二进制搜索应该更快。我已经使用时间功能来测量时间。输出是要搜索的单词的索引以及两个搜索功能所花费的时间。
# binary search
import random
import time
def b_search(t,c, low_index, up_index):
if low_index > up_index:
return -1
middle= (low_index + up_index)//2
if t[middle]== c:
return middle
if t[middle]> c:
return b_search(t, c, low_index, middle-1)
if t[middle]< c:
return b_search(t,c,middle+1, up_index)
def make_list():
fin= open('words.txt')
word_list=[]
for line in fin:
word= line.strip()
word_list.append(word)
return word_list
def l_search(t, c):
length= len(t)
index= 0
while index<length:
if t[index]== c:
return index
index= index+1
return (-1)
t= make_list()
a= time.time()
print(b_search(t, 'hospital', 0, len(t)-1))
b= time.time()
print('binary search took', b-a, 'seconds')
c= time.time()
print(l_search(t, 'hospital'))
d= time.time()
print('linear search took', d-c, 'seconds')
输出为: 46662 二进制搜索花费了0.07027983665466309秒 46662 线性搜索花费了0.01752614974975586秒
答案 0 :(得分:1)
我敢打赌,递归二进制搜索中的函数调用会浪费时间。由于python对象可能会随时更改,即b_search“对象”可能从函数更改为变量,因此代码无法像其他语言一样进行优化。
函数调用每次进入和离开函数时都需要操纵堆栈,这需要花费一些时间,在这种情况下,这可能比线性搜索的开销还要大。
另一件事是,线性搜索与高速缓存存储器对齐得很好,而二进制搜索可能会导致高速缓存未命中,至少在最快的高速缓存中如此。但是,函数调用可能是这里的原因。