【问题标题】:Time elapsed between linear search and binary search using Python使用 Python 进行线性搜索和二分搜索之间经过的时间
【发布时间】:2019-04-09 13:23:55
【问题描述】:

我在下面制作了两个 Python 函数,一个用于顺序(线性)搜索,另一个用于二进制搜索。

我想为给定列表中的每个尺寸值做这 3 件事:

  1. 为给定的列表大小生成随机整数值列表(介于 1 到 1000,0000 之间)

  2. 对列表中的 -1 运行顺序搜索并记录顺序搜索经过的时间

  3. 在排序后的列表上对-1进行二分查找(对列表进行排序后),并记录二分查找经过的时间

我所做的是:

def sequentialSearch(alist, item):
    pos = 0
    found = False

    while pos < len(alist) and not found:
        if alist[pos] == item:
            found = True
        else:
            pos = pos + 1

    return found

def binSearch(list, target):
    list.sort()
    return binSearchHelper(list, target, 0, len(list) - 1)

def binSearchHelper(list, target, left, right):
    if left > right:
        return False

    middle = (left + right)//2
    if list[middle] == target:
        return True
    elif list[middle] > target:
        return binSearchHelper(list, target, left, middle - 1)
    else:
        return binSearchHelper(list, target, middle + 1, right)

import random
import time
list_sizes = [10,100,1000,10000,100000,1000000]
for size in list_sizes:
    list = []
    for x in range(size):
        list.append(random.randint(1,10000000))

    sequential_search_start_time = time.time()
    sequentialSearch(list,-1)
    sequential_search_end_time = time.time()
    print("Time taken by linear search is = ",(sequential_search_end_time-sequential_search_start_time))

    binary_search_start_time = time.time()
    binSearch(list,-1)
    binary_search_end_time = time.time()
    print("Time taken by binary search is = ",(binary_search_end_time-binary_search_start_time))

    print("\n")

我得到的输出是:

众所周知,二分查找比线性查找要快得多。 所以,我只想知道为什么它显示二进制搜索消耗的时间比线性搜索消耗的时间多?

【问题讨论】:

    标签: python random time binary-search linear-search


    【解决方案1】:

    1) 您需要考虑排序时间。二进制搜索仅适用于排序列表,因此排序需要时间,其时间复杂度为O(nlogn)。在您的情况下,您在计时器开始后对其进行排序,所以它会更高。

    2) 您正在搜索列表中不存在的元素,即-1,这不是二进制搜索的平均情况。二分搜索的最坏情况必须进行如此多的跳跃才能永远找不到元素。

    3) 请不要将list 用作变量,它是python 的关键字,您显然会覆盖它。使用其他东西。

    现在,如果您对列表进行排序而不对其计时。结果发生巨大变化。这是我的。

    Time taken by linear search is =  9.059906005859375e-06
    Time taken by binary search is =  8.58306884765625e-06
    
    
    Time taken by linear search is =  1.2159347534179688e-05
    Time taken by binary search is =  4.5299530029296875e-06
    
    
    Time taken by linear search is =  0.00011110305786132812
    Time taken by binary search is =  5.9604644775390625e-06
    
    
    Time taken by linear search is =  0.0011129379272460938
    Time taken by binary search is =  8.344650268554688e-06
    
    
    Time taken by linear search is =  0.011270761489868164
    Time taken by binary search is =  1.5497207641601562e-05
    
    
    Time taken by linear search is =  0.11133551597595215
    Time taken by binary search is =  1.7642974853515625e-05
    

    我所做的只是在计时之前对列表进行排序。方式,比您必须一次排序和搜索要好得多。

    【讨论】:

      猜你喜欢
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多