如何有效地收集给定数组中的重复元素?

How to efficiently gather the repeating elements in a given array?

本文关键字:元素 数组 有效地      更新时间:2023-10-16

我想在给定的数组中收集重复项。例如,我有一个这样的数组:

{1,5,3,1,5,6,3}

我希望结果是:

{3,3,1,1,5,5,6}

就我而言,在计算之前不知道集群的数量,并且不关心顺序。

我通过使用 bult-in 函数Sortin C++ 来实现这一点。但是,实际上不需要排序。因此,我想可能有更有效的方法来完成它。

提前谢谢。

首先,构建一个直方图,记录每个数字的频率。您可以使用字典在 O(n( 时间和空间内完成此操作。

接下来,遍历字典的键(顺序在这里并不重要(,并为每个键写入多个等于相应值的键实例。

例:

{1,5,3,1,5,6,3}                  input
{1->2,5->2,3->2,6->1}            histogram dictionary
{1,1,5,5,3,3,6}                  wrote two 1s, two 5s, two 3s, then one 6

这整个事情是O(n(时间和空间。当然,你不能比O(n(时间做得更好。在保持O(n(时间的同时,你是否能比O(n(空间做得更好,我不能说。