【问题标题】:What search algorithm should I use if I need to find a value OR the next highest?如果我需要找到一个值或下一个最高值,我应该使用什么搜索算法?
【发布时间】:2014-08-09 22:05:34
【问题描述】:

我将有一个这样的交易 ID 的有序列表:

41025745
41025741
41025740
41025739
41025738
41025735
41025721
41025719
41025718
41025717
41025699
41025683
41025682
41025681

10 到 1000 之间的任意值,具体取决于我根据 API 调用计算出一次要抓取的数量。

假设我想查找事务 ID 41025735(在列表中),我可以使用二进制搜索来查找它,但如果我想查找 41025736(不在列表中),我将返回 41025738,即下一个最大值。我应该使用什么?修改后的二分搜索?

【问题讨论】:

    标签: python list search binary-search


    【解决方案1】:

    bisect module 直接支持这一点,但它要求输入按升序排列:

    >>> from bisect import bisect_left
    
    >>> data = '''\
    41025745 41025741 41025740
    41025739 41025738 41025735 41025721
    41025719 41025718 41025717 41025699
    41025683 41025682 41025681'''
    
    >>> trans_ids = sorted(s.split())
    >>> def find_ge(a, x):
            'Find leftmost item greater than or equal to x'
            i = bisect_left(a, x)
            if i != len(a):
                return a[i]
            raise ValueError
    
    >>> find_ge(trans_ids, '41025736')
    '41025738'
    

    【讨论】:

    • 在 bisect 模块中叫什么?将列表从降序翻转到升序的最快方法是什么?
    • 谢谢,我只是通过查看文档在网上发现了这一点。非常感谢!
    【解决方案2】:

    由于您的列表已经从大到小排序,因此您无需排序。这是不需要对列表进行预排序的替代方法:

    >>> data
    ['41025745', '41025741', '41025740', '41025739', '41025738', '41025735', '41025721', '41025719', '41025718', '41025717', '41025699', '41025683', '41025682', '41025681']
    >>> def find_ge(li, item):
    ...     for e in reversed(li):
    ...         if e>=item:
    ...             return e
    ...      
    ...     raise ValueError  
    >>> find_ge(data, '41025736')
    '41025738'
    >>> find_ge(data, '41025735')
    '41025735'
    

    【讨论】:

      猜你喜欢
      • 2020-03-18
      • 2021-03-21
      • 2016-09-17
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多