树类型 | 实现 |
---|---|
Self-balance binary search tree 平衡二叉查找树 | AVL树、红黑树、节点大小平衡树 |
树 | 节点的儿子个数 | 是否平衡 | 备注 | 时间复杂度 |
---|---|---|---|---|
BST 二叉查找树 binary search tree | 只有二叉 | 不平衡 | 并不是B树 | O(logN) 计算机中lg以2为底 数学里logN又记作lgN 以十为底ln e以e为底 |
B树(B-Tree、B-树,中间是杠不读减号) Balance tree | n阶(最简单是 2-3树) | 平衡 | 节点全部存数据,是没有索引的。 | |
B*树 | 多路搜索树 | 平衡 | 在B+树的基础上对非根和非叶子节点增加指向兄弟的节点 | |
B+树 | 多路搜索树、mysql里1280阶 | 平衡(层数最深与最浅小于等于1 ) | 是节点故意成的不同的形状,最后一层存数据,前面几层存索引 | 插入数据时候扩展页节点比跳表方便,且层数少,插入修改索引页 |
跳表 | redis 当需要查找内存中很长的链表中的数据时候,跳表可以加速,层数多需要保证顶层链表长度只有2,空间换时间 | 插入无需树的旋转开销 | ||
红黑树 | (由234树发展而来) |
MySql最大数据量计算方式
页面节点索引量x^(层数n-1) · 数据节点行y
一般x = 15kB除以(12B/个) = 1280个 索引页
(1280页) ^ (3-1层) · (15行/页) = 2.5千万(行)
B+树和红黑树差异
一般的跳表是带有二阶树索引的链表(如果存千万条数据,很深起码得24层),如果底层存储数据的地方是链表查找的话肯定没有队列下标索引快。完全可以改成1280多阶数组队列(不可以,你上面还是得加,不然链表查询还是很慢),但是,需要初始就给划定所有的空间(redisList里是先头插或尾插后再维护索引),没有B+树灵活。
顺带一提redis是跳表,纯内存IO不再是瓶颈,层高就不再是瓶颈(链表会不会还是瓶颈?)
n阶层B树(n>=3) 是 多路搜索树
二叉树 才是BST
B+tree 也是 多路搜索树 ,但是节点故意成的不同的形状