我有一个图书馆的链表/二树的方法时使用的标准集装箱不适用-例如当有不同类型的节点,或者当我需要转换,从二元树的清单,然后再返回。它包括红黑色树处理。

其中一种方法将从双链表以一个完美的平衡简单的二进制的树 O(n) 时间(由于数量的项目是预先知道的).的算法被称为"折叠"-这是二一半的二进制树重新平衡算法,这是一旦公布于博士Dobbs'.步骤基本上是...

  • 鉴于大小树,决定尺寸左右子树

  • Recurse左子树

  • 弹出一个节点,从列表中使用作为根

  • Recurse权的子树

  • 链接的子树的根

我也有一个类似的方法,创建一个红黑色树。原理是一样的,但递归跟踪的节点高度高度为零点是创建的红色,所有其他人是黑人。开始高度的计算是基于最高位置中的树大小,而是摆弄这样一个完美的平衡 (2^n)-1 大小树上有只有黑色的节点(递归仅下降到高度一)。

这里的要点是,我只有红点在叶级,最大的精确一半的节点是红色的。

事实是,虽然这是一个简单的方式产生一个有效的红黑色树,它并不是唯一的选择。避免了所有的红枫叶在一个完美的平衡树是一个任意的选择。我可以交替层的红色和黑色的节点。或者我也可以减少数量的红点显着,在某些情况下由发现子树,都是完美的平衡和(如果它需要红色的节点)使子树根红色的而不是其所有的树叶。

问题是是否有任何实际的理由选择一个有效的红黑色树的形式在另一个?

这是纯粹的好奇-我知道我没有任何实际的理由,但任何人都不会知道的一个专门应用程序,这种选择是重要的?

有帮助吗?

解决方案

在标准的分析摊销成本的修改红黑色树木使用pysicist的方法,黑色的节点零或两个红色的儿童分配一个积极的潜力之一,这意味着它们表示有问题的地方,在树那里的额外工作可能需要做。红的节点和黑节点与一个红色的孩子分配一个潜在的零。

因此,降低成本的修改,给予每一个黑色的节点的一个红色的孩子。


的原因 为什么要黑点与一个红色的儿童都是最好的解释通过类似于冗余的二进制数字。我会第一个解释如何与红黑色树木的二进制数字,然后我会解释为什么一个红色的儿童的节点是有用的。

因为你可能知道,红黑色树的一种方式表2-4中的树木,在其中每一个简单的路径从根到一片叶子有同样的长度,但节点有2、3或4个孩子。最简单的算法为添加或删除的一个节点2-4树是相同的算法加上或减去一个 冗余的二进制数.

冗余的二进制数字是数量在其所ith表示2位数, 就像在一个标准的二进制数字,但是ith数字可以0,1, 或2.他们被称为多余的,因为有多种方法编写一定数量。4dec 可以写100或者20或12。

添加一个冗余的二进制数字,你的增量最大数字;如果这是3,1并增加下一个最显着的位,等等。算法停止的时候遇到0或1。

添加叶2-4树,添加一个孩子到其想要的父母。如果父母如何有五个孩子,分为两个节点和让他们的孩子的父母。继续,直到达到一个节点,并不需要分裂。因此,路径向根停止时遇到的一个节点与两个或三个孩子。

以往的分摊费用的增加冗余的二进制数字,使用的物理学家的方法和分配一个潜在的1到每个2位数。一个xall增加接触k数字释放k-1的潜力,给它一个分摊成本O(1)。

这一分析是相似的摊销成本增加一个标准的二进制数字,但一个标准的二进制数字不支持增量和减量在O(1)分摊的时间:考虑2k -1.这是k1位数。递增费用Θ(k)。如果这之后是递减,对费用Θ(k)和带来的数量回其古老的状态。

冗余的二进制是特别在1位数停止下级联操作的两个增量和减量。2-4中的树木的特别在于,3-点停止的联操作的两插入和删除。

在红黑色树木,一个节点与一个红色的孩子只是一种表示3节点在2-4树。这些节点是特殊的和强大的反对插入或删除在自己的子树,所以你应该有利于他们在大楼的红黑色树木,将会看到一个新城市的更新。

如果你知道你将只能看到刀片,有利于节点与两个黑色的儿童。如果你知道你会看到只有删除,有利于节点与两个红色的儿童。

其他提示

简短的回答是: 这取决于.

基本上,任何有效的树木就足够了。然而,在条款 摊销的分析 -这可能会非常可能,你将要选择最正确的树,从长远来看将给予你的最优化的行为。

例如如果你总是选择一个有效的树,而且是一个容易出现大量的平衡行动中,你将得到不良分摊的性能。一个明显的例子是一个完全的黑色树,这是完全有效,但执行不好的时候,修改。

这取决于,因为这通常是将具体应用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top