目的:用概率给有序链表加索引
跳表不是用旋转保持平衡,而是用概率把索引层做成“越来越稀疏的高速路”。
底层是完整有序链表
L0 保存所有 key,节点从小到大连接。任何查找最终都落到底层,因此跳表首先是一个有序集合或有序映射。
上层是随机索引
新节点插入时不断以概率 p “晋升”。若 p=0.5,约一半节点有 L1,四分之一有 L2,八分之一有 L3。
搜索像下楼梯
从最高层 head 出发,能向右就向右,下一步会越过目标时向下。路径单调前进,不会回头。
节点内存布局:一座塔就是一个 forward 数组
节点高度不是全局数组,而是节点自己的指针数组长度。高节点更少,所以总指针数期望为 n / (1-p)。
随机晋升:连续成功才继续升层
若 p=0.5,能到 L4 的节点大约只有 1/16。跳表靠这种几何分布形成“少数高塔,多数矮塔”。
每一层都是按 key 递增的链表,且高层链表是低层链表的子序列。
head 拥有最大层数,作为所有层的哨兵,避免边界分支散落在代码里。
搜索指针只向右或向下移动,因此访问过的位置不会再次访问。
更新只依赖每层前驱 update[i],不会触碰与搜索路径无关的节点。