创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

普及一下程序猿们经常遇见的树

city_prolove 来源:lp 2019-03-13 09:31 次阅读

公历 3 月 12 日是一年一度的植树节。旨在宣传保护森林,并动员群众参加植树造林活动。说到树,程序猿们肯定不陌生,趁着这个植树节,普及一下程序猿们经常遇见的树。

二叉搜索树

定义

二叉搜索树又称二叉查找树,亦称为二叉排序树。设 x 为二叉查找树中的一个节点,x 节点包含关键字 key,节点x 的 key 值记为 key[x] 。如果 y 是 x 的左子树中的一个节点,则 key[y] <= key[x] ;如果 y 是 x 的右子树的一个节点,则 key[y] >= key[x] 。

查找性能

当数据数目为 N,树高度保持 logN 附近。则平均查找长度与 logN 成正比,查找平均时间复杂度为 O(logN) 。 当先后插入的关键字有序时,二叉搜索树退化成单支树结构。此时树高 N 。平均查找长度为 (N+1)/2 ,查找的平均时间复杂度为 O(N) 。

插入性能

插入效率与查找效率一致。  

删除性能

删除节点时,若节点为叶子节点,或者节点只有单一子树,则时间复杂度为 O(1) 。若节点既有左子树又有右子树,则需要执行递归过程,对应时间复杂度为 O(logN) 。

应用场景

二叉排序树就既有链表的好处,也有数组的好处,因此在处理大批量的动态的数据是比较有用。

种树

平衡二叉树

定义

平衡二叉树是一种特殊的二叉搜索树。平衡二叉树保证节点平衡因子的绝对值不超过1,保证了树的平衡。

查找性能

平衡二叉树是严格平衡的,那么查找过程与二叉搜索树一样,只是平衡二叉树不会出现最差的单支树情形。因此查找效率最好,最坏情况时间复杂度为 O(logN) 。

插入性能

插入数据之前需要进行查找操作,查找到插入位置。插入数据后需要进行旋转操作,旋转操作复杂度为常量级。因此插入数据的时间复杂度与查找相同为 O(logN)。

删除性能

删除数据同样需要查找数据,在删除数据后需要进行调整。一次删除最多需要需要O(logN)次旋转,因此删除数据的时间复杂度为O(logN)+O(logN)=O(2logN)。

应用场景

SGI/STL的 set/map 底层都是用红黑树(平衡二叉树的一种)实现的。

种树

红黑树

定义

平衡二叉树的严格平衡策略以牺牲建立查找结构(插入,删除操作)的代价,换来了稳定的O(logN) 的查找时间复杂度。红黑树采用了折中策略,即不牺牲太大的建立查找结构的代价,同时又能保证稳定高效的查找效率。

查找性能

由于红黑树的性质(最长路径长度不超过最短路径长度的 2 倍),可以说明红黑树虽然不像平衡二叉树一样是严格平衡的,但平衡性能还是要比二叉搜索树要好。其查找代价基本维持在 O(logN) 左右,但在最差情况下(最长路径是最短路径的 2 倍少 1),比平衡二叉树效率低一些。

插入性能

红黑树插入结点时,需要旋转操作和变色操作。但由于只需要保证红黑树基本平衡就可以了。因此插入结点最多只需要2次旋转,这一点和平衡二叉树的插入操作一样,但是变色操作的时间复杂度为O(logN)。

删除性能

红黑树的删除操作代价要比平衡二叉树要好的多,删除一个结点最多只需要 3 次旋转操作,保证了删除时间复杂度维持在常量级。

应用场景

应用场景有很多。

Java 中的 TreeSet ,TreeMap,HashMap

C++ 的 STL中的 map 和 set 都是用红黑树实现的

epoll 在内核中的实现,用红黑树管理事件块

nginx 中,用红黑树管理 timer 等

linux 进程调度 Completely Fair Schedule r,用红黑树管理进程控制块

种树

B 树

定义

