前言:本文章来源于我在知乎上回答的一个问题

AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中?

看完后您可能会了解到这些数据结构大致的原理及为什么用在这些场景,文章并不涉及具体操作(如插入删除等等)


文件夹

  • AVL树

    • AVL树原理与应用
  • 红黑树
    • 红黑树原理与应用
  • B/B+树
    • B/B+树原理与应用
  • Trie树
    • Trie树原理与应用

AVL树

简单介绍:

AVL树是最早的自平衡二叉树,在早期应用还相对来说比較广。后期因为旋转次数过多而被红黑树等结构代替(二者都是用来搜索的)。AVL树内部是有序的。


原理:

平衡二叉树,通常是用平衡因子差值推断是否平衡并通过旋转来实现平衡。左右子树树高差不超过1。那么和红黑树比較它是严格的平衡二叉树,平衡条件很严格(树高差仅仅有1),仅仅要插入或删除不满足上面的条件就要通过旋转来保持平衡。因为旋转是很耗费时间的。我们能够推出AVL树适合用于插入删除次数比較少,但查找多的情况,而且保证深度是Olog(n)。

下图为一棵AVL树

側边是平衡因子,我们能够看到随意节点的左右子树的平衡因子差值都不会大于1,所以维持这颗强平衡二叉树的条件就很严格了。


应用:

Windows内核通过AVL树来保存一些离散的地址空间.

原因可能是訪问次数多于插入删除的次数。AVL树的高度较低于红黑树等


红黑树

简单介绍:

平衡二叉树。因为旋转次数较少在插入删除操作多的情况下性能高于其它平衡二叉树,所以被广泛应用。

内部是有序的


原理:

平衡二叉树,通过对不论什么一条从根到叶子的简单路径上各个节点的颜色进行约束(红和黑),确保没有一条路径会比其它路径长2倍。因而是近似平衡的(一个节点的两棵子树高度不会相差二倍),是一棵弱平衡二叉树。所以相对于严格要求平衡的AVL树来说,它的旋转保持平衡次数较少。用于搜索时,插入删除次数多的情况下我们就用红黑树来代替AVL。

一个简单的红黑树


应用:

1.c++STL 包含set。multiset,map,multimap(侯捷前辈的STL源代码剖析比較具体)。

c++关联容器

java容器中的TreeMap

2.IO多路复用的epoll,内部用红黑树来维持我们想要监控的socket。

以支持高速的插入和删除

3.nginx中定时器是用红黑树来维持的,因为红黑树是有序的,每次从红黑树内部取出最小的定时器就可以。

4.linux内核中用红黑树来管理进程的内存使用。进程的虚拟地址空间块都以虚拟地址为key值挂在这棵红黑树上。


B/B+树

B-树參考这篇文章:) 从 MongoDB 及 Mysql 谈B/B+树

简单介绍:

B/B+树主要用在数据库或者大型索引数据中。是一种多路查找树。(注意B树和B-树是同一个,B-树不是”B减树”。”-“仅仅是个符号)


原理:

B树,B+树:它们特点是一样的,是多路查找树,一般用于数据库系统中,为什么,因为它们分支多层数少呗(一般一个节点有成千上万个子节点,所以B树层数是很少的,节点个数为N个高度为logN,可是这个log的底数不是我们经常使用的2了。而是一个节点的子节点个个数,底数很大从而树高度很低)。都知道磁盘IO是很耗时的(和内存訪问速度差千倍),而像大量数据存储在磁盘中所以我们要有效的降低磁盘IO次数避免磁盘频繁的查找。降低磁盘IO就意味着提升性能。

B+树是B树的变种树,有n棵子树的节点中含有n个keyword。每一个keyword不保存数据(也就是节点仅仅保存key),仅仅用来索引。数据都保存在叶子节点。是为文件系统而生的。

一棵B树

一棵B+树


应用:

B树一般用在数据库等大型索引。主要原因就是层数少,重点—>降低避免磁盘IO

B+树适应文件系统,想下文件系统的样子。文件夹并不保存文件仅仅有底层叶子节点保存数据。


Trie树

简单介绍:

又名单词查找树。主要处理字符串。字符串的同样前缀保存在同样的节点中。它的变种树许多。

比方:

前缀树(prefix tree),后缀树(suffix tree)

详情见 从前缀树谈到后缀树

radix tree(patricia tree, compact prefix tree, 基数树)

crit-bit tree(解决耗费内存问题)

double array trie


原理:

它是不同字符串的同样前缀仅仅保存一份。

相对直接保存字符串肯定是节省空间的。可是它保存大量字符串时会很耗费内存(是内存)。


相似下图


应用:

前缀树(prefix tree):

1.字符串高速检索

2.字符串排序

3.最长公共前缀

4.自己主动匹配前缀显示后缀。

后缀树(suffix tree):

1.查找字符串s1在s2中

2.字符串s1在s2中出现的次数

