红黑树
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-树)
哈希:虽然效率高,但查询条件不能变,且没有部分查询和范围查询功能。
- hash(user_id) = key 一旦user_id变化,key就变化
- 联合索引: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树(字典树),常用在统计和排序大量字符串上,如自动机。