编写一个算法来查找数组中出现频率最高的元素。给出算法的时间复杂度
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 如果所有元素都是不同的,怎么会有最频繁出现的元素?显然所有元素出现的次数都相同。 哦,对不起,这是另一个问题。所有元素都不是不同的。以上是关于编写一个算法来查找数组中出现频率最高的元素。给出算法的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章