我正在做一個Python練習來搜索word
從給定的排序wordlist
,包含超過100,000個單詞。爲什麼我的二進制搜索實現非常低效?
使用Python bisect
module中的bisect_left
時,它非常高效,但是使用我自己創建的二進制方法效率非常低。任何人都可以請說明爲什麼
這是使用Python bisect
模塊的搜索方法:
def in_bisect(word_list, word):
"""Checks whether a word is in a list using bisection search.
Precondition: the words in the list are sorted
word_list: list of strings
word: string
"""
i = bisect_left(word_list, word)
if i != len(word_list) and word_list[i] == word:
return True
else:
return False
我的實現真的是很低效的(不知道爲什麼):
def my_bisect(wordlist,word):
"""search the given word in a wordlist using
bisection search, also known as binary search
"""
if len(wordlist) == 0:
return False
if len(wordlist) == 1:
if wordlist[0] == word:
return True
else:
return False
if word in wordlist[len(wordlist)/2:]:
return True
return my_bisect(wordlist[len(wordlist)/2:],word)
因爲你實際上並沒有使用二進制搜索? – jonrsharpe
@jonrsharpe,我試圖執行二進制搜索,其中我搜索的開始一半,如果不是在開始一半,我搜索另一半 – bean
這裏的問題是,你在每個級別上覆制列表,這將使您從二分查找中獲得的收益變得侏儒。嘗試僅使用索引來分隔要搜索的部分。 –