数组
数组是物理内存连续存储的数据结构,查找时通过下标计算地址:address = base_address + i * adrress_size (i为数组下标),所以时间复杂度是O(1)。
二叉树
二叉树每个节点只能有2个子节点,除了根节点外最多有一个父节点,普通二叉树最差情况的查找时间复杂度是O(n)
二叉查找树
1 二叉查找树:(1)左子树所有节点都比父节点小,右子树所有节点都比父节点大(2)二叉查找树中任意截取一个节点作为一棵树都是二叉查找树。
原因是:二叉查找树的特点取决于节点的插入。
2 二叉查找树和二分查找的时间复杂度都是O(logn),最大查找次数为树的高度
3 二叉树的插入和删除:
(1)插入:通过查找然后进行插入。
(2)删除:
- 被删除的节点只有一个左孩子或者一个右孩子:孩子节点直接替换删除的节点。(可以用枚举或者数学公式验证,跟删除的节点是左孩子还是右孩子无关)。
- 被删除的节点有左孩子和右孩子:用左子树最大值或右子树最小值替换。
4 二叉查找树的致命缺点:二叉查找树在插入的数据有序时会变成单链表。
5 二叉查找树本质上的思想是二分查找。二分查找的本质是指数。比如10亿才2的30次方。
二叉平衡树AVL
二叉平衡树:二叉查找树 + 任意节点左右子树的高度差不大于1。二叉平衡树的出现是为了解决二叉查找树在插入数据有序时退化成单链表的问题
二叉平衡树在插入时根据树偏向类型左-左、右-右、左-右、右-左进行旋转操作
红黑树
红黑树是为了解决二叉平衡树插入时频繁旋转的问题,红黑树是二叉查找树,是不规则的二叉平衡树.
红黑树:二叉查找树 + 树的最大高度/树的最小高度小于2。
如果保证树的最大高度/树的最小高度小于2:通过特定的树型结构加上变色和旋转
B树(B-树)
B树就是N叉平衡树,二叉平衡树是一个关键字 + 两个子节点,N叉平衡树是N-1个关键字 + N个子节点。因为N-1个关键字行程N个范围,所以是N叉平衡树。(N也叫阶)
B树的规则:如果是一个N阶的查找树(N叉平衡树),非根结点至少有Math.ceil(m/2)-1个关键字。
B树的插入和删除:节点的合并和分裂。
B+树
B+树的特点是:B+树的非叶子节点不保存关键字记录的指针,使得每个节点能存储更多关键字。由于mysql数据保存在磁盘上,数据检索需要进行磁盘IO-内存检索,B+树的高度低,IO次数少,非常适合mysql