【问题标题】:Fast search of doubled numbers in array快速搜索数组中的双数
【发布时间】:2021-12-11 11:45:39
【问题描述】:

我正在尝试在列表中搜索重复出现的数字。但是对于大型数组(例如 >1000 个项目,这需要很长时间)。有什么方法可以加快速度吗?

lis = [1, 6, 9, 3, 27, 50, 12, 2]

def isAnyThere (lis):
    for m in lis:
        for m in lis:
            if m == 2 * k:                
                return m
    return 0

【问题讨论】:

  • 双倍出现是什么意思?这是否意味着列表中存在 k 的 2 倍?
  • 你可以查看 NumPy 库,它可以快速处理 python 数组

标签: python list numbers


【解决方案1】:

这个问题不是很清楚,但我想你想检查列表中是否有任何一对数字,使得一个是另一个的两倍?

如果您先对列表进行排序,则只需检查每对元素一次,从而立即将比较次数减半。

还可以处理列表元素集以删除大型列表中的重复值。

def isAnyThere (lis):
    lis = sorted(set(lis))
    for i in range(len(lis)):
        for j in range(i+1, len(lis)):
            if lis[j] == 2*lis[i]:
                return lis[j]
    else:
        return 0

【讨论】:

    【解决方案2】:

    Python 的集合类型提供 O(1) 的查找和插入性能,除非集合变得非常大。以下算法:

    1. 将列表的元素插入到集合中
    2. 对于列表中的每个偶数元素 x,检查 x // 2 是否在集合中

    对长度为 n 的列表执行 2*n 步。

    from typing import Sequence
    
    
    def find_doubled(seq: Sequence[int]) -> Sequence[tuple[int, int]]:
        return [(x, x // 2) for x in seq if x % 2 == 0 and x // 2 in set(seq)]
    
    
    if __name__ == '__main__':
        l = find_doubled([1, 6, 9, 3, 27, 50, 12, 2])
        print(l)
        # prints [(6, 3), (12, 6), (2, 1)]
    

    通过忽略重复来处理它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多