“Heap”的版本间的差异

来自wrc's Wiki
跳到导航 跳到搜索
(建立内容为“== 找前 ''n'' 大的数 == 参考 Python 的实现:https://github.com/python/cpython/blob/3.9/Lib/heapq.py#L521 * 先 push ''n'' 个元素到小根堆中(…”的新页面)
 
 
(未显示同一用户的2个中间版本)
第1行: 第1行:
== 找前 ''n'' 大的数 ==
+
== 时间复杂度 ==
  
参考 Python 的实现:https://github.com/python/cpython/blob/3.9/Lib/heapq.py#L521
+
* push:最坏 O(log n),平均 O(1)
 +
* pop:O(log n)
 +
 
 +
== 找前 ''n'' 大的数(top K) ==
  
 
* 先 push ''n'' 个元素到小根堆中(找前 ''n'' 小则用大跟堆)
 
* 先 push ''n'' 个元素到小根堆中(找前 ''n'' 小则用大跟堆)
* 对剩下的元素,和堆顶比较,若更大则替换堆顶
+
* 对剩下的元素,和堆顶比较,'''若更大'''则替换堆顶
 +
 
 +
时间复杂度 O(n logk)。
 +
<syntaxhighlight lang=python>
 +
def topk(xs: list[int], k: int):
 +
    heap = []
 +
    for x in xs:
 +
        if len(heap) >= k:
 +
            if x > heap[0]:
 +
                heapq.heapreplace(heap, x)
 +
        else:
 +
            heapq.heappush(heap, x)
 +
    return heap
 +
</syntaxhighlight>
  
 
[[Category:刷题]]
 
[[Category:刷题]]

2022年10月8日 (六) 13:49的最新版本

时间复杂度

  • push:最坏 O(log n),平均 O(1)
  • pop:O(log n)

找前 n 大的数(top K)

  • 先 push n 个元素到小根堆中(找前 n 小则用大跟堆)
  • 对剩下的元素,和堆顶比较,若更大则替换堆顶

时间复杂度 O(n logk)。

def topk(xs: list[int], k: int):
    heap = []
    for x in xs:
        if len(heap) >= k:
            if x > heap[0]:
                heapq.heapreplace(heap, x)
        else:
            heapq.heappush(heap, x)
    return heap