算法导论15.5-最优二叉搜索树

#include <stdio.h>
#include <malloc.h>

void print_array(float *s, int n)
{
    int i,j;
    printf("%8d", 0);
    for (j = 0; j < n; j++){
        printf("%8d", j);
    }
    printf("\n");
    for(i = 1; i <= n; i++){
        printf("%8d", i);
        for (j = 0; j < n; j++){
            printf("%8.2f", *(s + i*n + j));
        }
        printf("\n");
    }
}

void optimal_bst(float *p, float *q, int n)
{
    float *e;
    float *w;
    float *root;
    float t;
    int l,i,j,r;

    e    = (float *)malloc(sizeof(float) * n * n);
    w    = (float *)malloc(sizeof(float) * n * n);
    root = (float *)malloc(sizeof(float) * n * n);
    // 对包伪关键字d0的子树,需要计算e[1,0],对包含伪关键字dn的子树,需要计算e[n+1,n]
    for(i = 1; i <= n; i++){
        *(e + i*n + i-1) = q[i-1];
        *(w + i*n + i-1) = q[i-1];
    }

    for(l = 1; l < n; l++){
        for(i = 1; i < n-l+1; i++){
            j = i + l -1;
            *(w + i*n + j) = *(w + i*n + j-1) + p[j] + q[j];
            for(r = i; r <= j; r++){
                t = *(e + i*n + r-1) + *(e + (r+1)*n + j) + *(w + i*n + j);
                if(t < *(e + i*n + j) || *(e + i*n + j) == 0.00){
                    *(e + i*n + j) = t;
                    *(root + i*n + j) = r;
                }
            }
            //printf("i=%d j=%d w=%-8.2fe=%-8.2froot=%-8.2f\n", i, j,*(w + i*n + j), *(e + i*n + j), *(root + i*n + j));
        }
    }

    print_array(e, n);
    print_array(w, n);
    print_array(root, n);
}

int main()
{
    float p[6] = {0,    0.15, 0.10, 0.05, 0.10, 0.20};
    float q[6] = {0.05, 0.10, 0.05, 0.05, 0.05, 0.10};
    optimal_bst(p, q, 6);
    return 0;
}

// 0       0       1       2       3       4       5
// 1    0.05    0.45    0.90    1.25    1.75    2.75
// 2    0.00    0.10    0.40    0.70    1.20    2.00
// 3    0.00    0.00    0.05    0.25    0.60    1.30
// 4    0.00    0.00    0.00    0.05    0.30    0.90
// 5    0.00    0.00    0.00    0.00    0.05    0.50
// 6    0.00    0.00    0.00    0.00    0.00    0.10

// 0       0       1       2       3       4       5
// 1    0.05    0.30    0.45    0.55    0.70    1.00
// 2    0.00    0.10    0.25    0.35    0.50    0.80
// 3    0.00    0.00    0.05    0.15    0.30    0.60
// 4    0.00    0.00    0.00    0.05    0.20    0.50
// 5    0.00    0.00    0.00    0.00    0.05    0.35
// 6    0.00    0.00    0.00    0.00    0.00    0.10

// 0       0       1       2       3       4       5
// 1    0.00    1.00    1.00    2.00    2.00    2.00
// 2    0.00    0.00    2.00    2.00    2.00    4.00
// 3    0.00    0.00    0.00    3.00    4.00    5.00
// 4    0.00    0.00    0.00    0.00    4.00    5.00
// 5    0.00    0.00    0.00    0.00    0.00    5.00
// 6    0.00    0.00    0.00    0.00    0.00    0.00

转载请注明:小Y » 算法导论15.5-最优二叉搜索树

赞 (0) 评论 (0) 分享 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址