当前位置: 首页 > 面试题库 >

Python集合计数器:most_common复杂度

秦奇
2023-03-14
问题内容

Python中对象most_common提供的功能的复杂性是什么collections.Counter

更具体地说,是否Counter在计数时保留某种排序列表,以使其most_commonO(n)n计数器中添加(唯一)项的数量更快地执行操作?仅供参考,我正在处理大量文本数据,以尝试找到第n个最频繁的标记。

我检查了CPython
Wiki上的官方文档和TimeComplexity文章,但找不到答案。


问题答案:

从collections.py的源代码中,我们看到,如果不指定返回的元素数,则most_common返回计数的排序列表。这是一种O(n log n)算法。

如果使用most_common返回k > 1元素,则使用heapq.nlargest。这是一个O(k) + O((n - k) log k) + O(k log k)算法,对于一个很小的常量非常有用k,因为它本质上是线性的。这一O(k)部分来自对初始k计数进行堆放,第二部分来自n - kheappushpop方法的调用,第三部分来自对k元素的最终堆进行排序。既然k <= n我们可以得出结论,复杂度是:

O(n log k)

如果k = 1这样的话,很容易表明复杂度是:

上)



 类似资料:
  • 问题内容: ES6规范为键集合(Set,Map,WeakSet和WeakMap)提供什么时间复杂度(大O表示)? 我的期望,我期望的大多数开发人员,是规范和实现将使用被广泛接受的高性能算法,在这种情况下,并在平均情况下都是O(1)。这同样适用于和等效物。 对我来说,实现的时间复杂性是否在例如ECMAScript 2015 Language Specification-6th Edition — 2

  • 是查找所有r项组合的强大工具,但是,我想知道它的计算复杂性。 假设我想知道n和r的复杂性,当然它会给出n个项列表中所有r项的组合。 根据官方文件,这是粗略的实施。

  • 我有一种情况,我需要根据一个数组值执行一个group by操作,该数组值将字段值的出现次数相加。然后对计数进行过滤,并准备结果,以便根据条件显示结果。从本质上讲,文档被转换回如果您只使用find函数就会呈现的方式。由于matchedDocuments数组中收集的项的数量,我遇到了临时文档太大的问题。任何关于如何改进这一点的建议都将是有益的。 以下是一些示例文档和基于上述标准的预期结果:

  • 如果是,我该怎么做?

  • 我在考虑如何正确计算这个函数的时间复杂度: 我假设它是 O(n),其中 n 是列表的长度。我们的 while 循环是 O(n),for 循环也是 O(n), 这意味着我们得到了 2*O(n),等于 O(n)。 我说的对吗?

  • 在最近的一次测试中,我们得到了一个函数来计算未排序的ArrayList中出现了多少个double(不是原语double,而是一个项目出现了两次)。 我正确地确定了Big O复杂度为O(N^2),但由于我错误地确定了全部复杂度,因此只获得了部分学分。函数如下: 在他刚刚发布的考试解决方案中,他给出了这样的解释: 输入集合中有N个项,该方法通过一个缩减步骤反复调用自己,该步骤生成一个新索引N次,直到达