在包含重复项的无序数组中查找唯一元素

Kan*_*arG 3 python arrays algorithm big-o

例如,如果L = [1,4,2,6,4,3,2,6,3],那么我们希望1作为唯一元素.这是我想到的伪代码:

初始化字典以存储每个元素的出现次数:~O(n),查看字典以找到值为1的元素:~O(n)

这确保了总时间复杂度保持为O(n).这看起来是正确的想法吗?

此外,如果对数组进行了排序,例如,时间复杂度会如何变化?我认为这将是二进制搜索的一些变体,它会将其减少到O(log n).

Bre*_*bel 7

您可以使用 collections.Counter

from collections import Counter

uniques = [k for k, cnt in Counter(L).items() if cnt == 1]
Run Code Online (Sandbox Code Playgroud)

复杂性永远是O(n).您只需要遍历列表一次(这就是Counter正在做的事情).排序无关紧要,因为字典赋值始终为O(1).


das*_*ght 7

有一个非常简单的解决方案是使用^运算符将序列的O(n):XOR元素组合在一起.变量的结束值将是唯一编号的值.

证明很简单:对一个数字进行异或运算产生零,所以由于除了一个数字之外的每个数字都包含它自己的副本,因此对它们进行异或运算的最终结果将为零.将唯一数字与零进行异或运算得出数字本身.

  • ...假设所有非唯一元素都出现偶数次. (5认同)
  • "重复"意味着两次或更多次. (5认同)
  • @martineau:您可以对它们进行异或整数表示.例如,如果它们是字符串,你可以将`int(binascii.hexlify(s),16)`一起异或. (3认同)
  • 数据库上下文中的重复意味着两次或更多次.但非常聪明的解决方案! (2认同)