无论线性表,栈还是队列,都是一对一,查询的时候,效率较低,数据量比较的大的情况
1.树的定义
一种数据结构,有层次关系的集合,根朝上,叶朝下
除了根节点外,每个子节点都有多个不想交的子树
父节点
子节点
兄弟节点
树根节点(根节点)
叶子节点
子树
空树
度:最大子树数,多少分支
层次(深度):第一层,第二次,以此类推,最大层数是4
森林:树多了
2.二叉树
树中包含的各个节点不能超过2,度不能超过2
二叉树衍生出满二叉树和完全二叉树,二叉树分为顺序存储的二叉树,基于链表存储的二叉树。
二叉排序树,平衡二叉树,赫夫曼树,红黑树,都是属于二叉树。
2.1二叉排序树,搜索树
比它小放它左边,比它大放右边。
查找复杂度较低,o(logn)
插入的数据总是比已有的数据大,子树会向一边切斜,树的层次变深,形成链表结构,出现了平衡二叉树。
2.2平衡二叉树
子树的高度不大于1,查询速度快,插入和删除慢,要进行旋转和平衡度计算。为了解决删除插入比较耗时,出现了红黑树
2.3红黑树
在平衡二叉树上增加了红色或黑色,增加了颜色属性
根节点和叶子节点是黑色,内部节点是红色和黑色较低,叶子节点必须是黑色,根节点只能是黑色。
从根节点走到空节点,所经过的黑节点的数目是相同的。
左旋和右旋,翻转颜色
AVL树和rb树的区别
3.多叉树
大规模数据存储,二叉树树的深度过深,导致查询效率低下,磁盘io读写过于频繁,导致查询效率低下,多叉树能够解决这个问题
b树,b+树
3.1 b-tree
b树适用于读写相对大的数据块的存储系统
每个节点可以存储超过2个元素,可以超过2的字节点
拥有AVL平衡树的特点
拥有二叉搜索树的特点
B树比较矮,分叉越多,树越矮,io次数较少,搜索性能较高。
三阶B树最多有3个分叉,四阶B树最多拥有4个分叉
一个节点最好凑够一个数据块的大小,凑够一个数据块的大小,直接写入磁盘。
一般4096b一个节点,因为一个磁道就4096b,但是不一定,根据你磁盘来弄。
3.2 b+tree
分为非叶子节点,叶子结点
内部节点只存储key,不存储值
叶子节点存储key和value具体数据,、
所有的叶子节点形成一个有序链表,排序和查询范围支持好。
b树的节点存储的元素个数是m,那么它的字节点数是m+1
b+比b树的优势,也是为什么mysql要选择b+树
b+存储更多的key,树的高度更低,时间复杂度越小,查询块
数据在叶子节点,每次都要到叶子节点,查询稳定,都是去第三层。
叶子节点构成链表结构,方便查询和排序