• AVL树,红黑树,B-B+树,Trie树原理和应用


    前言:本文章来源于我在知乎上回答的一个问题
    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


  • 相关阅读:
    苹果快速的修复了Mac OS High Sierra 上出现了root的漏洞
    Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task
    2018CHD-ACM新生赛(正式赛)E.解救迷茫的草滩小王子
    2018CHD-ACM新生赛(正式赛)D.刀塔大师lwq I
    2018CHD-ACM新生赛(正式赛)C.绝望のRevue
    最小生成树——克鲁斯克算法+一道例题
    求连通分量个数+判定二分图
    动态规划——滚动数组(省内存)
    [BZOJ 1491] [NOI 2007] 社交网络
    SPOJ 8222 Substrings 后缀自动机
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7195267.html
Copyright © 2020-2023  润新知