红黑树(map)

这个里面有插入的几种方式:红黑树性质的理解

先说性质,1 每个节点要么红要么黑,2 一个节点为红色,左右两个孩子都是黑, 3 根节点是黑, 4 每个叶子(nil)节点都是黑色, 5 任意一个节点,到叶子节点的所有简单路径,黑色节点的数量是一样的。(黑高)

再说为什么用红黑树,不用avl,红黑树的优势在于删除(最多旋3次),添加(最多旋2次),avl可能要在回溯过程中弄log次。红黑树的高最大能2*lg(n+1),查询不如avl。 红黑树高度上限(2lg(n+1)证明.

关于为什么是三次和两次:红黑树最多三次旋转达到平衡

map用的是红黑树,unorder_map用的是哈希表,差别:map用operator <来比较大小,出来是有序的。而unorder_map是比较hash过后的值进行比较,输出不是有序的。

用法的区别就是,stl::map 的key需要定义operator< 。 而boost::unordered_map需要定义hash_value函数并且重载operator==,因为hash值相等不代表数据相等。

参考:map,hash_map和unordered_map 实现比较

B与B+树

B树:叶子所在层数是一样的,关键字非递减,搜索相当于二分查找,节点包含关键字信息。是平衡树。

B+树:关键字非递减,基于B Tree和叶子节点顺序访问指针实现,优势在于顺序访问指针提高区间查询性能。

红黑树等平衡性也可以用来实现索引,但文件系统和数据库普遍采用B+树作为索引结构,原因有二:

  • 更少的查找次数
  • 利用磁盘预读特性
  • B+树还有一个最大的好处,方便扫库,B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持。这是数据库选用B+树的最主要原因。
  • 因为B+树的非叶子节点不用存数据,只需要存key,所以一个节点能够存储更大范围的区间。

红黑树(map与unorder_map)B B+树的更多相关文章

  1. 树形结构_红黑树:平衡2X 哈夫曼树:最优2X

    红黑树:平衡2X 哈夫曼树:最优2X 红黑树 :TreeSet.TreeMap 哈夫曼树 1. 将w1.w2.…,wn看成是有n 棵树的森林(每棵树仅有一个结点): 2. 在森林中选出根结点的权值最小 ...

  2. 有序的数据结构中:内存操作红黑树快,磁盘操作b+树快

    红黑树常用于存储内存中的有序数据,增删很快,b+树常用于文件系统和数据库索引,因为b树的子节点大于红黑树,红黑树只能有2个子节点,b树子节点大于2,子节点树多这一特点保证了存储相同大小的数据,树的高度 ...

  3. 红黑树(RB-tree)比AVL树的优势在哪?

    1. 如果插入一个node引起了树的不平衡,AVL和RB-Tree都是最多只需要2次旋转操作,即两者都是O(1):但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删node到root ...

  4. AVL树与红黑树(R-B树)的区别与联系

    AVL树(http://baike.baidu.com/view/593144.htm?fr=aladdin),又称(严格)高度平衡的二叉搜索树.其他的平衡树还有:红黑树.Treap.伸展树.SBT. ...

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

    前言:本文章来源于我在知乎上回答的一个问题 AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中? 看完后您可能会了解到这些数据结构大致的原理及为什么用在这些场景,文章并不涉及具体操作 ...

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

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

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

    AVL树: 最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间的管理用到了AVL树. 红黑树: 平衡二叉树,广泛用在C++的STL中.如map和set都是用红黑树实现的. ...

  8. 数据结构和算法(Golang实现)(29)查找算法-2-3树和左倾红黑树

    某些教程不区分普通红黑树和左倾红黑树的区别,直接将左倾红黑树拿来教学,并且称其为红黑树,因为左倾红黑树与普通的红黑树相比,实现起来较为简单,容易教学.在这里,我们区分开左倾红黑树和普通红黑树. 红黑树 ...

  9. 从2-3-4树到红黑树(下) Java与C的实现

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处   http://www.cnblogs.com/nullzx/ 相关博客: 从2-3-4树到红黑树(上) 从2-3-4树到红黑树(中) 1. 实现技 ...

  10. 论AVL树与红黑树

    首先讲解一下AVL树: 例如,我们要输入这样一串数字,10,9,8,7,15,20这样一串数字来建立AVL树 1,首先输入10,得到一个根结点10 2,然后输入9, 得到10这个根结点一个左孩子结点9 ...

随机推荐

  1. 莫凡PYthon之keras 1

    莫凡PYthon 1 kearsregressionpython Regressor 回归 用神经网络去拟合数据. 主要代码 """ Regressor 回归 " ...

  2. Luogu P3374 【模板】树状数组 1 [单点修改-区间查询]

    P3374 [模板]树状数组 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示 ...

  3. 29 Django自定义模板功能

    在相应的app文件夹中,创建templatetags文件夹,必须是templatetags文件夹命名: 注意:templatetags文件夹中必须要有__init__.py文件 jd.py: from ...

  4. Java中File类

    File类是java.io包中唯一代表磁盘文件本身的对象.File类的对象主要用来获取文件本身的一些信息,如文件所在目录.文件长度.读写权限等. 一. 文件的创建与删除 通常使用以下三种方法来创建一个 ...

  5. 项目实训 DAY 13

    GraphCore学习成本太高/现有资料太少,决定放弃 PlotNN用python语言生成pdf(需求:png),且不能通过仅运行python程序实现,python内生成的是tex格式,还需要加一行命 ...

  6. java接口自动化需要的技术

    1.testNG需要了解的知识 ITestContext这个类可以直接在方法参数里使用,主要作用是可以通过它的context.getSuite()直接获取suite的相关信息.还可以通过它的 cont ...

  7. 2.javaOOP_Part2继承

  8. uni-app之返回上⼀个页⾯并传递参数(从页⾯1跳转到页⾯2,然后页⾯2返回页⾯1并且带回参数。 列如新增地址,带回经纬度和地址名称)

    uni-app之返回上⼀个页⾯并传递参数 1 reBack: function() { 2 let pages = getCurrentPages(); 3 if (pages.length > ...

  9. vue iview前端直接上传OSS

    1. 首先安装oss npm install ali-oss --save 2. // template部分 <Upload ref="upload" type=" ...

  10. 电脑日常维护技巧(windows系统)

    一.磁盘检测 cmd-->chkdsk 二.磁盘修复 cmd-->sfc/scannow 三.删除缓存文件 运行-->%temp%