首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2-3与红黑

第一次接触红黑是在关于hashMap,上来就扔五个特性,说满足这五个特点的二分搜索就是红黑。 (1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。...瞬时懵逼……我扔十个特性,是不是能定义一个红绿灯呢。所以一直不明白红黑为什么要这么定义。 直到今天了解了2-3,才豁然开朗。2-3是一种神奇的,它能够保证该是一个完美。...2-3可以演化成红黑,这便是保证红黑效率的根本。 先说奇葩的2-3,首先2-3满足二分搜索,但每个节点可能存在1或2个数据,对应的该节点就可能存在2或3个子节点 2-3 ?...2-3引入.png 2-3插入操作: ? 2-3.png 2-3演化为红黑 将三节点拆为两个节点,并将左数据节点设为红色来实现2-3同等功能 ? 红黑.png

49030

什么是2-3

2-3 VS 二叉搜索 同样的一组数据,在2-3和二叉搜索里面的对比如下: ?...可以看到2-3的节点分布非常均匀,且叶子节点的高度一致,并且如果这里即使是AVL,那么的高度也比2-3高,而高度的降低则可以提升增删改的效率。...2-3的插入 为了保持平衡性,2-3的插入如果破坏了平衡性,那么本身会产生分裂和合并,然后调整结构以维持平衡性,这一点和AVL为了保持平衡而产生的节点旋转的作用一样,2-3的插入分裂有几种情况如下...2-3的删除 2-3树节点的删除也会破坏平衡性,同样本身也会产生分裂和合并,如下: ?...2-3-4可以再次降低的的高度,但是对应的编码会更加复杂,尤其是在插入和删除之后,所以常常会被容易实现和理解的红黑代替,这里不再过多介绍。感兴趣的朋友可以自行查询资料学习。

1.8K20
您找到你想要的搜索结果了吗?
是的
没有找到

Java数据结构与算法解析——2-3

平衡查找的数据结构能够保证在最差的情况下也能达到lgN的效率,要实现这一目标我们需要保证在插入完成之后始终保持平衡状态,这就是平衡查找(Balanced Search Tree)。...2-3查找概述 2-3是最简单的B-(或-)结构,其每个非叶节点都有两个或三个子女,而且所有叶都在统一层上。2-3不是二叉,其节点可拥有3个孩子。不过,2-3与满二叉相似。...一棵2-3查找或为一颗空,或由以下节点组成: 1)2-节点:含有一个键和两条链接,左链接指向的2-3中的键都小于该节点,右链接指向的2-3中的键都大于该节点。...距离来说,对于1百万个节点的2-3的高度为12-20之间,对于10亿个节点的2-3的高度为18-30之间。...下面是2-3查找的效率: ? 最后贴上一张2-3的构造过程: ? JAVA架构

1.2K70

Java数据结构与算法解析(十)——2-3

平衡查找的数据结构能够保证在最差的情况下也能达到lgN的效率,要实现这一目标我们需要保证在插入完成之后始终保持平衡状态,这就是平衡查找(Balanced Search Tree)。...2-3查找概述 2-3是最简单的B-(或-)结构,其每个非叶节点都有两个或三个子女,而且所有叶都在统一层上。2-3不是二叉,其节点可拥有3个孩子。不过,2-3与满二叉相似。...一棵2-3查找或为一颗空,或由以下节点组成: 1)2-节点:含有一个键和两条链接,左链接指向的2-3中的键都小于该节点,右链接指向的2-3中的键都大于该节点。...2)3-节点:含有两个键和三条链接,左链接指向的2-3中的键都小于该节点,中链接指向的2-3中的键都位于该节点的两个键之间,右链接指向的2-3中的键都大于该节点。...下面是2-3查找的效率: 最后贴上一张2-3的构造过程:

34410

算法原理系列:2-3查找

