V

算法可视化

ZHEN
分享到微博分享到 XGitHub 仓库个人主页
学习工具算法复杂度速查算法学习路径
数据结构数组链表栈队列树堆哈希表图字典树并查集LRU 缓存跳表线段树B+ 树布隆过滤器树状数组
经典排序算法冒泡排序鸡尾酒排序双调排序选择排序插入排序二分插入排序希尔排序归并排序自顶向下归并快速排序三路快排双轴快排堆排序计数排序基数排序桶排序
图算法Dijkstra 最短路Kruskal 最小生成树Prim 最小生成树Bellman-Ford 最短路拓扑排序Floyd 多源最短路强连通分量2-SAT最大流二分图匹配LCA 倍增欧拉路径
动态规划编辑距离0-1 背包完全背包最长公共子序列最长递增子序列硬币找零方案数石子合并旅行商 TSP树形 DP数位 DP换根 DP
回溯与搜索N 皇后子集生成全排列组合总和迷宫寻路岛屿数量单词搜索数独A* 寻路
字符串KMP 字符串匹配Rabin-KarpBoyer-MooreManacher后缀数组LCP / height 数组AC 自动机Z 函数
数学与数论埃氏筛线性筛欧几里得算法快速幂扩展欧几里得中国剩余定理欧拉函数米勒-拉宾FFTPollard's Rho
计算几何凸包旋转卡壳最近点对线段相交扫描线求交
查找二分查找二分边界旋转数组搜索二分答案三分查找

跳表 Skip List

数据结构 · 给有序链表加几层「快车道」

什么是跳表

有序链表查一个值得从头一个一个走,O(n)。跳表的点子很妙:在它上面再架几层快车道——最底层是全部元素,每往上一层只保留一部分做索引,像高速公路的出入口越往上越稀。

查找从最高层快车道往右大步走,一旦「下一个就超过目标」,就下沉一层接着走,到最底层看命中没。这里固定放了 8 个值、4 层(最底层全有,往上折半)。查一个值,看它怎么走楼梯、怎么一步跳过中间一串。

亲手试试
HHHH1111355799911131315

输入一个值「查找」——看它怎么在高层快车道上大步跳。

因为高层一步能跨过好几个元素,平均查找只要 O(log n),比有序链表快得多,又比平衡树好实现。那插入时新元素该升到第几层?靠抛硬币随机决定(大约一半概率再往上升一层)——所以跳表是概率型结构,期望层数 O(log n)。本质上,它就是一摞多层链表。

跳表在哪里用

Redis 有序集合 zset:底层就是跳表 + 哈希表。
需要有序 + 范围查询又想好实现的场景,常拿它替代平衡树。
并发场景:跳表的无锁 / 细粒度锁实现比平衡树好做(如 Java ConcurrentSkipListMap)。

它是链表家族里「用空间换时间」的漂亮一招——也是这趟结构之旅里的进阶一站。