自我提升(二) 数据结构各种树

一、适用于内存级别的Tree

  • 平衡二叉树

    • 左边节点全部小于根节点,右边节点全部大于根节点,是二分法的延伸,时间复杂度O(logn)
    • 优点:查询速度快
    • 缺点:当数据都是大于或都是小于根节点的时候,趋近于链表,复杂度重新变成O(n)了
    • O(logn)是咋算出来的? 假设一个二叉树有n层,那最多存储2的n次方的数据,反推想要查找到某一个数据最多查到最后一层才找到,那么也就是logn次。
  • AVL树

    • 改进后的平衡二叉树,左右子树的高度差不超过1,通过左旋和右旋
    • 优点:不会有趋近于链表的情况,结构更平衡,查询速度快
    • 缺点:数据量大的时候,为了保证高度差不超过1的规则,频繁的调整树的结构,影响性能
  • 红黑树(RB-Tree)

    • 改进后的平衡二叉树,自平衡的二叉搜索树
    • 规则:根节点是黑色的;叶子节点(NIL)是黑色节点;不能有2个挨着的红色;每个节点到叶子节点的路径中都有相同 的黑色节点。 通过左旋,右旋,变色来保持平衡
    • 优点:插入和删除节点时候旋转次数要少于AVL树,用非严格的平衡规则换取旋转次数的降低
    • 缺点:由于牺牲平衡换取的旋转次数,所以查询速度不一定有AVL快
    • 总结: 查询量大的用AVL,增加删除大的用RB,查询增加删除差不多的用RB

但是! 当数据量大的时候无论什么树,高度都会很高,都不适合IO级别的操作,更适合内存级别的操作
如HashMap,TreeSet之类的。 数据库底层结构不适合使用以上的Tree作为底层。

二、适用于数据库系统和文件系统的Tree

  • B Tree

    • 平衡多路查找树,二叉树的一般化,允许有多个子节点,非常适合读取和写入相对比较大的数据块的存储系统;
    • 以内存块(也就是page)的形式存储和读取,索引和数据是存在一起的;
  • B+ Tree

    • mysql的innodb引擎;默认一个内存块(page)的大小 = 16kb;
    • 增强版的B Tree, 增强在哪里?
    • 叶子节点只存索引(有顺序)不存数据,这样一个叶子节点可以存更多的数据,查询的时候先找到数据所在的叶子节点,在找到真正数据,减少磁盘IO次数, 非叶子节点存真正的数据也有顺序, 且非叶子节点间形成了双向链表更方便范围查找;
    • 一个2层的b+tree可以存储约2000w条数据;
    • 注意:要写出合适的sql才能最大程度的利用索引提高查询效率。否则依然是全表扫描;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值