算法-动态规划4查找问题-最优二叉查找树

1、基本概念:

在这里插入图片描述
(1)若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
(2)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
(3 它的左、右子树也分别为二叉排序树

2、示例:

在这里插入图片描述

3、动态规划函数:

在这里插入图片描述

5、矩阵C和矩阵R:

在这里插入图片描述

6、算法:

double C[1000][1000];
double R[1000][1000];

double OptimalBST(double p[], int n) {
	int i, j, k, d;
	int min, mink, sum;
	for (i = 1; i <= n; i++) {	//初始化主对角线和第一条次对角线
		C[i][i - 1] = 0;
		C[i][i] = p[i - 1];	//第i个元素的查找概率存储在p[i-1]处
		R[i][i] = i;	
	}

	C[n + 1][n] = 0;

	for (d = 1; d < n; d++) {		//按对角线逐条计算
		for (i = 1; i <= n - d; i++) {
			j = i + d;
			min = 1000;
			mink = i;
			sum = 0;
			for (k = 1; k <= j; k++) {
				sum = sum + p[k - 1];	//下标从0开始
				if (C[i][k - 1] + C[k + 1][j] < min) {	//接之前的for循环,求所有k中最小的min
					min = C[i][k - 1] + C[k + 1][j];
					mink = k;		//记录k值
				}
			}
			C[i][j] = min + sum;
			R[i][j] = mink;
		}
		return C[1][n];
	}
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值