结构缘由 首先,搞清楚2-3查找为什么会出来,它要解决什么样的问题?假设我们对它的基本已经有所了解了。先给它来个简单的定义: 2-3查找: 一种保持有序结构的查找。...我就不卖关子了,直接给出2-3的其中一个基本定义: 一棵2-3查找或为一颗空,或由以下节点组成: 2-节点:含有一个键和两条链接,左链接指向的2-3中的键都小于该节点,右链接指向的2-3中的键都大于该节点...3-节点:含有两个键和三条链接,左链接指向的2-3中的键都小于该节点,中链接指向的2-3中的键都位于该节点的两个键之间,右链接指向的2-3中的键都大于该节点。 !!!...这思想很重要,因为后续的平衡二叉算法都是基于这个原则实现的。原因也说了,如果不去时刻维护,要获得全局信息代价高昂且全局调整难度大于局部调整。...实现这些不仅需要大量的代码,而且它们所产生的额外开销可能会使算法比标准的二叉查找更慢。平衡一棵的初衷是为了消除最坏情况,但我们希望这种保障所需的代码能够越来越好。

83720

数据结构与算法——2-3

因此,引入了 2-3 来提升效率。2-3 本质也是一种平衡搜索,但 2-3 已经不是一棵二叉了,因为 2-3 允许存在 3 这种节点,3- 节点中可以存放两个元素,并且可以有三个子节点。...2-3 定义 2-3 的定义如下: (1)2-3 要么为空要么具有以下性质: (2)对于 2- 节点,和普通的 BST 节点一样,有一个数据域和两个子节点指针,两个子节点要么为空,要么也是一个2...(4)所有叶子点都在的同一层。 2-3查找 2-3 的查找类似二叉搜索的查找过程,根据键值的比较来决定查找的方向。 例如在图 2.1 所示的 2-3 中查找键为H的节点: ?...img 2-3为满二叉,删除叶子节点 操作步骤:若2-3是一颗满二叉,将2-3减少,并将当前删除节点的兄弟节点合并到父节点中,同时将父节点的所有兄弟节点合并到父节点的父节点中,如果生成了4...但是2-3需要维护两种不同类型的结点,查找和插入操作的实现需要大量的代码,而且它们所产生的额外开销可能会使算法比标准的二叉查找更慢。 今日问题: 大家的开工状态怎么样? ?

63310

字典(前缀)_字典java实现

什么是字典? 叫前缀更容易理解 字典的样子 Trie又被称为前缀、字典,所以当然是一棵。...上面这棵Trie包含的字符串集合是{in, inn, int, tea, ten, to}。每个节点的编号是我们为了描述方便加上去的。中的每一条边上都标识有一个字符。...其实上Trie的创建是从只有根节点开始,通过依次将W1, W2, W3, … WN插入Trie中实现的。所以关键就是之前提到的Trie的插入操作。...综上所述,在Trie中查找一个字符串的伪代码如下: 代码实现 数组方式实现 要写代码实现一个Trie首先就要确定如何存储一个Trie结构。...简单实现 #include #include #include using namespace std; const int MAX_NODE =

98020

算法和数据结构: 八 平衡查找2-3

