为什么我的二分搜索比python中的线性搜索慢?

时间:2015-07-06 03:57:24

标签: python algorithm search

在接受采访时我被要求实施二分搜索以改善搜索时间,我想出了这个。我回到家测试它,但看起来线性搜索比我的二分搜索更好。我在这里做错了吗?

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))

1 个答案:

答案 0 :(得分:6)

List slicing是O(k),其中k是您获得的切片的长度。您重复对split_list()return sorted_list[:half], sorted_list[half:]中的列表进行切片。对bisection的顶级调用(在整个列表中调用split_list())将使O(n)仅运行split_list(因为左半部分的大小+右半部分= n),它本身已经与线性搜索的时间复杂度相匹配。

解决此问题的一种方法是,而不是列表切片,在递归调用函数时传递lowerBoundupperBound(顶级调用使用lowerBound }和upperBound分别设置为0len(sorted_list)。而length_of_list将是upperBound - lowerBound