3.字符串s1,s2最长公共部分

4.最长回文串

详情还是见

从前缀树谈到后缀树

radix树:

1.ip路由表–《TCP/IP具体解释卷2:实现》笔记–Radix树路由表

2.linux内核内存管理–戳linux内核radix


完

AVL树,红黑树,B-B+树,Trie树原理和应用的更多相关文章

  1. 浅谈树形结构的特性和应用(上):多叉树,红黑树,堆,Trie树,B树,B+树...

    上篇文章我们主要介绍了线性数据结构,本篇233酱带大家康康 无所不在的非线性数据结构之一:树形结构的特点和应用. 树形结构,是指:数据元素之间的关系像一颗树的数据结构.我们看图说话: 它具有以下特点: ...

  2. 【转】B树、B-树、B+树、B*树、红黑树、 二叉排序树、trie树Double Array 字典查找树简介

    B  树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: ...

  3. 树:BST、AVL、红黑树、B树、B+树

    我们这个专题介绍的动态查找树主要有: 二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操 ...

  4. AVL树,红黑树

    AVL树 https://baike.baidu.com/item/AVL%E6%A0%91/10986648 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高 ...

  5. 数据结构中很常见的各种树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B+树.B*树) 二叉排序树.平衡树.红黑树 红黑树----第四篇:一步一图一代码,一定要让你真正彻底明白红黑树 --- ...

  6. 浅谈AVL树,红黑树,B树,B+树原理及应用(转)

    出自:https://blog.csdn.net/whoamiyang/article/details/51926985 背景:这几天在看<高性能Mysql>,在看到创建高性能的索引,书上 ...

  7. 浅谈AVL树,红黑树,B树,B+树原理及应用

    背景:这几天在看<高性能Mysql>,在看到创建高性能的索引,书上说mysql的存储引擎InnoDB采用的索引类型是B+Tree,那么,大家有没有产生这样一个疑问,对于数据索引,为什么要使 ...

  8. 数据结构与算法--从平衡二叉树(AVL)到红黑树

    数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树.算法的性能取决于树的形状,而树的形状取决于插入键的顺序.在最好的情况下,n个结点的树是完全平衡的,如下图"最好情况&q ...

  9. 数据结构图解(递归,二分,AVL,红黑树,伸展树,哈希表,字典树,B树,B+树)

    递归反转 二分查找 AVL树 AVL简单的理解,如图所示,底部节点为1,不断往上到根节点,数字不断累加. 观察每个节点数字,随意选个节点A,会发现A节点的左子树节点或右子树节点末尾,数到A节点距离之差 ...

  10. 数据结构(一)二叉树 & avl树 & 红黑树 & B-树 & B+树 & B*树 & R树

    参考文档: avl树:http://lib.csdn.net/article/datastructure/9204 avl树:http://blog.csdn.net/javazejian/artic ...

随机推荐

  1. loj2274 「JXOI2017」加法

    二分一下,然后从左到右扫描,扫到左端点就把区间 push 到堆里. 每次有点不符合二分的值时,就贪心地选择右端点最远的 add. #include <algorithm> #include ...

  2. [git 学习篇] git remote add origin错误

    http://blog.csdn.net/dengjianqiang2011/article/details/9260435 如果输入$ Git remote add origin git@githu ...

  3. shell的case-esac

    case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构. case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: ...

  4. POJ 2411 Mondriaan's Dream ——状压DP 插头DP

    [题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...

  5. Linux 下运行 C++ 程序出现 “段错误(核心已转储)”

    Linux下写C++程序出现“段错误(核心已转储)”的问题: 段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它 ...

  6. 【Git】Git 本地的撤销修改和删除操作

    一:撤销操作 比如我现在在readme.txt文件里面增加一行 内容为555555555555,我们先通过命令查看如下: 在我未提交之前,我发现添加5555555555555内容有误,所以我得马上恢复 ...

  7. Linux 下 GCC 编译共享库控制导出函数的方法

    通过一些实际项目的开发,发现这样一个现象,在 Windows 下可以通过指定 __declspec(dllexport) 定义来控制 DLL(动态链接库)中哪些函数可以导出,暴露给其他程序链接使用,哪 ...

  8. WEB学习-基础知识:列表、表单、div和span、注释、字符实体、HTML废弃标签介绍

    列表 无序列表 无序列表,用来表示一个列表的语义,并且每个项目和每个项目之间,是不分先后的. ul就是英语unordered list,“无序列表”的意思. li 就是英语list item , “列 ...

  9. BZOJ 1878 [SDOI2009]HH的项链 (主席树 或 莫队算法)

    题目链接  HH的项链 这道题可以直接上主席树的模板 #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) ...

  10. 关于xshell无法连接到centos的问题

    1.xshell无法连接到centos:拒绝连接(无线网) 在xshell ping centos出现: 解决方法: 1. 2.重启下网卡: [root@localhost ~]# /etc/init ...