算法分析与设计实验报告 (2)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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++)

相关文档
最新文档