二叉搜索树内部路径长度分析

时间:2011-08-29 08:11:43

标签: algorithm math

我正在阅读Mark Allen Weiss撰写的关于数据结构和算法的书中的一章。这是文本片段。

  

令D(n)为n个节点的某些树T的内部路径长度。 d(1)   n节点树由i节点左子树和a(n - i组成)组成    - 1) - 节点右子树,加上深度为零的根,0 <= i <1。 ñ。 d(I)   是左子树的内部路径长度   根。在主树中,所有这些节点都更深一层。相同   适用于正确的子树。因此,我们得到了复发

     

D(n)= D(i)+ D(n-i-1)+ n-1

     

如果所有子树大小都同样可能,二进制就是如此   搜索树(因为子树大小仅取决于相对等级   插入树中的第一个元素,但不是二叉树,   然后D(i)和D(n - i -1)的平均值是(1 / n)和   j = 0到n-1的D(j)。这会产生

     

D(n)=(2 / n)(D(j)的j = 0到n-1之和)+(n-1)。

     

上述重现获得D(n)= O(nlogn)的平均值。

以下是我对上述文字摘要的问题。

  1. 作者的意思是“因为子树大小仅取决于插入树中的第一个元素的相对等级”?
  2. 作者如何从D(n)获得平均值O(nlogn)?任何人都可以告诉我实现上述结果所涉及的步骤吗?
  3. 谢谢!

1 个答案:

答案 0 :(得分:0)

关于您的第一点:

在二叉树中,左子树的大小对应于小于根的元素的数量,右子树的大小对应于大于根的元素的大小。

因此,子树大小仅取决于插入的第一个元素的相对等级。

关于你的第二点我没有解决方案,但我会这样开始:

您可以先转换总和:

你知道sum(j=0 to n, of j ) = n*(n-1)/2

然后n-1 = 2/n*sum(j=0 to n-1, of 1 ) +2/n*n = 2/n*sum(j=0 to n-1, of j ) + 2

D(n) = (2/n)(sum from j = 0 to n-1 of D(j)) + (n-1)开始,您将获得新的公式

D(n) = (2/n)(sum from j = 0 to n-1 of (D(j) + j)) + 2 (1)

现在您可以用Dn-1表示Dn

你会发现(如果我是对的):

D(n)= (n+1)/n*D(n-1) + 2  (2)

然后尝试将Dn表示为n * Sum(1 / k),相当于nln(n)......

从上面的公式(2)得到(你可以尝试写):

D(n) = n+1 * SUM( 2 /k for k=1 to n) +2 ... which is a O(n ln(n))

告诉我你是否对此证明有更多疑问

希望有所帮助


编辑:详情(2)

D(n) = (2/n)(sum from j = 0 to n-1 of (D(j) + j)) + 2

=> D(n) = (2/n)(sum from j = 0 to n-2 of (D(j) + j)) + 2 + (2/n)*(D(n-1)+n-1)

=> D(n) = ((n-1)/n)* [ 2/(n-1) *(sum from j = 0 to n-2 of (D(j) + j)) + 2]  + 2 + (2/n)*D(n-1)

note: the +2 between the brackets comes  from (2/n)*(D(n-1)+n-1) =  (2/n)*D(n-1) + 2 *(n-1)/n

between the brackets [] you have D(n-1) then :

=>  D(n) = ((n-1)/n)* D(n-1)  + 2 + (2/n)*D(n-1)

=> D(n) = (n+1)/n*D(n-1) + 2