首页 > 算法 > 最优二叉搜索树-算法回顾

最优二叉搜索树-算法回顾

2013年4月29日 发表评论 阅读评论 4876次阅读    

在review之前的书籍,所以把学到的顺手记录在这里了。

由最 优二叉搜索树可以延伸到3X,4X,nX搜素树,只不过在寻找最优子树的时候需要处理3,4的情况。

如果所有节点的概率都想等的话,直接构造完全二叉树就行了。

#include
//gcc  -std=c99 bst.c
#define MAX_WEIGHT 9999999

/*pb[]  : 每个节点的概率大小
 *root  : 返回的根信息数组
 *n     : 节点数目
 *return:总搜索代价
 * */
float bst( float pb[], int *root, int n){
    float cost[n][n] ;//i到j的搜索成本期望值
    float psum[n][n] ;//i到j的权重之和
    for( int i=-1; i<n; i++ ){
        psum[i+1][i] = 0 ;
        cost[i+1][i] = 0 ;
    }

    for(int len = 1; len <= n; ++len ){// 子树长度从1到n,依次求出其最优结构
        for(int beg = 0; beg <= n-len; ++beg ){
            int end = beg + len -1 ;
            cost[beg][end] = MAX_WEIGHT ;
            psum[beg][end] = psum[beg][end-1] + pb[end] ;//逐步累积求beg到end的概率之和。
            for( int tmp=beg; tmp <= end; ++tmp ){//循环扫描,已beg-end之间的任何一个节点当根,找出最优的子树根                 float tcost = cost[beg][tmp-1] + cost[tmp+1][end] + psum[beg][end] ;                 if( cost[beg][end] > tcost) {
                    cost[beg][end] = tcost ;
                    root[beg*n + end] = tmp ;
                }
            }
        }
    }
}

int main(int argc, char* argv[]) {

    printf("hello kulv\n");
    float probability[] = {0.24, 0.18, 0.09, 0.13, 0.3, 0.06 } ;
    int count = sizeof(probability) / sizeof(float) ;
    int root[count][count] ;
    float mincost = bst( probability, (int*)root, count) ;
    printf("min cost is:%f\n", mincost);
    for(int i=0; i< count; ++i){
        for(int j=0; j< count; ++j ){
            if( j< i) printf("\t");
            else printf("%d\t", root[i][j]);
        }
        printf("\n");
    }
}
Share
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。