推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各类堆、各类队列、各类列表、各类树、各类图、各类排序等等几十篇的样子。mysql
B树即平衡查找树,通常理解为平衡多路查找树,也称为B-树、B_树。是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找、插入和删除。B树通常较多用在存储系统上,好比数据库或文件系统。算法
如下是一个四阶B树,sql
假设如今构建一棵四阶B树,开始插入“A”,直接做为根节点,数据库
插入“B”,大于“A”,放右边,网络
插入“C”,按顺序排到最后,数据结构
继续插入“D”,直接添加的结果以下图,此时超过了节点能够存放容量,对于四阶B树每一个节点最多存放3个值,此时须要执行分裂操做,并发
分裂操做为,先选取待分裂节点的中值,这里为“B”,而后将中值“B”放到父节点中,由于这里尚未父节点,那么直接建立一个新的父节点存放“B”,而原来小于“B”的那些值做为左子树,原来大于“B”的那些值做为右子树。机器学习
继续插入“E”,"E"大于“B”,往右子节点,数据结构和算法
分别于“C”和“D”比较,大于它们,放到最右边,学习
插入“F”,“F”大于“B”,往右子树,
“F”分别与“C”"D""E"比较,大于它们,放到最右边,此时触发分裂操做,
选取待分裂节点的中值“D”,而后将中值“D”放到父节点中,父节点中的“B”小于“D”,因而放到“B”右边,而原来小于“D”的那些值做为左子树,原来大于“D”的那些值做为右子树。
继续插入“M”,结果为,
插入“L’,大于“B”“D”,往右子树,
“L”大于“E”“F”小于“M”,因而放到第三个位置,此时触发分裂操做,
选取待分裂节点的中值“F”,而后将中值“F”放到父节点中,父节点中的“B”“D”都小于“F”,因而放到最右边,而原来小于“F”的那些值做为左子树,原来大于“F”的那些值做为右子树。
插入“K”,结果为,
插入“J”,大于“B”“D”“F”,往右子树,
“J”小于“K”“L”“M”,因而放到第一个位置,此时触发分裂操做,
选取待分裂节点的中值“K”,而后将中值“K”放到父节点中,父节点中的“B”“D”“F”都小于“K”,因而放到最右边,而原来小于“K”的那些值做为左子树,原来大于“K”的那些值做为右子树。此时父节点也触发分裂操做,
选取待分裂节点的中值“D”,而后将中值“D”放到父节点中,因为尚未父节点,那么直接建立一个新的父节点存放“D”,而原来小于“D”的那些值做为左子树,原来大于“D”的那些值做为右子树。
插入“I”,大于“D”,往右子树,
右子树不是叶子节点,继续往下,这时“I”大于“F”而小于“K”,因此往第二个分支,
“I”小于“J”,因而放到左边,
相似地,插入“H”,结果以下,
插入“G”,往左子树,
往中间分支,
触发分裂操做,
选取待分裂节点的中值“H”,而后将中值“H”放到父节点中,"H"大于父节点中的“F”而小于“K”,因而放到中间,而原来小于“H”的那些值做为左子树,原来大于“H”的那些值做为右子树。
综上所述,插入操做的核心是分裂操做。无需分裂的状况比较简单,直接插入便可;若是插入后超过节点容量,这个容量可预先自定义,则须要进行分裂操做,须要注意的是分裂可能引发父节点须要继续分裂。
对B树进行查找就比较简单,查找过程有点相似二叉搜索树,从根节点开始查找,根据比较数值找到对应的分支,继续往子树上查找。
好比查找“I”,"I"大于“D”,往右子树,
“I”分别与节点内值比较,大于“F”“H”而小于“K”,往第三个分支,
逐一比较节点内的值,找到“I”。
-------------推荐阅读------------
个人开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)
跟我交流,向我提问:
欢迎关注: