Skip to content

WARNING

🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。

algo05 堆、并查集与跳跃表 — demo.py 代码详解

Download demo.py

运行方式

bash
cd docs/algorithms/basics/heap-unionfind/code
python demo.py

代码结构

功能复杂度
MinHeap最小堆 (push/pop/heapify)push/pop O(log n), heapify O(n)
UnionFind并查集 (路径压缩 + 按秩合并)find/union ~O(alpha(n))
SkipList跳跃表 (概率平衡多层链表)search/insert/delete O(log n) 期望

第1步:heapify 为什么是 O(n)?

python
def _heapify(self):
    for i in range(len(self._data) // 2 - 1, -1, -1):
        self._sift_down(i)

数学证明:底层节点(叶节点)不做操作(高度 0),倒数第二层最多下沉 1 次...根节点最多下沉 log(n) 次。总操作次数:

h=0lognn2h+1h<nh=0h2h=2n

第2步:路径压缩的威力

python
def find(self, x):
    if self.parent[x] != x:
        self.parent[x] = self.find(self.parent[x])  # 压缩!
    return self.parent[x]

压缩后,parent[x] 直接指向根。后续 find(x) 只需 O(1)。

第3步:跳跃表的概率层数

python
def _random_level(self):
    level = 0
    while random.random() < self.P and level < self.MAX_LEVEL:
        level += 1
    return level

P=0.5 时:50% 的节点在 level 0,25% 在 level 1,12.5% 在 level 2...期望总节点数 = n/(1-P) = 2n。

关键概念速查表

结构本质push/insertpop/delete查找空间
MinHeap数组+完全二叉树O(log n)O(log n)O(n)O(n)
UnionFind森林+路径压缩O(alpha(n))-O(alpha(n))O(n)
SkipList多层有序链表O(log n) 期望O(log n) 期望O(log n) 期望O(n) 期望

源码位置

clone 后打开(相对仓库根目录):

docs/algorithms/basics/heap-unionfind/code/demo.py