Arrays 查找在线性时间内出现n/4次以上的所有元素

Arrays 查找在线性时间内出现n/4次以上的所有元素,arrays,algorithm,search,Arrays,Algorithm,Search,这个问题是斯基纳的4-11。寻找重复次数超过一半的多数元素的解决方案是多数算法。我们可以用它来查找重复n/4次的所有数字吗?由于您没有提到空间复杂性,一种可能的解决方案是使用映射到计数的元素,然后如果找到元素,您可以只增加计数。有关使用恒定内存并以线性时间运行的解决方案,请参阅,这将为出现次数超过n/4次的元素找到3个候选元素。请注意,如果您假设您的数据是作为一个流提供的,您只能通过一次,这是您能做的最好的事情——您必须再通过一次流来测试3个候选数据中的每一个,以查看它是否在流中出现超过n/4次

这个问题是斯基纳的4-11。寻找重复次数超过一半的多数元素的解决方案是多数算法。我们可以用它来查找重复n/4次的所有数字吗?

由于您没有提到空间复杂性,一种可能的解决方案是使用映射到计数的元素,然后如果找到元素,您可以只增加计数。

有关使用恒定内存并以线性时间运行的解决方案,请参阅,这将为出现次数超过n/4次的元素找到3个候选元素。请注意,如果您假设您的数据是作为一个流提供的,您只能通过一次,这是您能做的最好的事情——您必须再通过一次流来测试3个候选数据中的每一个,以查看它是否在流中出现超过n/4次。但是,如果您先验地假设有3个元素出现超过n/4次,那么您只需要通过流一次,就可以得到线性时间在线算法(只通过流一次)这只需要恒定的存储。

通过摩尔投票算法查找出现
n/2次的多数元素

有关摩尔投票算法(),请参见给定链接的方法3

时间:O(n)

现在,在找到多数元素后,再次扫描数组并
删除多数元素
或使其成为
-1。

时间:O(n)

现在对数组的其余元素应用摩尔投票算法(但忽略-1,因为它已经包含在前面)。新的多数元素出现
n/4次。

时间:O(n)

总时间:O(n)

额外空间:O(1)

您可以对显示超过n/8、n/16…的元素执行此操作,。。。。时代

编辑:

可能存在数组中没有多数元素的情况:

例如,如果输入数组是
{3,1,2,2,1,2,3}
,那么输出应该是
[2,3]

给定大小为n和数字k的数组,查找出现次数超过n/k次的所有元素

有关答案,请参见此链接:

参考资料:

请描述几种方法。我不完全理解他们的论文,但一个关键的想法是使用一个袋子

在FORTRAN代码的形式验证方面有很多不可理解的证明和讨论,但它在解释多数算法如何工作方面有一个很好的开端。关键概念始于这样一个想法,即如果大多数元素是
A
,并且您一次删除一个
A
的副本和另一个副本,那么最终您将只有
A
的副本。其次,应该清楚的是,删除两个不同的项目(它们都不是
A
),只能增加
A
所占的多数。因此,移除任何一对物品都是安全的,只要它们是不同的。这个想法可以具体化。从列表中取出第一项并将其粘贴在一个框中。取出下一个项目并将其粘贴在盒子中。如果他们是一样的,就让他们都坐在那里。如果新的不一样,把它连同盒子里的一件东西一起扔掉。重复此操作,直到所有项目都在箱子或垃圾箱中。由于框一次只能有一种项目,因此可以非常有效地表示为一对
(项目类型,计数)

查找所有可能出现次数超过
n/k
次的项目的泛化过程很简单,但解释其工作原理却有点困难。其基本思想是,我们可以在不改变任何东西的情况下发现并销毁由
k
不同元素组成的组。为什么?如果
w>n/k
,则
w-1>(n-k)/k
。也就是说,如果我们去掉其中一个流行元素,同时去掉
k-1
其他元素,那么流行元素仍然流行


实现:不是只允许框中的一种项目,而是允许它们的
k-1
。每当你看到一组
k
不同的项目出现时(也就是说,框中有
k-1
类型,到达的一个与它们中的任何一个都不匹配),你会将每种类型中的一个扔进垃圾箱,包括刚刚到达的一个。这个“盒子”应该使用什么数据结构?当然是一个包!正如Misra和Gries所解释的,如果元素可以排序,一个带有O(logk)基本操作的基于树的包将使整个算法的复杂度达到O(nlogk)。需要注意的一点是,移除每个元素中的一个元素的操作是昂贵的(我认为O(k logk)),但该成本是在这些元素到达时摊销的,所以这不是什么大问题。当然,如果您的元素是可散列的而不是可排序的,那么您可以使用基于散列的包,在某些常见的假设下,它将提供更好的渐近性能(但不能保证)。如果您的元素是从一个小的有限集合中绘制的,您可以保证这一点。如果它们只能在相等性方面进行比较,那么你的包会变得更贵,我敢肯定你最终会得到类似于O(nk)的东西。

这个练习可能要求使用n/2的方法,而不是将算法作为子程序。如果最常见的元素不在大多数情况下,那么可能会重复什么?例如,如果1、2和3分别出现n/3次。上面链接的方法3在找到潜在多数元素后检查多数元素是否存在。但是如果没有多数元素,该方法可以提供几乎任何信息。该文章结尾的注释提到了后面的一个(出于愚蠢的原因,这本书实际上是在几年前出版的)这比你的建议要好得多。参见