查找数组中的元素是否比某个值更频繁地出现

时间:2013-11-05 01:17:47

标签: arrays algorithm

我遇到的问题是给定一个数组,A [1 ... n]的n(不一定是不同的)整数,找到一个算法来确定是否有任何项目在A中出现超过n / 4次的上限。< / p>

似乎最好的最坏情况时间是O(n)。我知道多数元素算法,我想知道这是否适用于这种情况。如果您对解决此问题有任何建议,请与我们联系。

2 个答案:

答案 0 :(得分:5)

这只是一个算法的概念,但我相信它应该可以使它工作。

主要技巧如下。如果你看看任何四个元素并且它们都是不同的,你可以扔掉所有四个元素。 (如果任何抛出的元素在旧数组中的频率超过1/4,它将在新数组中;如果没有,则没有。)

所以你去一个阵列,丢掉四个元组,并重新安排其余部分。例如,如果您有AABC然后是DDEF,则重新排列到AADDBCEF并抛弃BCEF。我会让你弄清楚细节,这并不难。最后,你应该留下一对相同的元素。然后你扔掉奇数元素并重复。

每次跑步后,你可能会留下1,2或3个元素,没有你不能丢弃的对。不用担心,你可以结合两次运行的剩余物,这样剩下的堆中永远不会有超过3个元素。例如。如果在跑完1之后你有A,B,C并且在跑2之后你有A,D,E你只留下A.记住第二次跑的元素计数两次,所以实际上你有3“A,这超过总共9个中的1/4。保留每个剩余元素的数量以跟踪它们中的哪一个可以丢弃。(你可能总是保留最后剩余的,我没有检查过。)

最后,您将只剩下残羹剩饭。检查每个原始数组。

答案 1 :(得分:-2)

这个元素有三种可能性,或者它是数组的中值,或者是数组的n / 2个最小元素的中值,或者是数组的n / 2个最大元素的中值。

在所有情况下,首先找到数组的中位数。之后检查它是否出现在至少n / 4个元素中,如果没有则将数组分成几个相同大小的两个部分(它们的大小最多只有一个元素):

  • 小于等于中位数
  • 大于等于中位数

然后找到这两个子阵列中每个子阵列的中位数,并检查每个子阵列的出现次数。这是所有O(n)。同样通过这种方式,您可以找到出现次数至少为n / 4次的所有元素。

顺便说一句,您可以扩展此技术以查找具有O(n)时间出现的任何元素(例如n / 10000),这在O(n)中再次起作用。