use*_*463 7 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
Run Code Online (Sandbox Code Playgroud)
这里的想法是在线性时间内进行一次扫描。您可以使用计数器来执行此操作。这个想法是对每个元素进行计数,然后返回所有被多次计数的元素。
from collections import Counter
def get_duplicates(array):
c = Counter(array)
return [k for k in c if c[k] > 1]
Run Code Online (Sandbox Code Playgroud)
上面的方法在复杂性上是线性的,但是对输入进行了两次传递 - 一次是为了计数(这是由Counter
构造函数抽象出来的),另一个是返回列表 comp 中的非唯一值。您可以使用语句对此进行一些优化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
Run Code Online (Sandbox Code Playgroud)
这会导致强制if
检查和 a 形式的额外空间set
,但您可以将两次通过减少为一次。
归档时间: |
|
查看次数: |
4561 次 |
最近记录: |