0%

数据结构复习

数据结构相关的东西忘的差不多了,临时抱佛脚准备一波。

左堆

空路径长度:如果定义节点的空路径长度npl(x)为节点x到不满两个儿子的节点的最短路径,具有0个或1个儿子的节点的npl为0,空节点为-1,2个节点为1。

左堆:对堆中的每个节点x,左儿子的npl大于等于右儿子的npl。

有序表的查找

  • 顺序查找
  • 二分查找
  • 差值查找
  • 分块查找

查找树

二叉查找树

左子树的所有元素的键值都比根节点小。右子树所有元素的键值都比根节点大。

最坏的情况退化为单链表。

平均查找的时间复杂度是O(logN)

AVL树

节点的平衡度:节点的左子树的高度减去右子树的高度。

AVL树:满足每个节点平衡度都为0,-1,+1的二叉查找树

LL或RR情况:单旋转;LR或RL情况:双旋转;

所有操作在最坏情况都是对数级的

红黑树

红黑树时间代价也是对数级的。

红黑树是满足如下条件的二叉查找树:

  • 每个节点为黑色或红色。
  • 根节点为黑色。
  • 如果一个节点为红色,子节点必须是黑色。
  • 从任何一个节点出发到空节点的路径上必须包含相同数目的黑节点。

AA树

左儿子不能为红色的红黑树

伸展树

伸展树:将访问的节点向根节点旋转

B树

https://juejin.im/post/5d8194b5e51d4561e6237214

B+树

B+树有两种类型的节点:内部结点(也称索引结点)和叶子结点。内部节点就是非叶子节点,内部节点不存储数据,只存储索引,数据都存储在叶子节点。
内部结点中的key都按照从小到大的顺序排列,对于内部结点中的一个key,左树中的所有key都小于它,右子树中的key都大于等于它。叶子结点中的记录也按照key的大小排列。
每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接。
父节点存有右孩子的第一个元素的索引。

B+树相对于B树有一些自己的优势,可以归结为下面几点。

单一节点存储的元素更多,使得查询的IO次数更少,所以也就使得它更适合做为数据库MySQL的底层数据结构了。
所有的查询都要查找到叶子节点,查询性能是稳定的,而B树,每个节点都可以查找到数据,所以不稳定。
所有的叶子节点形成了一个有序链表,更加便于查找。

文件索引使用B树,B+树而不使用二叉树的原因:

索引存放在磁盘中,访问慢