B树是一种多路平衡查找树,在相同数据数目情形下,B树的高度更小,这样就减少了磁盘的IO次数,在文件系统以及数据库索引等场景下提升了查找效率。

查找性能

B树的查找分成两种:一种是从一个结点查找另一结点的地址的时候,需要定位磁盘地址(查找地址),查找代价极高。另一种是将结点中的有序关键字序列放入内存,进行优化查找(可以用折半),相比查找代价极低。而B树的高度很小,因此在这一背景下,B树比任何二叉结构查找树的效率都要高很多。

插入性能

B树的插入会发生结点的分裂操作。当插入操作引起了 s 个节点的分裂时,磁盘访问的次数为 h (读取搜索路径上的节点) +2s (回写两个分裂出的新节点) +1(回写新的根节点或插入后没有导致分裂的节点)。因此,所需要的磁盘访问次数是 h+2s+1,最多可达到 3h+1。因此插入的代价较大。

删除性能

B树的删除会发生结点合并操作。最坏情况下磁盘访问次数是 3h=(找到包含被删除元素需要h次读访问)+(获取第2至h层的最相邻兄弟需要h-1次读访问)+(在第3至h层的合并需要h-2次写访问)+(对修改过的根节点和第2层的两个节点进行3次写访问)。

应用场景

B树/B+树主要用于磁盘文件组织 数据索引和数据库索引等场景。

种树

B+ 树

定义

B+树是B-树的一种变体,B+树相比B-树的特点:

(1)索引节点的key值均会出现在叶子节点中。(2)索引节点中的key值在叶子节点中或者为最大值或者为最小值。(3)叶子节点使用单链表的形式链接起来。

查找性能

(1)在相同数量的待查数据下,B+树查找过程中需要调用的磁盘IO操作要少于普通B-树。由于B+树所在的磁盘存储背景下,因此B+树的查找性能要好于B-树。

(2)B+树的查找效率更加稳定,因为所有叶子结点都处于同一层中,而且查找所有关键字都必须走完从根结点到叶子结点的全部历程。因此同一颗B+树中,任何关键字的查找比较次数都是一样的。而B树的查找是不稳定的。

插入性能

B+树的插入过程与B树类似,性能也基本一致。

删除性能

删除性能与B树也基本一致。

应用场景

B树/B+树主要用于磁盘文件组织 数据索引和数据库索引等场景。

种树

霍夫曼树

定义

给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为霍夫曼树(Huffman Tree)。

霍夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

应用场景

霍夫曼树主要用于霍夫曼编码,进行数据压缩领域。

霍夫曼编码

  • 磁盘
    +关注

    关注

    1

    文章

    166

    浏览量

    23232
  • C++
    C++
    +关注

    关注

    18

    文章

    1464

    浏览量

    67683
  • 二叉树
    +关注

    关注

    0

    文章

    43

    浏览量

    11064

原文标题:植树节,程序员要爬哪些“树”?

