[数据结构] 二叉搜索树、平衡搜索树、B+树
参考博客:https://blog.csdn.net/yin767833376/article/details/81511377
1. 二叉查找树
左子树键值小于根键值,右子树键值大于根键值。
通常二叉查找树可以检查查找比较次数,提高搜索效率。但在某些极端情况下,由于插入数值的顺序会导致树不平衡甚至退化为链表。
2. 平衡二叉树AVL-Tree
在二叉树的基础上,保证任何节点左右子树高度最大差值小于1。
在进行插入或删除节点操作时,可能会导致AVL树失去平衡。情况可分为LL、RR、LR、RL四种情况。
在上述四种情况中,需要进行节点调整(旋转)操作确保树的平衡。其中LL和RR需要一次旋转,而LR和RL需要两次旋转。
具体的旋转操作此处不再赘述。
3. 平衡多路查找树B-Tree
为外存设备(如磁盘)设计的平衡查找树。
磁盘的读取以block为单位,读取时一次取出一个block到内存。
InnoDB存储引擎使用“页”作为管理磁盘的最小单位,默认每个页的大小为16KB。在windows系统采用NTFS对磁盘格式化时一般采用4K对其,那么每个block的大小应为4k,也就是说InnoDB的“页”将对应多个连续的block。
考虑数据库搜索索引的情景:
根据索引从磁盘读取键值,比较后决定接下来查找的索引。由于数据库的数据不能全部常驻内存,因此数据需要从磁盘读取,若要提高性能,那么:
a. 减少搜索比较值的次数。
b. 充分利用一次读取磁盘得到的数据。由于一次读取磁盘块得到的是多份数据,如果使用简单的搜索树会“浪费”一些读取的数据。
B-Tree特点如下:
a. 每一个节点对应一组连续的数据以及指针(指向孩子节点)。对于数据库,则是对应一个磁盘块(block)。
b. pi指针指向子树的所有数据值均小于当前节点的值k(i+1),但都大于ki。这意味着可以对同一个节点中的数据组进行二分查找确定目标值的位置。
c. 所有叶节点在同一层。这意味着B-Tree是平衡的。
相较于AVL Tree,B-Tree的节点更少,可以减少数据获取次数以提高查询效率。
4. B+Tree
InnoDB使用B+Tree实现其索引结构。
B+Tree中,非叶子节点上只保存键值和指针,只有叶子节点保存键值-数据,这样可以极大地提高单个节点(对应一个block)保存得指针和键值数量。
浙公网安备 33010602011771号