0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

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

3天内不再提示

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

电子工程师 来源: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

    文章

    365

    浏览量

    25173
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73478
  • 二叉树
    +关注

    关注

    0

    文章

    74

    浏览量

    12311

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

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

收藏 人收藏

    评论

    相关推荐

    大神指正一下唄!!!!!

    `大神给我指导一下吧,就这个板子,给点布局和走线方面的意见和经验吧!!!!!!!!!!!很是感谢!这是51和RS232组成的电路。`
    发表于 11-13 20:25

    关于PCM卡的些知识 ,哪位高手给普及一下

    关于PCM卡的些知识 ,哪位高手给普及一下
    发表于 03-09 15:26

    新人驾到,女程序枚!

    程序枚,性格活泼开朗,善交友我在深圳,你们在哪里?
    发表于 04-23 15:36

    不会单片机,今天被一程序羞辱了....

    程序问我老大:这人初中毕业了没有啊,这么简答的东西都不懂。我勒个擦,我要懂单片机还有你什么事啊!!请问一下各位,这个电路如果不用单片机,纯硬件电路可以实现吗?电源检测可以通过运算放大器来实现,切换怎么弄?
    发表于 12-27 20:11

    只迷途程序的经历

    只迷途程序的自述
    发表于 07-15 10:33

    了解一下STM32的时钟

    的时钟频率又是如何确定的呢?带着这个问题,我们起详细了解一下STM32的时钟。时钟是了解STM32时钟的灵魂,ST...
    发表于 08-06 07:11

    总结一下429时钟些知识

    ;这篇博客会总结一下429时钟些知识,还有时钟配置函数;再之后可能还会总结基于SysTick的延时函数、程序执行流程、中断、DMA等。时钟系统时钟源F429有5个时钟源,HSI,
    发表于 08-10 06:23

    普及一下MSP430的中断系统

    ICC,即Interrupt Compare Controller,中断比较控制器,作用便是设定中断优先级,同时通过比较中断优先级等实现中断的硬件嵌套。首先普及一下MSP430的中断系统,大部分
    发表于 02-11 06:26

    请问一下主控端是怎样通过指令查看时钟

    请问一下主控端是怎样通过指令查看时钟的?
    发表于 03-04 06:34

    按钮控制LED程序(按亮再按一下灭)【汇编版】

    按钮控制LED程序(按亮再按一下灭)【汇编版】按钮控制LED程序(按亮再按一下灭)【汇编版】
    发表于 12-29 11:04 0次下载

    带你了解一下人工智能中的决策(DT)

    决策(DT)是在已知各种情况发生概率的基础上,通过构成决策来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的种图解法。由于这种决策分支画成图形很像
    发表于 05-29 07:12 2130次阅读

    行走在崩溃边缘,程序“自救”指南!

    摘要: 都说钱是缓解痛苦的良方,可就算是多金的程序小哥也有扛不住的崩溃瞬间。到底因何崩溃?究竟是哪些瞬间让程序小哥哭笑不得,崩溃不已? 小编抱着万分好奇的心情,深入
    发表于 07-23 18:04 144次阅读

    种基于程序向量的代码克隆检测方法

    代码克隆能够加速软件开发但是也会导致缺陷重复发生和软件质量问题。部分类型的代码克隆在字面上相似度低,导致识别困难。针对这问题,提出种基于程序向量的代码克隆检测方法。首先,基于统计
    发表于 04-07 14:49 15次下载
    <b class='flag-5'>一</b>种基于<b class='flag-5'>程序</b>向量<b class='flag-5'>树</b>的代码克隆检测方法

    推荐MCUXpresso 软件和工具

    最近使用体验了NXP新推出的MCUXpresso软件和工具,此款软件和工具是专为广大的嵌入式程序设计的,简直是给众友带来了极大的福利,包括三个部分:MCUXpress...
    发表于 10-28 20:51 11次下载
    小<b class='flag-5'>猿</b>推荐MCUXpresso 软件和工具

    zynq开发中的设备

    在zynq开发中经常会修改设备,每次遇到这种情况都有点发愁,今天把设备相关的知识点总结一下,希望以后遇到设备时,能够自如应对。
    的头像 发表于 05-25 11:29 2095次阅读
    zynq开发中的设备<b class='flag-5'>树</b>