如何评估适合索引的数据结构
索引的本质是一种数据结构
内存只是临时存储,容量有限且容易丢失数据。因此我们需要将数据放在硬盘上。
在硬盘上进行查询时也就产生了硬盘的I/O操作,而硬盘的I/O存取消耗的时间要比读取内存大很多。因此数据查询的时间主要决定于I/O操作的次数。
每访问一次节点就需要对磁盘进行一次I/O操作。
树模型
二分查找的时间复杂度是O(log2n),是一种很高效的查询方式。在一系类树种使用二分查找的树有很多,但并不是所有树都适合作为索引的结构。
Binary Search Tree 二叉搜索树(BST)
性质:
对任意节点,左子树不为空则左子树所有节点小于或等于该节点的值
对任意节点,右子树不为空则右子树所有节点大于或等于该节点的值
但二叉搜索树不一定是"平衡的",它有可能退化成一条链表,那么他的搜索时间就变成了O(n)。
平衡二叉搜索树(AVL)
为了避免退化成一条链表,人们提出了二叉搜索树,AVL在二叉搜索树的基础上增加了约束:
每个节点的左子树和右子树的高度差不能超过1
也就是说要求节点的左右子树仍然为平衡二叉树。
常见的平衡二叉树有很多种,包括了AVL树、红黑树、数堆、伸展树。AVL树是最早提出来的自AVL树,当我们提到平衡二叉树时一般指的就是AVL树
左右平衡后就使得搜索时间复杂度能稳定在O(log2n)。
但是即便在理论上它的搜索效率高且比较稳定,但是由于“每访问一次节点就需要进行一次磁盘I/O操作”,在实际情况中只有两个子节点的情况下,树的高度依然有可能会很高,比如说现有一个五层共31个节