动态规划——最优二叉查找树

本文介绍了一种构造最优二叉查找树的算法,并通过具体的C语言代码实现了该算法。文章详细阐述了如何通过给定的关键字出现概率来确定最优二叉查找树的结构,以最小化平均查找成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大年夜,中午在姑姑家喝了些酒,头有些疼,晕乎乎的只想睡觉,还以为是酒精的力量,晚上在干妈家吃饭,愈发难受,意识到应该是感冒了,草草吃了些,就回家磕了点药睡觉,闹钟拨到11点,春晚就拜拜了,但岁还得守,老祖宗的规矩可不能破,^-^
最优二叉查找树
e[i][j]的值是在最优二叉查找树中的期望搜索代价。为有助于记录最优二叉查找树的结构,定义root[i][j]为k[r]的下标r,对1 <= i <= j <= n,k[r]是包含关键字k[i], ... , k[j]的一棵最优二叉查找树的根。
e[i][j] = q[i-1]    if (j = i - 1)
e[i][j] = min(i <= r <= j){e[i][r-1] + e[r+1][j] + w[i][j]}  if (i <= j)
w[i][j] = w[i][j-1] + p[j] + q[j]

Main.c

#include <stdio.h>
#include 
<string.h>
#include 
<limits.h>
#define MAXLEN 100

void OptimalBST(float *p, float *q, int n, double e[][MAXLEN], int root[][MAXLEN])
{
    
int i, j, L, t, r;
    
float w[MAXLEN][MAXLEN];
    
    
for(i = 1; i <= n + 1; i++)
    
{
        e[i][i
-1= q[i-1];
        w[i][i
-1= q[i-1];
    }

    
for(L = 1; L <= n; L++)
    
{
        
for(i = 1; i <= n-L+1; i++)
        
{
            j 
= i + L - 1;
            e[i][j] 
= INT_MAX;
            w[i][j] 
= w[i][j-1+ p[j] + q[j];
            
for(r = i; i <= j; i++)
            
{
                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;
                }

            }

        }

    }

}


int main(int argc, char **argv)
{
    
float p[MAXLEN] = {0.000.150.100.050.100.20};
    
float q[MAXLEN] = {0.050.100.050.050.050.10};
    
double e[MAXLEN][MAXLEN];
    
int root[MAXLEN][MAXLEN];
    
int n;

    n 
= 5;
    
    OptimalBST(p, q, n, e, root);
    
    
return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值