本文及后面文章介绍的平衡查找的数据结构能够保证在最差的情况下也能达到lgN的效率,要实现这一目标我们需要保证在插入完成之后始终保持平衡状态,这就是平衡查找(Balanced Search Tree...本文首先介绍2-3查找(2-3 Search Tree),后面会在此基础上介绍红黑和B。 定义 和二叉不一样,2-3运行每个节点保存1个或者两个的值。...所以只需要常数次操作即可完成2-3的平衡。 ? 性质 这些本地操作保持了2-3的平衡。对于4-node节点变形为2-3节点,变形前后的高度没有发生变化。...实现 直接实现2-3比较复杂,因为: 需要处理不同的节点类型,非常繁琐 需要多次比较操作来将节点下移 需要上移来拆分4-node节点 拆分4-node节点的情况有很多种 2-3查找实现起来比较复杂,...在2-3查找基础上改进的红黑不仅具有较高的效率,并且实现起来较2-3查找简单。 但是2-3查找作为一种比较重要的概念和思路对于后文要讲到的红黑和B非常重要。

83920

动画 | 什么是2-3?(修改删除操作方式)

2-3正是一种绝对平衡的,任意节点到它所有的叶子节点的深度都是相等的。 2-3的数字代表一个节点有2到3个子树。它也满足二分搜索的基本性质,但它不属于二分搜索。...2-3定义 一颗2-3或为一颗空,或有以下节点组成: 2-节点,含有一个元素和两个子树(左右子树),左子树所有元素的值均小于它父节点,右子树所有元素的值均大于它父节点; 3-节点,还有两个元素和三个子树...2-3查找元素 2-3的查找类似二分搜索的查找,根据元素的大小来决定查找的方向。...如果达到树根节点还是4-节点,则进行分解根节点,此时高+1(只有分解根节点才会增加高),下面动画2-3插入会出这个例子。 ?...动画:2-3插入 2-3删除 算法4红黑删除最小键这一小结里没有特别详细地介绍,但给到了沿着左链接向下进行变换的三种情况: 1. 如果左子节点不是2-节点,完成; 2.

1.6K30

三分钟基础知识:什么是 2-3

因此,引入了 2-3 来提升效率。2-3 本质也是一种平衡搜索,但 2-3 已经不是一棵二叉了,因为 2-3 允许存在 3 这种节点,3- 节点中可以存放两个元素,并且可以有三个子节点。...2-3 定义 2-3 的定义如下: (1)2-3 要么为空要么具有以下性质: (2)对于 2- 节点,和普通的 BST 节点一样,有一个数据域和两个子节点指针,两个子节点要么为空,要么也是一个2...(4)所有叶子点都在的同一层。 2-3查找 2-3 的查找类似二叉搜索的查找过程,根据键值的比较来决定查找的方向。 例如在图 2.1 所示的 2-3 中查找键为H的节点: ?...img 2-3为满二叉,删除叶子节点 操作步骤:若2-3是一颗满二叉,将2-3减少,并将当前删除节点的兄弟节点合并到父节点中,同时将父节点的所有兄弟节点合并到父节点的父节点中,如果生成了4...但是2-3需要维护两种不同类型的结点,查找和插入操作的实现需要大量的代码,而且它们所产生的额外开销可能会使算法比标准的二叉查找更慢。

61820

哈夫曼(郝夫曼)及java实现

哈夫曼是美国数学家Huffman发现的一种数据结构,该数据结构用在哈夫曼编码中,哈夫曼编码是一种压缩算法,本文主要针对的是哈夫曼这种数据结构,哈夫曼编码将在下篇博文中涉及。...在正式开始了解哈夫曼之前有几个概念需要了解: 1、路径长度:从树种一个节点到另一个节点间的分支构成两个节点之间的路径,路径上的分支数目就是路径长度,所以路径长度是针对两个节点间距离的一种描述,如下图所示...,ln},该的带权路径长度WPL则为根节点到其他所有节点带权路径长度之和,即WPL=∑ wk*lk,k从1到n 3、WPL最小时对应的二叉被称为哈夫曼,也叫做最优二叉。...有了上面的基础知识介绍,下面给出一种java实现: public class HuffmanTreeDemo { @Test public void test(){ Queue...q.add(n); } //最后一个节点就是根节点 Node root = q.poll(); //打印哈夫曼

42410

java实现二叉代码

Java中,二叉是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点:左子节点和右子节点。...以下是一个简单的Java示例,演示了如何实现一个二叉: // 节点类 class TreeNode {     int data;     TreeNode left;     TreeNode right...data) {         this.data = data;         this.left = null;         this.right = null;     } } // 二叉类...System.out.println("Inorder Traversal:");         binaryTree.inorderTraversal();     } } 在这个例子中,TreeNode 类表示二叉的节点...BinaryTree 类包含二叉的操作,如插入节点和中序遍历。在 main 方法中,创建了一个二叉并进行了中序遍历。你可以根据需要添加其他操作,如前序遍历、后序遍历等。

9510
领券