b树

数据结构九之红黑树

元气小坏坏 提交于 2019-12-17 06:55:09
红黑树也是一种自平衡的二叉搜索树 以前也叫做平衡二叉B树(Symmetric Binary B-tree) 红黑树必须满足以下 5 条性质 1、节点是 RED 或者 BLACK 2、根节点是 BLACK 3、 叶子节点(外部节点,空节点)都是 BLACK 4、 RED 节点的子节点都是 BLACK和父节点都是黑色,从根节点到叶子节点的所有路径上不能有 2 个连续的 RED 节点 5、从任一节点到叶子节点的所有路径都包含相同数目的 BLACK 节点 请问下面这棵是红黑树么? 红黑树必须满足以下 5 条性质 节点是 RED 或者 BLACK 根节点是 BLACK 叶子节点(外部节点,空节点)都是 BLACK RED 节点的子节点都是 BLACK ✓ RED 节点的 parent 都是 BLACK ✓ 从根节点到叶子节点的所有路径上不能有 2 个连续的 RED 节点 从任一节点到叶子节点的所有路径都包含相同数目的 BLACK 节点 上图的判断结果是否:他不是红黑树,五个性质满足了四个,但是第五条性质不满足, 红黑树的等价变换 红黑树 和 4阶B树(2-3-4树)具有等价性 ◼ BLACK 节点与它的 RED 子节点融合在一起,形成1个B树节点 ◼ 红黑树的 BLACK 节点个数 与 4阶B树的节点总个数 相等 ◼ 网上有些教程:用 2-3树 与 红黑树 进行类比,这是极其不严谨的,2

b树和b+树的区别

☆樱花仙子☆ 提交于 2019-12-17 04:27:28
一,b树 b树(balance tree)和b+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢? 因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。 █一个M阶的b树具有如下几个特征: 定义任意非叶子结点最多只有M个儿子,且M>2; 根结点的儿子数为[2, M]; 除根结点以外的非叶子结点的儿子数为[M/2, M],向上取整; 非叶子结点的关键字个数=儿子数-1; 所有叶子结点位于同一层; k个关键字把节点拆成k+1段,分别指向k+1个儿子,同时满足查找树的大小关系。 █有关b树的一些特性,注意与后面的b+树区分: 关键字集合分布在整颗树中; 任何一个关键字出现且只出现在一个结点中; 搜索有可能在非叶子结点结束; 其搜索性能等价于在关键字全集内做一次二分查找; █如图是一个3阶b树,顺便讲一下查询元素5的过程: 1,第一次磁盘IO,把9所在节点读到内存,把目标数5和9比较,小,找小于9对应的节点; 2,第二次磁盘IO

B树

半世苍凉 提交于 2019-12-15 10:11:39
B-Tree就是B树,"-"是横杠,不读作"减" (1)树中每个结点至多有m 棵子树(注:m指的是树的阶); (2)若根结点不是叶子结点,则至少有两棵子树(注:根节点至少有两个儿子); (3)除根结点之外的所有非叶子结点至少有p个子节点( , 为向上取整。); (4)所有的非叶子结点中 包含以下数据 :(n,P0,K1,P1,K2,…,Kn,Pn); K是Key, P是指针 B+Tree的非底层节点是 不包含具体Value数据 的;B-Tree的所有节点都含Value数据; B+Tree最底层节点是完整的全量数据, 可按顺序遍历 ;B-Tree最底层节点的数据是不完整的; B+Tree可以把 只把Key索引放在上层 (内存可缓存下更多的索引);B-Tree把数据也放在上层了,数据夹杂索引的方式; 度是M(即节点大小约为M),底层节点个数是N,问查询复杂度: 注意:此N时底层节点个数,不是元素个数(元素个数时N*M) 聚集索引和非聚集索引 都是B+Tree; 非聚集索引的"数据域"放的是指向数据的指针;聚集索引的“数据域”放的是具体数据(建表之前就要指定主键); 来源: CSDN 作者: smartcat2010 链接: https://blog.csdn.net/smartcat2010/article/details/103492652

B-树(B树)详解

筅森魡賤 提交于 2019-12-14 15:45:07
具体讲解之前,有一点,再次强调下:B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是一种树。而事实上是,B-tree就是指的B树。特此说明。 1、B-树(B树)的基本概念 B-树中所有结点中孩子结点个数的最大值成为B-树的阶,通常用m表示,从查找效率考虑,一般要求m>=3。一棵m阶B-树或者是一棵空树,或者是满足以下条件的m叉树。 1)每个结点最多有m个分支(子树);而最少分支数要看是否为根结点,如果是根结点且不是叶子结点,则至少要有两个分支,非根非叶结点至少有ceil(m/2)个分支,这里ceil代表向上取整。 2)如果一个结点有n-1个关键字,那么该结点有n个分支。这n-1个关键字按照递增顺序排列。 3)每个结点的结构为: n k1 k2 ... kn p0 p1 p2 ... pn 其中,n为该结点中关键字的个数;ki为该结点的关键字且满足ki<ki+1;pi为该结点的孩子结点指针且满足pi所指结点上的关键字大于ki且小于ki+1,p0所指结点上的关键字小于k1,pn所指结点上的关键字大于kn。 4)结点内各关键字互不相等且按从小到大排列。 5)叶子结点处于同一层;可以用空指针表示,是查找失败到达的位置。 注