文章出处:【微信号:rgznai100,微信公众号:AI科技大本营】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LibSourcey C++高性能网络开发库

    ./oschina_soft/libsourcey.zip
    发表于 06-24 11:00 8次 阅读
    LibSourcey C++高性能网络开发库

    警惕C++中的异常处理

      许多编译器默认包含 EHS 代码。这意味着不知情的用户会自动合并开销,即使他们无意使用 EHS。....
    发表于 06-24 10:31 336次 阅读
    警惕C++中的异常处理

    开源软件-Zapcc基于Clang的C++编译器

    ./oschina_soft/zapcc.zip
    发表于 06-23 15:17 6次 阅读
    开源软件-Zapcc基于Clang的C++编译器

    开源软件-uftrace C/C++ 程序的跟踪和分析工具

    ./oschina_soft/uftrace.zip
    发表于 06-23 15:06 9次 阅读
    开源软件-uftrace C/C++ 程序的跟踪和分析工具

    哈希是什么,常见的哈希算法有哪些

    什么是哈希? 哈希又称作“散列”,是一种数学计算机程序,它接收任何一组任意长度的输入信息,通过哈希算....
    的头像 18125913365 发表于 06-23 14:57 86次 阅读

    ThreadStacks C/C++进程堆栈追踪库

    ./oschina_soft/threadstacks.zip
    发表于 06-23 14:49 6次 阅读
    ThreadStacks C/C++进程堆栈追踪库

    cpgf C++跨平台多功能扩展库

    ./oschina_soft/cpgf.zip
    发表于 06-23 10:39 7次 阅读
    cpgf C++跨平台多功能扩展库

    eventpp C++事件派发和回调代码库

    ./oschina_soft/eventpp.zip
    发表于 06-23 10:38 4次 阅读
    eventpp C++事件派发和回调代码库

    Gincu C++ 2D游戏引擎

    ./oschina_soft/gincu.zip
    发表于 06-23 10:37 6次 阅读
    Gincu C++ 2D游戏引擎

    PcapPlusPlus网络嗅探和包装分析制作框架

    ./oschina_soft/PcapPlusPlus.zip
    发表于 06-23 10:26 6次 阅读
    PcapPlusPlus网络嗅探和包装分析制作框架

    Fizz C++ 14实现的TLS 1.3标准库

    ./oschina_soft/fizz.zip
    发表于 06-23 10:25 6次 阅读
    Fizz C++ 14实现的TLS 1.3标准库

    mongols C++服务器基础设施

    ./oschina_soft/mongols.zip
    发表于 06-23 10:15 4次 阅读
    mongols C++服务器基础设施

    SDURLCache iOS磁盘缓存

    ./oschina_soft/SDURLCache.zip
    发表于 06-23 09:58 4次 阅读
    SDURLCache iOS磁盘缓存

    将RISC-V融入到工业产品线开发流程中

      关键信息是嵌入式软件工程师将在定义 SoC 架构,特别是编程模型和系统优化方面发挥更大的作用。开....
    的头像 星星科技指导员 发表于 06-22 16:06 199次 阅读
    将RISC-V融入到工业产品线开发流程中

    Dragonboat Go实现的多组Raft库

    ./oschina_soft/dragonboat.zip
    发表于 06-22 15:03 5次 阅读
    Dragonboat Go实现的多组Raft库

    利用汽车开发标准如何降低风险

      底线是汽车应用的端到端测试过于昂贵和复杂。另一方面,软件故障的成本应该成为寻找降低风险方法的动力....
    的头像 星星科技指导员 发表于 06-22 14:37 87次 阅读

    robotstxt robots.txt解析器

    ./oschina_soft/robotstxt.zip
    发表于 06-22 14:27 9次 阅读
    robotstxt robots.txt解析器

    librdkafka Apache Kafka的C/C++开发包

    ./oschina_soft/librdkafka.zip
    发表于 06-22 14:25 6次 阅读
    librdkafka Apache Kafka的C/C++开发包

    stb单文件组成的C/C++库

    ./oschina_soft/stb.zip
    发表于 06-22 14:22 15次 阅读
    stb单文件组成的C/C++库

    ColorfulConsoleIO终端输出彩色字符库

    ./oschina_soft/gitee-ColorfulConsoleIO.zip
    发表于 06-22 14:21 6次 阅读
    ColorfulConsoleIO终端输出彩色字符库

    NumCpp C++版本的Numpy

    ./oschina_soft/NumCpp.zip
    发表于 06-22 14:16 16次 阅读
    NumCpp C++版本的Numpy

    kvstore Redis集群解决方案

    ./oschina_soft/kvstore.zip
    发表于 06-22 11:32 14次 阅读
    kvstore Redis集群解决方案

    CDT 4.0提高生产力并提供更大的可扩展性

      对 Windows SDK 的支持:最近,Microsoft 提供了它的编译器作为其 Windo....
    的头像 星星科技指导员 发表于 06-22 11:30 90次 阅读
    CDT 4.0提高生产力并提供更大的可扩展性

    CIDLib C++开发平台

    ./oschina_soft/CIDLib.zip
    发表于 06-22 11:26 11次 阅读
    CIDLib C++开发平台

    ejson轻量简单的C++ JSON解析库

    ./oschina_soft/ejson.zip
    发表于 06-22 11:22 6次 阅读
    ejson轻量简单的C++ JSON解析库

    pyseal Python同态加密库

    ./oschina_soft/pyseal.zip
    发表于 06-22 10:41 4次 阅读
    pyseal Python同态加密库

    SEAL无外部依赖的C++同态加密库

    ./oschina_soft/SEAL.zip
    发表于 06-22 10:40 15次 阅读
    SEAL无外部依赖的C++同态加密库

    cpp-taskflow C++并行任务编程库

    ./oschina_soft/cpp-taskflow.zip
    发表于 06-22 10:34 12次 阅读
    cpp-taskflow C++并行任务编程库

    oat++轻量级高性能Web服务开发框架

    ./oschina_soft/oatpp.zip
    发表于 06-22 10:25 8次 阅读
    oat++轻量级高性能Web服务开发框架

    SPSCQueue单一消费者等待和无锁定大小队列

    ./oschina_soft/SPSCQueue.zip
    发表于 06-22 10:24 6次 阅读
    SPSCQueue单一消费者等待和无锁定大小队列

    MPMCQueue有界多生产者多用户无锁队列

    ./oschina_soft/MPMCQueue.zip
    发表于 06-22 10:23 5次 阅读
    MPMCQueue有界多生产者多用户无锁队列

    TarsCpp Tars RPC框架C++语言的源代码

    ./oschina_soft/gitee-TarsCpp.zip
    发表于 06-22 10:17 10次 阅读
    TarsCpp Tars RPC框架C++语言的源代码

    Exjson C/C++高性能JSON解析库

    ./oschina_soft/gitee-Exjson.zip
    发表于 06-22 10:08 6次 阅读
    Exjson C/C++高性能JSON解析库

    WIL Windows实现库

    ./oschina_soft/wil.zip
    发表于 06-22 10:04 8次 阅读
    WIL Windows实现库

    InspIRCd模块化C++ IRC守护进程

    ./oschina_soft/inspircd.zip
    发表于 06-22 10:03 8次 阅读
    InspIRCd模块化C++ IRC守护进程

    ImGUI C++即时渲染UI组件

    ./oschina_soft/imgui.zip
    发表于 06-22 09:59 14次 阅读
    ImGUI C++即时渲染UI组件

    tinyserver C++编写的轻量服务器框架

    ./oschina_soft/tinyserver.zip
    发表于 06-22 09:53 8次 阅读
    tinyserver C++编写的轻量服务器框架

    gobject_cpp11基于C++11实现的信号槽

    ./oschina_soft/gitee-gob<x>ject_cpp11.zip
    发表于 06-22 09:48 11次 阅读
    gobject_cpp11基于C++11实现的信号槽

    gobject_cpp98基于ANSI C++实现的信号槽

    ./oschina_soft/gitee-gob<x>ject_cpp98.zip
    发表于 06-22 09:47 8次 阅读
    gobject_cpp98基于ANSI C++实现的信号槽

    clipp C++命令行界面

    ./oschina_soft/clipp.zip
    发表于 06-22 09:19 15次 阅读
    clipp C++命令行界面

    图形用户界面的协作工作的应用

      Crank Software 的 Storyboard Suite 通过创建一个可供所有利益相关....
    的头像 星星科技指导员 发表于 06-21 11:10 169次 阅读
    图形用户界面的协作工作的应用

    采用更高级的应用程序安全框架

      该模型最终通过在开发的早期阶段发现和修复缺陷和漏洞来降低风险和节省时间。它通常使文档自动化并削减....
    的头像 星星科技指导员 发表于 06-21 10:19 109次 阅读

    嵌入式系统开发中的静态分析

      MISRA C++ 也不会停滞不前。如您所知,MISRA C++ 的最后一个标准可以追溯到 20....
    的头像 星星科技指导员 发表于 06-21 10:04 151次 阅读

    lim跨平台网络通信框架

    ./oschina_soft/lim.zip
    发表于 06-21 10:01 3次 阅读
    lim跨平台网络通信框架

    MSVC-STL MSVC的C++标准库实现

    ./oschina_soft/STL.zip
    发表于 06-21 10:00 5次 阅读
    MSVC-STL MSVC的C++标准库实现

    Differential Privacy差异隐私库

    ./oschina_soft/differential-privacy.zip
    发表于 06-21 09:51 6次 阅读
    Differential Privacy差异隐私库

    ouzel C++游戏引擎

    ./oschina_soft/ouzel.zip
    发表于 06-21 09:40 6次 阅读
    ouzel C++游戏引擎

    Tungsten Renderer物理图形渲染器

    ./oschina_soft/tungsten.zip
    发表于 06-21 09:33 6次 阅读
    Tungsten Renderer物理图形渲染器

    开源软件-wxSQLite3 SQLite 3.x数据库的C++包装器

    ./oschina_soft/wxsqlite3.zip
    发表于 06-21 09:27 12次 阅读
    开源软件-wxSQLite3 SQLite 3.x数据库的C++包装器

    CacheQ的编译器支持多线程CPU加速

      该工具套件支持对生成的虚拟引擎进行编译、检查和错误检测、性能预测、分析、调试和可视化。它支持目标....
    的头像 星星科技指导员 发表于 06-21 09:15 79次 阅读

    启动DevEco Studio的本地模拟器提示磁盘空间不足要怎么解决?

    启动模拟器失败,提示“Insufficient disk space (< 2 GB) for the deployed directory.”,磁盘空间不足。 ...
    发表于 06-07 10:16 440次 阅读

    库UFX打开文件出错0x1F,请问可能是哪里的问题?

    查询磁片容量大小不对 实际是32G,结果是64G 打开文件的时候,提示 0x1F/* USB存储器操作失败,在初始化时可能是USB存储...
    发表于 05-16 07:31 161次 阅读

    请问CH559UFI.H中的子程序库中的程序在哪里看到?

    /* 子程序库中提供的子程序 */ /* 下述子程序中, 文件操作子程序CH559File*和磁盘查询子程序CH559DiskQuery都可能会用到...
    发表于 05-12 09:45 151次 阅读

    如何对RK3399 Linux系统的磁盘进行读写测试呢

    如何对RK3399 Linux系统的磁盘进行读写测试呢?
    发表于 03-04 11:37 874次 阅读

    为什么imx6ul-c每次断电df空间都会增加呢

    [root@ /]# df -k Filesystem           1K-blocks      Use...
    发表于 01-10 07:28 689次 阅读

    window10下的硬盘空间与ubuntu下的磁盘大小

    你好! 我的是OK1012A的开发环境,      我按照文档《OK1012A-C-1GHZ-Ubuntu-用户手册-V1.3-2...
    发表于 01-05 06:55 420次 阅读

    A40i源码编辑无法打开文件是为什么?

    A40i源码编辑成功打包 MBR大小= 16384 MBR魔法softw411 磁盘=引导资源 文件名=启动resource.f dl_file_size = 106...
    发表于 01-04 06:28 587次 阅读

    存储管理的磁盘结构分为哪几部分

    存储管理的磁盘结构分为哪几部分? 磁盘调度算法有哪几种?分别有何优缺点? ...
    发表于 12-23 09:57 578次 阅读

    如何去完成挂载EMMC并测试读写速度的实验呢

    如何去完成挂载EMMC并测试读写速度的实验呢?...
    发表于 11-10 07:32 516次 阅读

    嵌入式linux磁盘被写满了再写会出现什么后果

    项目中,测试阶段,开启了某功能项的log日志保存,交互较频发,且无保存上限。一段时间后,导致flash满。此时,有些系统会直接崩...
    发表于 11-05 07:03 275次 阅读