【问题标题】:Getting the 5 most occuring elements in a list with optimal time complexity [duplicate]以最佳时间复杂度获取列表中出现次数最多的 5 个元素 [重复]
【发布时间】:2019-03-24 08:46:48
【问题描述】:

我正在尝试从列表中获取 5 个最常出现的元素及其出现次数。我用一个时间复杂度为 O(5*n*n) 的解决方案解决了这个问题。

是否存在时间复杂度更高的最优解?

示例输入:

[['16.37.123.153','119.222.456.130','38673','161','17','62','4646']
 ['16.37.456.153','119.222.123.112','56388','161','17','62','4646']..]

示例输出:

MostOccurrentElements = [['16.37.123.153','119.222.456.130','38673','161','17','62','4646']..]
Counter = [134, ..]

MostOcccurrentElements 列表的第一个元素与计数器列表的第一个元素一起。

【问题讨论】:

  • 发布您的解决方案。示例问题和示例输出。
  • 使用收藏库中的计数器。
  • 我认为你可以通过最大堆实现获得更好的复杂性。

标签: python time element complexity-theory


【解决方案1】:

您可以使用heapq.nlargest 方法以 O(n log(t)) 时间复杂度获取出现次数最多的 5 个项目,其中 n 是项目数,t 是要获取的最大项目数。 collections.Counter 可以在 O(n) 时间内获得每个不同项目值的计数,因此总体而言,以下代码可以在平均 O(n log(t)) 内找到出现次数最多的 5 个项目:

from collections import Counter
import heapq
from operator import itemgetter
l = [1,1,2,3,3,3,3,4,4,4,4,5,5,6,6,6,7]
print(heapq.nlargest(5, Counter(l).items(), key=itemgetter(1)))

这个输出:

[(3, 4), (4, 4), (6, 3), (1, 2), (5, 2)]

编辑:正如@jpp 在评论中指出的那样,以上可以通过Counter 中的等效包装方法most_common 来完成:

print(Counter(l).most_common(5))

【讨论】:

  • 好的,我也可以得到如下输出: Elements = [3, 4 , 6, 1, 5] Counter = [4, 4, 3, 2, 2] 使用元素 1,2 ,3,4,5,6,7 本身就是一个字符串列表?
  • 你可以这样做:elements, counts = zip(*Counter(l).most_common(5))
  • 好的,如果我想用字符串获取嵌套列表中出现次数最多的元素,这也可以吗?
  • 不确定您所说的嵌套字符串列表是什么意思。你能用这个新要求的例子更新你的问题吗?
  • 好的,我用示例输入/输出更新了问题。提前感谢您的帮助:)
猜你喜欢
  • 2020-01-26
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
相关资源
最近更新 更多