繁体   English   中英

给出一个n节点二叉搜索树的高度的渐近上限,其中一个节点的平均深度为Θ(lg n)

[英]Give an asymptotic upper bound on the height of an n-node binary search tree in which the average depth of a node is Θ(lg n)

最近,我正在尝试解决CLRS中的所有练习。 但是有些我不知道。 这是CLRS练习12.4-2中的其中之一:

在n个节点上描述一个二叉搜索树,以使树中一个节点的平均深度为Θ(lg n),但树的高度为ω(lg n)。 给出一个n节点二分搜索树的高度的渐近上限,其中一个节点的平均深度为Θ(lg n)。

任何人都可以分享一些想法或参考来解决此问题吗? 谢谢。

因此,假设我们以这种方式构建树:给定n个节点,取f(n)个节点并将它们放在一边。 然后,通过构建一个完美的二叉树来构建一棵树,其中的根具有一个左子树,该子树是n-f(n)-1个节点的完美二叉树,而一个右子树的长度为f(n)链。 稍后我们将选择f(n)。

那么,树的平均深度是多少? 由于我们只需要一个渐近边界,所以我们选择n使得n-f(n)-1比2的完美幂小2,例如2 ^ k-1。在这种情况下,该高度的和树的一部分是1 * 2 + 2 * 3 + 4 * 4 + 8 * 5 + ... + 2 ^(k-1)* k,大约等于k 2 ^ k的(IIRC) (n-f(n))对数(n-f(n))由我们选择的k 在树的另一部分,总深度约为f(n)^ 2。 这意味着平均路径长度约为((n-f(n))log(n-f(n))+ f(n)^ 2)/ n。 而且,树的高度是f(n)。 因此,我们要在保持平均深度O(log n)的同时最大化f(n)。

为此,我们需要找到f(n)使得

  1. n-f(n)=Θ(n),或者分子中的对数项消失并且高度不是对数,
  2. f(n)^ 2 / n = O(log n),否则分子中的第二项变得太大。

如果选择f(n)=Θ(sqrt(n log n)),我认为最大满足1和2。 因此,我敢打赌(尽管我对此可能完全错了),这是您所能得到的。 您会得到一棵树的高度Θ(sqrt(n log n)),它的平均深度为Θ(Log n)。

希望这可以帮助! 如果我的数学差强人意,请告诉我。 现在已经晚了,我还没有做惯的检查。 :-)

如果您尝试在最大化树的高度的同时最小化树的所有节点的平均深度,那么明确的最佳形状将是“伞形”形状,例如具有k个节点且height = lg k的完整二叉树,其中0 <k <n,以及从完整部分的叶子之一出来的nk个节点的单个路径或“尾”。 这棵树的高度大约为lg k + n-k。

现在,让我们计算所有节点的总深度。 整个部分的节点深度的总和为sum [j * 2 ^ j],其中总和取自j = 0到j = lg k。 通过一些代数,结果的主导项是2k lg k。

接下来,尾部的深度的总和由sum [i + lg k]给出,其中总和从i = 0到i = nk。 通过一些代数,结果约为(nk)lg k +(1/2)(nk)^ 2。

因此,将以上两个部分加在一起并除以n,所有节点的平均深度为(1 + k / n)lg k +(nk)^ 2 / /(2n)。 注意,因为0 <k <n,所以无论我们选择什么k,这里的第一项都是O(lg n)。 因此,我们只需要确保第二项是O(lg n)。 为此,我们要求(nk)^ 2 = O(n lg n),或k = n-O(sqrt(n lg n))。 通过这种选择,树的高度为

lg k + n-k = O(sqrt(n lg n))

渐近地比普通的O(lg n)大,并且渐近地最高,您可以制作树,同时保持平均深度为O(lg n)

首先最大化树的高度。 (有一棵树,其中每个节点只有一个子节点,因此您的长链向下延伸)。

检查平均深度。 (显然,平均深度会过高)。

当平均深度过高时,必须将树的高度减小一。 有许多种方法可以将树的高度减少一。 选择最小化平均高度的方式。 (通过归纳证明,每次您都应该选择使平均高度最小的一种)。 继续前进,直到跌落到平均身高要求以下。 (例如,使用归纳法计算高度和平均深度的公式)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM