【问题标题】:Average time complexity of finding top-k elements查找前 k 个元素的平均时间复杂度
【发布时间】:2014-01-09 12:39:34
【问题描述】:

考虑在一组 N 个独立且同分布的浮点值中找到前 k 个元素的任务。通过使用优先级队列/堆,我们可以对所有 N 个元素进行一次迭代,并通过以下操作维护一个 top-k 集合:

  • 如果元素 x 比堆头“差”:丢弃 x ⇒ 复杂度 O(1)

  • 如果元素 x 比堆的头部“更好”:移除头部并插入 x ⇒ 复杂度 O(log k)

这种方法最坏情况的时间复杂度显然是O(N log k),但是平均时间复杂度呢?由于 iid 假设,O(1) 操作的概率随着时间的推移而增加,我们很少需要执行代价高昂的 O(log k),尤其是对于 k

这个平均时间复杂度是否记录在任何可引用的参考文献中?平均时间复杂度是多少?如果您的答案有可引用的参考资料,请附上。

【问题讨论】:

  • IMO for k
  • @Dukeling:我不是在寻求推荐。我应该以具有唯一答案的方式修改问题吗?例如,通过请求包含此结果的 first 发布?对我来说,问题更多的是这样的参考是否存在。
  • 对可引用参考的请求与此网络无关。问“我怎么做/找到这个/这是什么”这个问题很好,但如果你真的寻求研究帮助,那就不合适了。
  • 元讨论here.
  • 与其要求引用,为什么问题不只是“平均时间复杂度是多少?”从第一原则中弄清楚并不难(例如:见我的回答)。

标签: algorithm heap complexity-theory time-complexity top-n


【解决方案1】:

考虑第 i 个最大的元素和一个特定的排列。如果它出现在不超过排列中 (i - 1) 个较大元素的 k-1 个之前,它将插入到 k 大小的堆中。

如果 i k,则为 k/i。

据此,您可以使用期望的线性度来计算堆调整次数的期望。它是 sum(i = 1 to k)1 + sum(i = k+1 to n)k/i = k + sum(i = k+1 to n)k/i = k * (1 + H(n) - H(k)),其中H(n)是第n次谐波数。

这大约是 k log(n)(对于 k

【讨论】:

  • 如果 k 很大,k * (log n - log k) 或 k * log (n / k) 会给出更好的结果。例如,如果 k = n / 2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多