数组中不同元素的数量

时间:2010-03-23 17:10:44

标签: algorithm arrays language-agnostic

是否可以在线性时间和恒定空间中计算数组中不同元素的数量?让我们说它是一个长整数数组,你不能分配一个长度为sizeof(long)的数组。

P.S。不是作业,只是好奇。我有一本书暗示它是可能的。

7 个答案:

答案 0 :(得分:3)

对于基于比较的模型,这是Element uniqueness problem,其下限为Ω( n log n )。显而易见的散列或桶分类解决方案都需要线性空间,所以我不确定这是否可行。

答案 1 :(得分:1)

您不能使用恒定空间。你可以使用O(不同元素的数量)空间;这就是HashSet的作用。

答案 2 :(得分:1)

您可以使用任何排序算法并计算数组中不同相邻元素的数量。

答案 3 :(得分:0)

我不认为这可以在线性时间内完成。在O(n log n)中求解的一种算法需要首先对数组进行排序(然后比较变得微不足道)。

答案 4 :(得分:0)

假设我们可以部分破坏输入,这里是一个O(log n)位n个字的算法。

通过线性时间选择查找顺序sqrt(n)的元素。使用此元素作为轴(O(n))对数组进行分区。使用强力,计算长度为sqrt(n)的分区中不同元素的数量。 (这是O(sqrt(n)^ 2)= O(n)。)现在在其余部分使用就地基数排序,其中每个“数字”是log(sqrt(n))= log(n)/ 2位,我们使用第一个分区来存储数字计数。


如果仅考虑流式算法(http://en.wikipedia.org/wiki/Streaming_algorithm),那么通过通信复杂性下限(http://en.wikipedia.org/wiki/Communication_complexity)无法获得o(n)位存储的精确答案,但可能使用随机性和小空间来近似答案(Alon,Matias和Szegedy)。

答案 5 :(得分:0)

如果你保证数组中的数字在上下限制,比如说a和b,那么你可以分配一个大小为b-a的数组,然后用它来跟踪看到的数字。

即,您将在输入数组中移动每个数字,并在该位置的目标数组中标记为true。只有在遇到存储阵列中的位置为假的数字时,才会增加不同数字的计数器。

答案 6 :(得分:-1)

当假设只有恒定数量的不同值时,可以使用桶方法来完成。为每个值(仍为常量空间)创建一个标志。遍历列表并标记出现的值。如果您碰巧标记了已标记的值,则表示您发现了重复项。您必须遍历列表中每个元素的存储桶。但那仍然是线性时间。