编写一个算法来查找数组中出现频率最高的元素。给出算法的时间复杂度

Posted

技术标签:

【中文标题】编写一个算法来查找数组中出现频率最高的元素。给出算法的时间复杂度【英文标题】:Write an algorithm to find the most frequently occurred element in the array. Give Time complexity of algorithm 【发布时间】:2014-11-25 12:36:07 【问题描述】:

我正在做“算法分析”的任务,我被这个问题困住了,我明天必须提交它,我需要帮助。如果你能解决这个问题,请回答。

给定一个包含 n 个数字的数组 A,编写一个有效的算法来找到最频繁的 该数组中发生的元素(该数组的模式)。还要分析你的时间复杂度 算法。

【问题讨论】:

到目前为止你尝试了什么? 我开发了一种算法,每次元素出现时进行计数,然后进行比较。但效率不高。 @DaimShahzad 至少显示您当前的结果。但我认为这更适合计算机科学 stackexchange 网站之一。 您希望的复杂度是多少?排序和计数是 O(n log n)。我不确定是否可以做得更好。 【参考方案1】:

由于这是一个作业,我将只给你一个关于复杂性上限和类似问题的提示。

这个问题比Element Distinctness Problem1要难一些。元素区别问题被称为无法比O(nlogn) 最坏情况更好地解决。元素区别的解决方案是:

    排序和迭代 - O(nlogn) 创建元素的集合/直方图并检查唯一性。这是使用hashtables 在O(n) 平均情况和O(n^2) 最坏情况和O(n) 额外空间中完成的。

考虑这两种方法,并尝试考虑如何修改它们以解决您的问题。 另外,元素区别的下限告诉你没有比O(nlogn)最坏情况更好的算法了。


(1) 元素区别问题:数组中的所有元素都是不同的吗?或者是否有任何元素在其中也有自己的副本?

【讨论】:

@DaimShahzad 如果所有元素都是不同的,怎么会有最频繁出现的元素?显然所有元素出现的次数都相同。 哦,对不起,这是另一个问题。所有元素都不是不同的。

以上是关于编写一个算法来查找数组中出现频率最高的元素。给出算法的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

查找并返回数组中出现频率最高的元素

查找数组的最高频率以及具有该频率的所有元素

js查找数组中出现次数最多的元素

二分查找

代码题(12)— 二分查找

二分查找