繁体   English   中英

动态规划:为什么 Knuth 改进了最优二叉搜索树 O(n^2)?

[英]Dynamic Programming: Why Knuth's improvement to Optimal Binary Search Tree O(n^2)?

这是算法介绍,第 3 版的练习 15.5-4,它是关于 Knuth 对最优二叉搜索树的 DP 方法的改进。

最优二叉搜索树的DP算法为:

OPTIMAL_BST(p, q, n)
let e[1..n+1, 0..n], w[1..n+1, 0..n], and root[1..n, 1..n] be new tables
for i = 1 to n+1
    e[i, i - 1] = q[i - 1];
    w[i, i - 1] = q[i - 1];
for l = 1 to n
    for i = 1 to n - l + 1
        j = i + l - 1
        e[i, j] = INFINITY
        w[i, j] = w[i, j - 1] + p[j] + q[j]
        for r = i to j
            t = e[i, r - 1] + e[r + 1, j] + w[i, j]
            if t < e[i, j]
            e[i, j] = t
            root[i, j] = r
return e and root

复杂度为 O(n 3 )。 Knuth 观察到root[i, j - 1] <= root[i, j] <= root[i + 1, j] ,所以练习 15.5-4 要求通过做一些修改来实现 O(n 2 ) 算法到原来的算法。

经过一番努力,我发现了这一点:在最内层的循环中,替换该行

for r = i to j

for r = r[i, j - 1] to r[i + 1, j]

这个链接已经证明了这一点: Optimal binary search tree

但是,我不确定这真的是 O(n 2 ):因为在每个最内层循环中,从 r[i, j - 1] 到 r[i + 1, j] 的距离不是常数,我怀疑它仍然是O(n 3 )。

所以我的问题是:你能解释一下为什么改进 DP 算法会产生 O(n 2 ) 复杂度吗?

PS:也许我可能先阅读了 Knuth 的论文,但实际上我在网上搜索过,但没有找到该论文的免费访问权限。

您是正确的,从r[i, j - 1]r[i + 1, j]距离在最坏的情况下不是常数,但平均而言是常数,这足以暗示二次运行时间。 l的总迭代次数为

  S = sum_{i = 1}^{n - l + 1} (r[i + 1, j] + 1 - r[i, j - 1]),  j = i + l - 1
    = sum_{i = 1}^{n - l + 1} (r[i + 1, i + l - 1] + 1 - r[i, i + l - 2])
    = r[n - l + 2, n] + n - l + 1 - r[1, l - 1]

因此平均值是 S / (n - l + 1),这是一个常数

通过简化伸缩和。

您可以通过谷歌搜索找到确切的运行时间分析,或者开始编写您自己的循环分析。 但请注意,在所有这些中,总和是通过伸缩和计算的,我的意思是其中一个可能很大,但在第一次循环的每次迭代中需要 O(n),并且完全需要 O(n 2 )。

暂无
暂无

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

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