算法:查找恰好出现两次的元素

标签 algorithm

输入一个未排序的整数数组A[1..n]只有 O(d) :(d < < n)不同的元素。

输出所有恰好出现两次的元素。

要求两种算法,一种是O(Nd)和另一个O(Nlogd) .最大数量可能非常大,因此大小为 n 的数组计算频率可能不是一个好主意。有什么想法吗?

澄清一下,“只有 O(d) :(d < < n) 个不同的元素”是指所有其他元素(不是那些 O(d) 个元素)出现了两次或更多次。

最佳答案

O(nd) 基本上是迭代所有可能的元素(O(d) of those)并计算它重复的次数。每次迭代都是 O(n)

O(nlogd)构建一个histogram (map:int->int) 计算每个元素在单次迭代中出现在列表中的次数。 map 是balanced Binary Search Tree基于确保 O(nlogd)。请注意,如果您使用 hash map代替树,它可以增加到 O(n) 平均情况(但 O(nd) 最坏情况)

伪代码 - O(nlogd):

map <- new tree map
for each element x in list:
 if x is in map:
     map.put(x,map.get(x)+1)
 else:
     map.put(x,1)
for each (key,value) in map:
  if value == 2:
     print key

关于算法:查找恰好出现两次的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14137586/

相关文章:

algorithm - 如何做递归关系?

algorithm - 分组排序算法帮助

python - 在 python 中达到以下代码的递归深度

algorithm - 从稀疏键空间映射到密集键空间

c++ - C++ STL 错误中的 Prim 算法实现?

python并行计算: split keyspace to give each node a range to work on

algorithm - 访问所有组合的最佳方式是什么

algorithm - 给定一组多边形和一系列点,找出点位于哪些多边形

algorithm - 通过包装器优化斐波那契数列递归函数

python - 在 FTP 服务器上扩展 Python 的 os.walk 功能