有效地在列表中查找重复项

时间:2017-10-03 23:22:59

标签: python algorithm performance list time-complexity

我有下面的函数,它在数组中搜索重复的条目,然后返回重复的列表。我想加快我的代码速度,有人能提出更有效的方法吗?

代码:

def findDupe(array):
    dupelist = []
    for i in range(len(array)):
        for j in range(len(array)):
            comp1 = array[i]
            comp2 = array[j]
            if comp1 == comp2 and i!=j:
                if comp2 not in dupelist:
                    dupelist.append(comp2)
    return dupelist

2 个答案:

答案 0 :(得分:2)

这里的想法是在线性时间内进行单次扫描。您可以使用计数器执行此操作。我们的想法是计算每个元素,然后返回所有被计数多次的元素。

from collections import Counter

def get_duplicates(array):
    c = Counter(array)
    return [k for k in c if c[k] > 1] 

上面的方法在复杂度上是线性的,但是在输入上进行两次传递 - 一次,计数(这被Counter构造函数抽象掉),另一种是在列表中返回非唯一值可比。您可以使用yield语句对此进行优化,并在找到它们时返回重复项。

def get_duplicates(array):
    c = Counter()
    seen = set()
    for i in array: 
        c[i] += 1
        if c[i] > 1 and i not in seen:
            seen.add(i)
            yield i

这导致强制if检查和set形式的额外空间,但您将两个传递减少到一个。

答案 1 :(得分:0)

列表中的元素类型是什么?

  1. 如上所述,在集合中存储元素会给出平均复杂度Θ(n),但要求元素是可散列的(Python中的集合用散列表实现,请参阅https://wiki.python.org/moin/TimeComplexity
  2. 如果您有比较功能,您可以在最坏情况下对列表进行排序Θ(nlog(n)),然后将列表中的每个元素与下一个元素进行比较。
  3. 如果你有一个比较函数,你也可以实现一个具有(平衡)BST的集合,并且与1相同,以实现平均复杂度Θ(nlog(n))(在最坏的情况下)。