动态编程:为什么Knuth对最优二叉搜索树O(n ^ 2)的改进?

时间:2013-06-07 15:23:53

标签: algorithm binary-search-tree dynamic-programming

这是练习15.5-4的算法导论,第3版,这是关于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 trees

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

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

PS:也许我可能先读过Knuth的论文,但实际上我在网上搜索过但发现没有免费访问该论文。

2 个答案:

答案 0 :(得分:8)

你是正确的,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-1 + 1),这是一个常数

通过简化伸缩总和。

答案 1 :(得分:3)

您可以通过Google搜索找到准确的运行时间分析,或者只是开始编写自己的分析w.r.t for循环。但是请注意,在所有这些中,总和的总和是用望远镜求和来计算的,我的意思是其中一个很大但是在每次迭代中第一个循环取O(n),并且总取O(n 2 < / SUP>)。