B树中的M阶是什么含义?

亡梦爱人 提交于 2019-12-14 00:13:19
描述一颗 B树时需要指定它的阶数,阶数表示了一个结点 最多 有多少个孩子结点,一般用字母 M 表示阶数。 当 M取 2 时,就是我们常见的二叉搜索树。 而B树,根结点的阶数M >= 2(至少有两个子节点), 其他节点数必须 >= 3 。 其实, M阶 就是 M树。 一颗 M树上,最多有 M 个子树。例如, 2(叉)树,即内含 1个数据项 和 2 个子树(这里的子树 也叫做 引用、链接等); 3(叉)树,即内含 2个数据项 和 3 个子树 ; 4(叉)树,即内含 3个数据项 和 4 个子树 ; 5(叉)树,即内含 4个数据项 和 5 个子树 ; 故,M(叉)树,即内含(M-1)个数据项 和 M 个子树 ; 所以, M阶 可理解为 M(叉)树,即内含(M-1)个数据项和 M 个子树。 注意: 在B树中,M>=3,所以B树至少是 3(叉)树(不太严谨的说法); M阶,确切的是指 平衡的 M 路查找树 。 如图所示: 来源: CSDN 作者: az44yao 链接: https://blog.csdn.net/az44yao/article/details/103533052

面试官问你B树和B+树,就把这篇文章丢给他

独自空忆成欢 提交于 2019-12-11 22:14:45
原文链接: 面试官问你B树和B+树,就把这篇文章丢给他 1 B树 在介绍B+树之前, 先简单的介绍一下B树,这两种数据结构既有相似之处,也有他们的区别,最后,我们也会对比一下这两种数据结构的区别。 1.1 B树概念 B树也称B-树,它是一颗多路平衡查找树。二叉树我想大家都不陌生,其实,B树和后面讲到的B+树也是从最简单的二叉树变换而来的,并没有什么神秘的地方,下面我们来看看B树的定义。 每个节点最多有m-1个 关键字 (可以存有的键值对)。 根节点最少可以只有1个 关键字 。 非根节点至少有m/2个 关键字 。 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。 所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同。 每个节点都存有索引和数据,也就是对应的key和value。 所以,根节点的 关键字 数量范围: 1 <= k <= m-1 ,非根节点的 关键字 数量范围: m/2 <= k <= m-1 。 另外,我们需要注意一个概念,描述一颗B树时需要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点,一般用字母m表示阶数。 我们再举个例子来说明一下上面的概念,比如这里有一个5阶的B树,根节点数量范围:1 <= k <= 4,非根节点数量范围:2 <= k <= 4。 下面,我们通过一个插入的例子

数据库索引有关的数据结构你搞清楚了吗?

安稳与你 提交于 2019-12-10 07:31:40
数据库索引可是Java后端开发经常打交道的东西,小豪在一次面试中就被这个问题给难住了,我们一起来看看小豪是怎么出糗的嘻嘻,大家一起笑话他。 文章人物及背景: 小豪: 23岁,武汉某双非本科不知名专业大学四年级学生,成绩一般,面临毕业,对后端开发、Java很感兴趣,正求职找工作。 宇哥: 跟小豪通过租房认识,两人是室友,26岁,毕业后长期从事软件开发工作,是一个半吊子工程师,兴趣爱好是吹牛,不打草稿那种。 文章目录 1.1 面试失败 1.2 啥都懂一点儿的宇哥 1.3数据库索引的常用数据结构对比 1.3.1哈希表和有序数组 1.3.2 二叉树和多叉树 1.3.3 B+树 1.4充满信心的小豪 画外音 参考文献 更多 1.1 面试失败 小豪热爱编程,觉得写代码、做网站开发无敌酷炫雕炸天,在某站上看完了某马基础班和就业班的教学视频,觉得自己已经成为了斗宗强者,踌躇满志,海投简历,终于被某单位临幸,欣喜若狂,欣然赴约。 这次的面试官是一个中年大叔,发量尚可,不过发际线有力争上游的趋势,穿着浅蓝色的衬衫,最上面的一颗扣子没有扣上,衣领随意翻着,不苟言笑。识人面相的小豪暗道一声不妙,这个面试官可能不简单。 面试官:先自我介绍一下,重点说一下你做过的项目。 小豪心里一乐,嘿嘿,昨晚刚刚背过的,一阵摇头晃脑过后… 面试官: 你刚刚提到了数据库优化,那你有哪些优化经验? 小豪:(依然自信)创建索引

跟数据库索引有关的数据结构你搞清楚了吗?

