为什么Linux早先使用AVL树而后来倾向于红黑树?
       实际上这是由红黑树的有用主义特质导致的结果,本短文依旧是形而上的观点。红黑树能够直接由2-3树导出。我们能够不再提红黑树,而仅仅提2-3树。由于2-3树的操作太简单。另外,不论什么红黑树的操作和特性都能够映射到2-3树中。因此红黑树和AVL树的比較就成了2-3树和AVL树的比較。

它们俩的差别在哪?2-3树的平衡是完美平衡的。可是树杈数量却能够是3个,而AVL树差一点点就完美平衡的标准二叉树,它仅仅同意子树的高度差最多为1。可见这么看来,2-3树比AVL树更加平衡,可是2-3树转换为二叉树。即红黑树的时候,它就不再能保持完美平衡了,由于三叉节点要切割出来一个红色节点,使得子树高度加1,这么看来,红黑树在严格意义上全然没有AVL树平衡!
       AVL树在每一次插入删除时都要保持它那“差一点点的平衡”。而红黑树则仅仅须要不扰动黑色节点就可以,以2-3树来讲,它毕竟是牺牲了二叉树的标准特性变成三叉树保持平衡的。可见,红黑树的插入/删除开销远小于AVL树,对于查询开销。理论上,更加平衡的AVL树要比红黑树好(由于对于2-3树。遇到三叉节点,你须要比較2次)。可是,红黑树的2倍树高的不平衡状态是一个小概率事件!

因此对于正常情况,你能够觉得AVL树和红黑树的查询开销是一样的,总之,常规情况下,红黑树要好于AVL树。

AVL树太理想了,而Linux内核中的数据结构。特别是虚拟内存管理模块,尤其是CFS调度器的task对列,它们是会被频繁插入删除的。因此选择了红黑树而不是AVL树。

Linux内核之于红黑树and AVL树的更多相关文章

  1. linux 内核数据结构之红黑树.

    转载: http://www.cnblogs.com/haippy/archive/2012/09/02/2668099.html https://zh.wikipedia.org/zh/%E7%BA ...

  2. B树、B+树、红黑树、AVL树

    定义及概念 B树 二叉树的深度较大,在查找时会造成I/O读写频繁,查询效率低下,所以引入了多叉树的结构,也就是B树.阶为M的B树具有以下性质: 1.根节点在不为叶子节点的情况下儿子数为 2 ~ M2. ...

  3. 红黑树和AVL树的实现与比较-----算法导论

    一.问题描述 实现3种树中的两种:红黑树,AVL树,Treap树 二.算法原理 (1)红黑树 红黑树是一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是red或black.红黑树满足以 ...

  4. 红黑树与AVL树

    概述:本文从排序二叉树作为引子,讲解了红黑树,最后把红黑树和AVL树做了一个比较全面的对比. 1 排序二叉树 排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索. 排序二叉树 ...

  5. 红黑树和AVL树

    在此之前,我没有了解过红黑树以及AVL tree,真是孤陋寡闻.如果你也在学习的话,我们一起进步. 如果,你很急,那么只看红色加粗即可. 1.红黑树(RB-tree) 红黑树是一种特殊的二叉搜索树,特 ...

  6. 红黑树和AVL树的区别(转)

    add by zhj: AVL树和红黑树都是平衡二叉树,虽然AVL树是最早发明的平衡二叉树,但直接把平衡二叉树等价于AVL树,我认为非常不合适. 但很多地方都在这么用.两者的比较如下 平衡二叉树类型 ...

  7. 转:红黑树和AVL树(平衡二叉树)区别

    本文转载至链接:https://blog.csdn.net/u010899985/article/details/80981053 一.AVL树(平衡二叉树) (1)简介 AVL树是带有平衡条件的二叉 ...

  8. B树、B+树、红黑树、AVL树比较

    B树是为了提高磁盘或外部存储设备查找效率而产生的一种多路平衡查找树. B+树为B树的变形结构,用于大多数数据库或文件系统的存储而设计. B树相对于红黑树的区别 在大规模数据存储的时候,红黑树往往出现由 ...

  9. 红黑树与AVL树比较

    链接地址:https://blog.csdn.net/zhangkunrun/article/details/38336543 B树相对于红黑树的区别 在大规模数据存储的时候,红黑树往往出现由于树的深 ...

随机推荐

  1. JDBC和数据库连接池

    JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成. ​ ● JDBC ​ ● C3P0 ​ ● DRUID 一.JDBC ...

  2. Windows 2008 防火墙开放端口

    当我们使用新服务器架设新主机时,经常会遇到网站无法访问的情况,当问及客服时,经常会告知,操作系统默认不打开80端口,请先确定80是否打开并确定没有被占用.那么,我们该如何打开80端口呢? 方法/步骤 ...

  3. spark查看stage和tasks信息

    spark提供了web-ui接口.外部命令等多种方法监视spark程序的执行状态.利用spark的监视功能,可以方便的查看spark应用程序执行的状态,具体包括:1)stage和tasks列表信息  ...

  4. Linux 配置 nginx + php

    为什么!!!我配过的服务器已经有5.6个了吧,为什么每一次配置都能要了我的老命??这次写清楚过程,以后再要被配服务器坑,我特么要砍人了. 提示:测试网站能否访问的时候,最好关掉浏览器的缓存功能或者勤清 ...

  5. Xilinx FPGA编程技巧之常用时序约束详解

    1.   基本的约束方法 为了保证成功的设计,所有路径的时序要求必须能够让执行工具获取.最普遍的三种路径为: 输入路径(Input Path),使用输入约束 寄存器到寄存器路径(Register-to ...

  6. 你的宽带ip地址被100.64了吗?

    你的宽带ip地址被100.64了吗?   最近需要用外网的时候发现,宿舍路由wan口的ip变成了100.64.X.X,本以为是一个外网的ip,可事实上并不是,并且从外网无法直接访问.   首先,我们都 ...

  7. vt100控制符

    vt100控制符是比较古老的字符,基本上的终端都能支持 今天突然来了兴致玩一玩儿 颜色配置 下面是我写的各种背景和字体颜色的搭配演示,挑选一种你喜欢的 echo -en "[背景\字体] & ...

  8. 使用CocoaPods,文档中出现引用头文件找不到的问题。

    现在很多人都会使用CocoaPods来管理自己使用的第三方开源代码,这两天我的工程中碰到了这样一个问题,当我使用CocoaPods来进行三方源码的引入,但是在实际的工程当中引入出现了这样一个问题,就是 ...

  9. 并发编程学习笔记(13)----ConcurrentLinkedQueue(非阻塞队列)和BlockingQueue(阻塞队列)原理

    · 在并发编程中,我们有时候会需要使用到线程安全的队列,而在Java中如果我们需要实现队列可以有两种方式,一种是阻塞式队列.另一种是非阻塞式的队列,阻塞式队列采用锁来实现,而非阻塞式队列则是采用cas ...

  10. JAVA程序员面试笔试宝典3

    1.什么是线程?它与进程有什么区别?为什么要使用多线程 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.进程是指一段正在执行的程序. 使用多线程可以减少程序的相应时间 与进程相比,线程的创建 ...