我正在阅读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)的平均值。
以下是我对上述文字摘要的问题。
谢谢!
答案 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