• 红黑树和B+树的应用场景


    具体的红黑树介绍参考:红黑树原理以及插入、删除算法 附图例说明

    红黑树

    查找算法:遍历、二分(有序序列,二叉查找树 2^x=n树高=lgn,O(lgn))、哈希(最高效)、插值(二分的优化)、索引(搜索引擎、lucene)、BFS/DFS(图论的遍历)、平衡树、B树、B+树、红黑树(高效的查找算法)、二叉搜索树

    哈希:O(1) 查找、哈希冲突(即一个hash值下挂了很多点)、JDK1.8里的HashMap:链表+红黑树(处理哈希冲突,一个key对应一个计算出来的hash值,多个key对应了同一个hash值,则需要用链表来存储这多个key,链表长度大于8改用红黑树存储)

    JDK1.7 HashMap:数组+链表 -> JDK1.8HashMap:链表+红黑树

    AVL树:平衡二叉树,追求极致的平衡,有很多规则的理想状态(实际应用中一般不会用到)

    红黑树的底层结构:特数的二叉查找树 【链表->二叉树->二叉查找树->特数的二叉查找树(自平衡的二叉查找树)】

    红黑树的树高如果过大,会造成磁盘IO读写过于频繁,进而导致效率低下,因此红黑树一般都用在数据量较小,可以完全放进内存中的情况下,此时红黑树的时间复杂度比B树要低。

    红黑树是一个近似平衡的二叉树,比AVL树旋转次数少,所以可以用在插入次数频繁的情况下。

    应用场景:

    • C++ 的 STL 中,map 和 set 是用红黑树实现的
    • java 底层的 TreeMap 是用红黑树实现的
    • linux 进程调度 Completely Fair Scheduler,用红黑树管理进程控制块
    • epoll 在内核中的实现,用红黑树管理事件块
    • nginx 中,用红黑树管理 timer

    B+树

    mysql 里如何查找?

    遍历(暴力)、目录查找(类似索引)、键查找(hash查找)、二分(B+树的基础算法)

    能做索引的数据结构有哪些?

    数组、红黑树、链表、哈希、B树(B+树、B-树)

    哈希:虽然效率高,但查询条件不能变,且没有部分查询和范围查询功能。

    1. hash(user_id) = key 一旦user_id变化,key就变化
    2. 联合索引:hash(user_id+name) = key 如果只传 user_id,不能支持部分索引查询和范围查找

    红黑树:访问速率:内存>ssd固态硬盘>磁盘,读取磁盘次数多、读取浪费太多(磁盘一页能存16k数据)

    但为什么红黑树可以用在 hashmap 中呢?因为 hashmap 存在内存里。

    B、B+树都是多路查找树,一般用在数据库中做索引,因为他们分支多层数少,磁盘IO非常耗时,而大量数据都存储在磁盘中,所以要有效减少磁盘IO次数来避免频繁访问磁盘。

    B+比B的优势:

    B+树非叶结点存键值,叶子结点存数据,单个结点占空间少,而磁盘容量、一次读取数据大小固定,磁盘IO次数少,效率高;

    叶子结点用链表存放数据,范围查找、遍历的效率比B树高

    应用场景

    • B树:数据库和文件系统,将相关数据尽量集中在一起,以便一次读取多个数据减少磁盘操作次数。如 mongoDB 数据库。
    • B+树:数据库和文件系统。如 mysql 用 B+ 树做索引。

    PS:还有一种Trie树(字典树),常用在统计和排序大量字符串上,如自动机。

     

    红黑树的4种应用场景:虚拟内存管理、进程调度、sk_buff、epoll

    参考:红黑树和B+树的应用场景

  • 相关阅读:
    【MOSS】SPUser的操作
    退出登录跳出框架页
    F12转到定义时,总是显示从元数据 转载粘贴
    简易代码生成器
    C语言I博客作业04
    第一周作业
    C语言I博客作业02
    C语言I博客作业02
    【DukeImage】Week_5 Segmentation
    【LeetCode】#7 Reverse Integer
  • 原文地址:https://www.cnblogs.com/aspirant/p/16149400.html
Copyright © 2020-2023  润新知