五迷三道 提交于 2019-12-09 21:36:20
数据库索引可是Java后端开发经常打交道的东西,小豪在一次面试中就被这个问题给难住了,我们一起来看看小豪是怎么出糗的嘻嘻,大家一起笑话他。 文章人物及背景: 小豪: 23岁,武汉某双非本科不知名专业大学四年级学生,成绩一般,面临毕业,对后端开发、Java很感兴趣,正求职找工作。 宇哥: 跟小豪通过租房认识,两人是室友,26岁,毕业后长期从事软件开发工作,是一个半吊子工程师,兴趣爱好是吹牛,不打草稿那种。 文章目录 1.1 面试失败 1.2 啥都懂一点儿的宇哥 1.3 数据库索引的常用数据结构对比 1.3.1 哈希表和有序数组 1.3.2 二叉树和多叉树 1.3.3 B+树 1.4 充满信心的小豪 画外音 参考文献 更多 1.1 面试失败 小豪热爱编程,觉得写代码、做网站开发无敌酷炫雕炸天,在某站上看完了某马基础班和就业班的教学视频,觉得自己已经成为了斗宗强者,踌躇满志,海投简历,终于被某单位临幸,欣喜若狂,欣然赴约。 这次的面试官是一个中年大叔,发量尚可,不过发际线有力争上游的趋势,穿着浅蓝色的衬衫,最上面的一颗扣子没有扣上,衣领随意翻着,不苟言笑。识人面相的小豪暗道一声不妙,这个面试官可能不简单。 面试官:先自我介绍一下,重点说一下你做过的项目。 小豪心里一乐,嘿嘿,昨晚刚刚背过的,一阵摇头晃脑过后…… 面试官: 你刚刚提到了数据库优化,那你有哪些优化经验? 小豪:(依然自信

【转】各种二叉树

断了今生、忘了曾经 提交于 2019-12-06 16:05:22
数据库中的数据一般是放在磁盘里面,存取数据的时候就要访问磁盘, 物理访问过程:盘片旋转,磁臂移动 两个过程。盘片旋转到指定位置之后,移动磁臂开始进行数据的存取。 那么存取数据的时间(快慢)主要是在哪部分消耗呢?主要就是 定位 过程消耗的。 所以:考虑到提高存取数据的速率,实际上就是减少磁盘定位(I/O操作)的次数。 来举个例子。来 顺序查找 。 查找5的时候,从头到尾的遍历,一共需要定位5次。不用再赘述,显然这样的顺序查找是最低效的。 为了提高效率,来 二叉树 。 二叉树的规范我就不说了, 一共6个数,无论查找哪个数,最多也就定位3次。 嗯,既然二叉树这么方便,那大家都用二叉树好了。额,其实图一那种情况,也算是二叉树,那算是一种情况。如果无法保证提高效率的稳定性,那这种结构还是不好。 (在这里记录一个知识点) 先序,中序,后序遍历。说一点就好,这里的先中后,说的是根节点。 为了提升稳定性,来 平衡二叉树 。 平衡二叉树用平衡因子差值来判断是否平衡,并旋转二叉树。平衡因子:左右子树高度差。平衡二叉树里平衡因子不能超过1,否则旋转。 长叹一口气,这样稳定了吧? 稳定是稳定,但是为了二叉树的稳定,牺牲了一些更重要的东西——时间。 当新增删除数据导致的旋转二叉树时,很耗时间的! 所有的操作的目的都是为了节省时间,提高效率。这样操作舍本逐末了。但也不是丝毫没有可取之处。 使用场景

索引简记:B树 B+树

血红的双手。 提交于 2019-12-06 10:49:07
数据库索引演进: 1、二叉树 如上,二叉树当时算法中的鼻祖了,O(N)的复杂度也使得他应用声名大噪,hash即使脱胎于此 那么为什么hash索引很少使用呢?一是因为极端情况下二叉树会退化为一个链表失去其二叉树的优势 2、由此,B-树, 注意是B树不是B减数,就诞生了,B树可以简单理解为平衡M岔树。如下示例为3路B树 再附一张带指针的: B树:M个节点M+1个分叉,分为数据域和指针域,既存关键字,由存指针指向孩子节点,常用于文件系统索引。 B树是解决了退化的问题了,但是如上结构,在进行范围查询的时候,B树也是疲于奔命 3、由此,B+树诞生了,B+树是基于B树的拓展,示例如下: 再附一张带指针的 如此B+树就解决了范围查询的问题,且节点(空间)利用率也高过B树。常用于DB索引! B树与B+树的区别: 在B+树中,具有n个关键字的节点只含有n棵子树,即 每个关键字对应一个子树 ;而在B树中,具有n个关键字的节点只含有n+1棵子树。 在B+树中,每个结点(非根节点)关键字个数n的范围是m/2(向上取整)<=n<=m(根结点:1<=n<=m);在B树中,每个结点(非根节点)关键字个数n的范围是m/2(向上取整)-1<=n<=m-1(根结点:1<=n<=m-1)。 在B+树中, 叶结点包含信息,所有非叶子结点仅起到索引作用 ,非叶结点中的每个索引项只含有对应子树的 最大关键字