繁体   English   中英

O(n^2) 中的 Knuth 最优二叉搜索树

[英]Knuth's Optimal Binary Search tree in O(n^2)

我正在尝试实现可以在 O(n^2) 时间内运行的 Knuth 的最佳二叉搜索树。 我有在 O(n^3) 中运行的代码。

float P[N + 1] = {0, .13, .12, .15, .05, .12, .10, .08, .09, .03, .13};
float sum[N + 1] = {0, .13, .25, .40, .45, .57, .67, .75, .84, .87, 1.00};
float M[N + 1][N + 1];
int root[N + 1][N + 1];
int s, i, j;
float temp;
for (s = 0; s <= N; s++){
    for (i = 0; i <= N; i++){
        M[s][i] = 0;
        root[s][i] = 0;

    }

}
for (s = 2; s <= N; s++){
    for (i = 1; i <= N - s + 1; i++){
        M[s][i] = N;
        for (j = i; j <= i + s - 1; j++){
            temp = M[j - i][i] + M[i + s - j - 1][j + 1]+ sum[i + s - 1] - sum[i - 1] - P[j];
            if (M[s][i] > temp){
                M[s][i] = temp;
                root[s][i] = j;

            }

        }

    }
}

M 是成本数组。 P 是每个节点的概率。 我从以下方面得到一些想法: 动态编程:为什么 Knuth 改进了最优二叉搜索树 O(n^2)? . 就我而言,我尝试将第三个循环从for (j = i; j <= i + s - 1; j++)修改为for (j = root[s+1][i]; j <= root[s][i-1]; j++) 但它不起作用。 有人可以给我一些关于这个问题的线索吗?

您应该按大小按非递减顺序计算最佳子树的成本,因此当您填写 M[s][i] --- 最左边键的大小为 s 的子树的最小成本时有索引 i --- 你还没有填写 M[s+1][i] 或 root[s+1][i] 。

干杯,特拉维斯

PS "j <= root[s][i-1]" 也不完全正确。

暂无
暂无

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

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