问题是:给定一个字符串列表和一个整数k,根据频率按降序返回前k个最常出现的单词。必须这样做O(N),其中N是字符串列表的长度。
流行的解决方案是将(字,频率)存储在哈希表中,按频率对哈希表进行排序,并输出前k个字。然而,这不是O(N),因为按频率排序需要O(NlgN)。
我想知道O(N)解决方案是否确实存在。我已经考虑过快速选择你得到第k个最常出现的单词的位置并对剩余的频率进行排序,但是当k表示为N时,这将是O(N + klgk)仍为O(NlgN)。
答案 0 :(得分:1)
是的,确实存在。没有必要对这些对进行实际排序。人们可以在O(n)中找到第k个元素(这是一个众所周知的算法)。然后,所有大于或等于第k个元素的元素都是顶部元素。
答案 1 :(得分:1)
是的,有一个O(n)解决方案。
您可以根据需要更改以O(n)的复杂度运行的着名SELECT算法 (算法的目的是找到N个元素中的第K个最小元素。)
以后你只需选择大于或等于"的元素。到算法返回的元素。
您可以在SELECT algorithm
找到更多详细信息