算法分析与设计实验报告 (2)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析与设计上机实验报告
课程名称:算法分析与设计班级:实验日期:
姓名:学号:指导教师:许晓华实验名称:最优二叉搜索树实验地点:主楼1114实验成绩:一、实验目的及要求
1.进一步掌握最优二叉树的含义。
2.掌握最优二叉树的结构特征。
3.认真阅读和掌握动态规划法秋最有搜索二叉树实验的程序。
4.上机运行本程序。
5.保存和打印出程序的运行结果,并结合程序进行分析。
6.按照你二叉树的操作需要,可重新改写主程序并运行,请上交文件清单和运行结果
二、实验环境及设备
微机一台:Intel 酷睿2双核
操作系统:Microsoft Windows XP Professional
工具软件:Microsoft Visual C++ 6.0
三、实验内容及实验步骤
动态规划——最优二叉查找树
1,问题描述:给定一个有序序列K={k1 2,问题分析: 在二叉树中T内搜索一次的期望代价为: E[T]= (depth(ki)+1)*pi //对每个i=1~n,搜索成功情况 +(depth(di)+1)*qi //对每个i=0~n,搜索失败情况 3,问题求解:动态规划 步骤一:寻找最优子结构。 一个最优二叉树的子树必定包含连续范围的关键字ki~kj,1<=i<=j<=n,同时也必须含有连续的虚叶子节点di-1~dj。 如果一棵最优二叉查找树T有一棵含有关键字ki~kj的子树T',那么,T'也是一棵最优查找树,这通过剪贴思想可以证明。 现在开始构造最优子结构:在ki~kj中,选定一个r,i<=r<=j,使以kr为根,ki~k(r-1)和k(r+1)~kj为左右孩子的最优二叉树。注意r=i或者r=j的情况,表示左子树或右子树只有虚叶子节点。 步骤二:一个递归解。 定义e[i,j]为一棵包含关键字ki~kj的最优二叉树的期望代价。当j=i-1时没有真实的关键在,只有虚叶子节点d(i-1)。 于是: 当j=i-1时,e[i,i-1]=q(i-1)。 当j>=i时,需要选择合适的kr作为根节点,然后其余节点ki~K(r-1)和k(r+1)~kj构造左右孩子。这时要考虑左右孩子这些节点成为一个节点的子树后,它的搜索代价的变化:根据E[T]的计算,得知它们的期望代价增加了“子树中所有概率的总和”w。 w[i,j]= pl // 对每个l=i~j +ql //对每个l=i-1~j 于是当j>=i时,e[i,j]=pr + (e[i,r-1]+w[i,r-1])+(e[r+1,j]+w[r+1,j]) = e[i,r-1] + e[r+1,j]+w[i,j]; 步骤三:计算最优二叉树的期望代价 e[i,j]= q(i-1) //如果j=i-1 min(e[i,r-1] + e[r+1,j]+w[i,j]),如果i<=j,其中i<=r<=j w[i,j] = q(i-1) 如果j=i-1 w[i,j]=w[i,j-1]+pj+qj 如果i<=j 实现代码如下: view plaincopy to clipboardprint? 1 #include 2 using namespace std; 3 4 #define MAXNUM 100 5 #define MAX 65536 6 //p中为有序关键字k1到k5的搜索概率,k1 7 double p[MAXNUM] = {0.00,0.15,0.10,0.05,0.10,0.20}; 8 double q[MAXNUM] = {0.05,0.10,0.05,0.05,0.05,0.10}; 9 void optimal_bst(double e[][MAXNUM],int root[][MAXNUM],double w[][MAXNUM],int n) 10 { 11 int i =0,j=0; 12 //针对左或右孩子为空树情况初始化 13 for(i = 1;i<=n+1;i++) 14 { 15 e[i][i-1] = q[i-1]; 16 w[i][i-1] = q[i-1]; 17 } 18 int l = 0; 19 //计算顺序如下:根据计算式:e[i,j] = e[i,r-1]+e[r+1,j 首先计算节点个数为1的最优二叉树的代价e[1,1],e[2,2]…… 接着计算节点个数为1的最优二叉树的代价e[1,2],e[2,3]…… …… 最后计算结点个数为n的最优二叉树的代价e[1,n],利用之前保存的较少结点最优二叉树的结果。 20 for(l = 1;l<=n;l++) 21 { 22 for(i = 1;i<=n-l+1;i++) 23 { 24 j = i+l-1; 25 e[i][j] = MAX; 26 w[i][j] = w[i][j-1] + p[j]+q[j]; 27 for(int r = i;r<=j;r++)