Python 查找列表是否包含重复项的最有效方法
我有一个大整数的Python 查找列表是否包含重复项的最有效方法,python,python-3.x,set,Python,Python 3.x,Set,我有一个大整数的列表,作为输入。 我想写一个函数来检查列表中的项目是否都是不同的 方法1:使用集合对列表进行迭代,并跟踪到目前为止遇到的所有项目。一旦遇到重复项,立即返回True def containsDuplicates1(a): seen = set() for i in a: if i in seen:
列表
,作为输入。
我想写一个函数来检查列表中的项目是否都是不同的
方法1:使用集合对列表进行迭代,并跟踪到目前为止遇到的所有项目。一旦遇到重复项,立即返回True
def containsDuplicates1(a):
seen = set()
for i in a:
if i in seen:
return True
seen.add(i)
return False
时间复杂度:O(n)
空间复杂度:O(n)
方法2:将整个列表转换为集合
并比较其长度
def containsDuplicates2(a):
return len(a) != len(set(a))
时间复杂度:O(n)(用于设置(a)
操作)
空间复杂度:O(n)
当给定列表可能包含重复项时,第一种方法的性能优于第二种方法
这是我们能做的最好的了吗?或者在时间或空间上有没有更有效的方法来解决这个问题
附言:我已经阅读了所有关于堆栈溢出的相关问题,没有一个讨论这个问题的效率方面。因此,我在此提出要求
你能在时间或空间复杂度小于O(n)的情况下做到这一点吗
一句话,不
考虑所有元素都不同的情况。要确定这种情况,您需要至少查看每个元素一次。这需要O(n)时间
如果元素可以接受的值没有约束,则需要存储到目前为止看到的所有元素,以便根据看到的内容检查将来的元素。如果所有元素都是不同的,这需要O(n)内存。在这种情况下,“性能更好”是什么意思?不,你不能-就大O而言,你必须在最坏的情况下遍历整个列表(没有重复)@ReblochonMasque“性能更好”意味着第一种方法在速度和空间方面都以最佳方式解决问题。是的,我认为你的评论是对我先前问题的回答。还请注意,如果
中的元素数量非常大,则在方法1的情况下,可能不会给出O(1)。不是我的反对票,这是对这个问题的合理回答——这是不可能的。你唯一能做的就是减少与n
相关的常数,但它仍然保持线性。