【问题标题】:Binary Search counter二分查找计数器
【发布时间】:2017-05-16 01:51:07
【问题描述】:

我创建了一个 len 100 的列表

li2 = list(range(100))

我使用下面的二进制搜索功能,带有一个计数器,但是需要 5 次搜索才能找到 50。应该在第一次尝试时找到它。 (100/2) = 50 li2[50] == 50

def binary_search(li,item):
    low = 0
    high = len(li)-1
    trys = 0 
    while low<=high:
        mid = int((low + high)/2)
        guess = li[mid]
        if guess == item:
            return'Found',item, 'in', trys,'searches'
        elif guess > item:
            trys+=1
            high = mid - 1
        else:
            trys+=1
            low = mid + 1
    return item,' not found', trys, ' searches attempted'

我跑binary_search(li2,50)

并在下方返回

('Found', 50, 'in', 5, 'searches')

【问题讨论】:

    标签: python search binary counter


    【解决方案1】:

    range(100) 将返回一个列表,其中包含从 0 到 99 的所有元素。您的二分搜索算法将从 49 开始搜索,而不是从 50 开始搜索。

    【讨论】:

    • 但如果高 = len(list)
    • >>> len(li2) 100 >>> mid = int((100+0)/2) >>> li2[mid] 50
    【解决方案2】:

    既然可以使用bisect,为什么还要重新发明轮子,它通常有一个原生实现,所以速度非常快。

    bisect_left 返回当前项在列表中的插入位置(当然必须排序)。如果索引超出列表范围,则项目不在列表中。如果索引在列表范围内并且项目位于该索引处,那么您已经找到它:

    import bisect
    
    def binary_search(li,item):
        insertion_index = bisect.bisect_left(li,item)
        return insertion_index<len(li) and li[insertion_index]==item
    

    测试:

    li2 = list(range(100))
    print(binary_search(li2,50))
    print(binary_search(li2,-2))
    print(binary_search(li2,104))
    

    结果:

    True
    False
    False
    

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 2021-03-07
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2015-12-10
      • 2014-11-13
      • 1970-01-01
      相关资源
      最近更新 更多