zoukankan      html  css  js  c++  java
  • 二叉排序树,B树和B+树的一些思考

    1、一句话概括什么是二叉排序树?

    左边比根节点小,右边比根节点大,并且,左右子树都是二叉排序树

    2、B+树查询的时间大概是多少?

    这和树的高度相关,log(n)

    3、hash存储索引,查询时间是多少?

    平均时间O(1)

    4、什么情况下使用平衡树?

    在二叉排序树问题中,会出现一些极端的情况,比如插入序列是有序的,就会出现二叉排序树退化成链表

     这时候,我们要用平衡树,在插入的时候同时调整这棵树,让它的节点尽可能均匀分布

    红黑树其实就是平衡树的一种,它的复杂的定义和规则,最后都是为了保证树的平衡性。

    5、为什么要费尽心思保证树的平衡性?

    因为树的查找性能取决于树的高度,让树尽可能平衡,就是为了降低树的高度。java中的TreeSet的底层就是用的红黑树

     6、一句话介绍B树?

     B树是一种多路搜索树,它的每个节点可以拥有多于两个孩子节点。M路的B树最多拥有M个孩子节点

     这是一个3路的B树,每个节点最多可以拥有3个孩子,同样是搜索树

    7、为什么要设计成多路?

    为了降低树的高度,路数越多,树的高度就越低

    8、为什么不能设计成无限多路?

    这样B树就退化成有序数组了

    9、我们知道B树一般用于文件系统的索引比较多,为什么文件系统的索引喜欢用B树而不用红黑树或有序数组呢?

    因为文件系统和数据库的索引都是存在硬盘上的,并且如果数据量大的话,不一定能一次性加载到内存中

    如果一棵树都无法一次性加载进内存,该怎么查找呢?

    B树的多路存储的威力就在于此,可以每次加载B树的一个节点,然后,一步步往下找

    假设内存一次性只能加载2个数,这么长的有序数组是无法一次性进内存的。

    如果把它组织成一棵三路的B树,这样每个节点最多有2个数。

     查找时候,每次载入一个节点进内存就行,如果在内存中,红黑树比B树效率更高,但是涉及到磁盘操作,B树就更优了。

     10、一句话概括什么是B+树?

    B+树是在B树基础上进行改造的,它的数据都在叶子节点,同时叶子节点之间还加了指针形成链表。

     这是一个4路B+树,它的数据都在叶子节点,并且有链表相连

    11、为什么B+树要这样设计?

    B+树在数据库的索引中用的比较多,如果数据库select数据,不一定只选一条,很多时候选多条,比如按照id排序后选10条。

    这样如果是多条的话,B树需要做局部的中序遍历,可能需要跨层访问,而B+树由于所有数据都在叶子节点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了

     比如选出7到19,只需要在叶子节点中就能找到。这就是B+树的威力

    12、既然hash比B+树更快,为什么MySql还用B+树来存索引?
    这和业务场景有关。如果只选一个数据,那确实是hash更快。但是数据库中经常会选择多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比hash就快很多了。

    而且数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。

    参考:

    为什么 MySQL 数据库要用B+树存储索引?

  • 相关阅读:
    SVN上新增一个项目和用户
    Linux增加swap分区的方法
    FPGA研发之道(25)-管脚
    altera tcl
    信号处理的好书Digital Signal Processing
    每天逛一次官方论坛
    GTS、GCK,GSR全称
    altera tcl
    FPGA组成、工作原理和开发流程
    复杂可编程逻辑器件CPLD的基本结构
  • 原文地址:https://www.cnblogs.com/GumpYan/p/14052645.html
Copyright © 2011-2022 走看看