繁体   English   中英

数组中不同元素的数量

[英]Number of different elements in an array

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

PS不是功课,只是好奇。 我有一本书暗示它是可能的。

这是元素唯一性问题 ,对于基于比较的模型,下限为Ω( n log n ) 明显的散列或桶分类解决方案都需要线性空间,所以我不确定这是否可行。

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

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

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

假设我们可以部分破坏输入,这里是一个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 ),那么通过通信复杂性下限就无法得到o(n)位存储的精确答案( http:// en .wikipedia.org / wiki / Communication_complexity ),但可以使用随机性和小空间(Alon,Matias和Szegedy)来近似答案。

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

也就是说,您将通过输入数组移动每个数字,并在该位置的目标数组中标记为true。 只有在遇到存储阵列中的位置为f​​alse的数字时,才会增加不同数字的计数器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM