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
计算几何凸包旋转卡壳最近点对线段相交扫描线求交
查找二分查找二分边界旋转数组搜索二分答案三分查找

B 树与 B+ 树

数据结构 · 数据库与文件系统的索引

什么是 B 树

二叉查找树一个节点只存 1 个值、2 个孩子,数据一多就长得又瘦又高,查一次要走很多层。B 树反其道:一个节点存「一排有序 key + 一排孩子指针」,又矮又宽。所有叶子在同一层,几层就能在海量数据里定位——这正适合磁盘:一次 IO 读一个节点(能装几十上百个 key),层数越少 IO 越少。

B+ 树:数据全在叶子 + 叶链

B+ 树是 B 树的改良:内部节点只存「路标」做路由、不存数据,所有数据都落在叶子;叶子之间还用链表串起来。这样区间查询特别快——定位到起点叶子后,顺着叶链一路扫过去即可。MySQL InnoDB 主键索引、很多文件系统的目录索引,用的都是 B+ 树。

下面是一棵装了 12 个数的 B+ 树(2 层)。填 a 点「查找」看它从根下钻几层就命中;填 a、b 点「范围查」看它定位起点叶后顺着叶链横扫一段。

亲手试试
254551015202530354045505560

填 a 点「查找」看从根下钻几层就命中;填 a、b 点「范围查」看顺着叶链横扫一段。

查找:从根开始,在节点的有序 key 里比较,决定走哪个孩子指针,几层就到叶子——O(log n),但因为「多路」底数大,层数比二叉树少得多。范围查询:B+ 树定位一次再顺叶链扫,省去回树。插入太满时节点会「分裂」、删空会「合并」来保持平衡(这里是固定结构,分裂/合并只作了解)。

B 树 / B+ 树在哪里用

数据库索引:MySQL InnoDB 用的就是 B+ 树。
文件系统:目录 / inode 索引。
任何「海量有序数据 + 按 key 查 + 范围扫」的磁盘场景。

它把「多路 + 平衡 + 磁盘友好」做到了极致——这趟结构之旅里工程味最浓的一站。