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

红黑树

key-value  /  中序遍历有序

查找算法:遍历、二分(有序序列,二叉查找树 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树(字典树),常用在统计和排序大量字符串上,如自动机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值