在接受采访时我被要求实施二分搜索以改善搜索时间,我想出了这个。我回到家测试它,但看起来线性搜索比我的二分搜索更好。我在这里做错了吗?
import time
sorted_list = range(0, 10000000)
needle = 9999999
def split_list(sorted_list):
half = len(sorted_list)/2
return sorted_list[:half], sorted_list[half:]
def bisection(haystack, needle, length_of_list):
if len(haystack) <= length_of_list/5:
return haystack
first, last = split_list(haystack)
if needle < first[-1]:
return bisection(first, needle, length_of_list)
else:
return bisection(last, needle, length_of_list)
def linear_search(smaller_ist):
for ele in smaller_list:
if ele == needle:
return 0
start_time = time.time()
smaller_list = bisection(sorted_list, needle, len(sorted_list))
print linear_search(smaller_list)
print("--- %s seconds ---" % (time.time() - start_time))
start_time = time.time()
print linear_search(sorted_list)
print("--- %s seconds ---" % (time.time() - start_time))
答案 0 :(得分:6)
List slicing是O(k),其中k是您获得的切片的长度。您重复对split_list()
行return sorted_list[:half], sorted_list[half:]
中的列表进行切片。对bisection
的顶级调用(在整个列表中调用split_list()
)将使O(n)仅运行split_list
(因为左半部分的大小+右半部分= n),它本身已经与线性搜索的时间复杂度相匹配。
解决此问题的一种方法是,而不是列表切片,在递归调用函数时传递lowerBound
和upperBound
(顶级调用使用lowerBound
}和upperBound
分别设置为0
和len(sorted_list)
。而length_of_list
将是upperBound - lowerBound
。