是否有一个O(N)解决方案来获取List <string>中最顶层的字符串?</string>

时间:2014-08-09 16:58:57

标签: java string performance algorithm word-frequency

问题是:给定一个字符串列表和一个整数k,根据频率按降序返回前k个最常出现的单词。必须这样做O(N),其中N是字符串列表的长度。

流行的解决方案是将(字,频率)存储在哈希表中,按频率对哈希表进行排序,并输出前k个字。然而,这不是O(N),因为按频率排序需要O(NlgN)。

我想知道O(N)解决方案是否确实存在。我已经考虑过快速选择你得到第k个最常出现的单词的位置并对剩余的频率进行排序,但是当k表示为N时,这将是O(N + klgk)仍为O(NlgN)。

2 个答案:

答案 0 :(得分:1)

是的,确实存在。没有必要对这些对进行实际排序。人们可以在O(n)中找到第k个元素(这是一个众所周知的算法)。然后,所有大于或等于第k个元素的元素都是顶部元素。

答案 1 :(得分:1)

是的,有一个O(n)解决方案。

您可以根据需要更改以O(n)的复杂度运行的着名SELECT算法 (算法的目的是找到N个元素中的第K个最小元素。)

以后你只需选择大于或等于&#34;的元素。到算法返回的元素。

您可以在SELECT algorithm

找到更多详细信息