考虑在一组N个独立且相同分布的浮点值中查找top-k元素的任务。通过使用优先级队列/堆,我们可以在所有N个元素上迭代一次,并通过以下操作维护top-k集:
如果元素x比堆头“更差”:丢弃x⇒复杂度O(1)
如果元素x比堆头“更好”:移除头部并插入x⇒复杂度O(log k)
这种方法的最坏情况时间复杂度显然是O(N log k),但平均时间复杂度呢?由于iid假设,O(1)操作的概率随时间增加,并且我们很少必须执行昂贵的O(log k),尤其是对于k <&lt;&lt; N.
这个平均时间复杂度是否记录在任何可引用的参考中?平均时间复杂度是多少?如果你的答案有可引用的参考,请加入。
答案 0 :(得分:3)
考虑第i个最大元素和特定排列。如果它出现在排列中不超过(i-1)个较大元素的k-1之前,它将被插入到k大小的堆中。
如果i <= k,那么堆插入发生的概率是1,如果i&gt;则是k / i。 ķ。
由此,您可以使用期望的线性度来计算堆调整数的期望值。它是和(i = 1到k)1 +和(i = k + 1到n)k / i = k + sum(i = k + 1到n)k / i = k *(1 + H(n) - H(k)),其中H(n)是第n个谐波数。
这大约是k log(n)(对于k <&lt; n),你可以从那里计算你的平均成本。