最优二叉查找树的期望搜索代价(动态规划)C++实现
2011-11-03 20:34
711 查看
// 最优二叉查找树的期望搜索代价.cpp : Defines the entry point for the console application.
//
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/02/f4bcaee56092d8a7898aa0c99d43d128.gif)
#include "stdafx.h"
#include<iostream>
#include<cmath>
#include<limits>
#define N 100
using namespace std;
const double MAX = numeric_limits<double>::max(); //double的最大值
int _tmain(int argc, _TCHAR* argv[])
{
//p[j]存储第j关键字的概率(j=1...n)
double p
;
//存储第j虚拟键的概率(j=0...n)
double q
;
//存储包含关键字ki....kj的最优子树的搜索代价
double c
;
//存储包含关键字ki....kj和虚拟键的最优子树的概率和
double w
;
//存储存储包含关键字ki....kj的最优子树的根
int root
;
int cases;
cout<<"请输入案例的个数:"<<endl;
cin>>cases;
while(cases--)
{
int n;
double sum = 0;
int i,j,l;
cout<<"请输入关键字的个数:"<<endl;
cin>>n;
cout<<"请输入每个关键字的概率:"<<endl;
for(i=1;i<=n;i++)
{
cin>>p[i];
sum += p[i];
}
cout<<"请输入每个虚拟键的概率:"<<endl;
for(i=0;i<=n;i++)
{
cin>>q[i];
sum += q[i];
}
//
if(abs(sum-1)>0.01)
{
cout<<"输入的概率和不为1,请重新输入"<<endl;
cases++;
continue;
}
for(i=1;i<=n+1;i++)
{
c[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 = l+i-1;
c[i][j] = MAX;
w[i][j] = w[i][j-1] + p[j] +q[j];
int r;
for(r=i;r<=j;r++)
{
double k = c[i][r-1] + w[i][j] + c[r+1][j];
if(k<c[i][j])
{
c[i][j] = k;
root[i][j] = k;
}
}
}
}
cout<<"最优二叉查找树的期望搜索代价为:"<<c[1]
<<endl;
}
system("pause");
return 0;
}
---------------------------------------------测试程序----------------------------------------------
请输入案例的个数:
1
请输入关键字的个数:
5
请输入每个关键字的概率:
0.15 0.10 0.05 0.10 0.20
请输入每个虚拟键的概率:
0.05 0.10 0.05 0.05 0.05 0.10
最优二叉查找树的期望搜索代价为:2.75
请按任意键继续. . .
//
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/02/f4bcaee56092d8a7898aa0c99d43d128.gif)
#include "stdafx.h"
#include<iostream>
#include<cmath>
#include<limits>
#define N 100
using namespace std;
const double MAX = numeric_limits<double>::max(); //double的最大值
int _tmain(int argc, _TCHAR* argv[])
{
//p[j]存储第j关键字的概率(j=1...n)
double p
;
//存储第j虚拟键的概率(j=0...n)
double q
;
//存储包含关键字ki....kj的最优子树的搜索代价
double c
;
//存储包含关键字ki....kj和虚拟键的最优子树的概率和
double w
;
//存储存储包含关键字ki....kj的最优子树的根
int root
;
int cases;
cout<<"请输入案例的个数:"<<endl;
cin>>cases;
while(cases--)
{
int n;
double sum = 0;
int i,j,l;
cout<<"请输入关键字的个数:"<<endl;
cin>>n;
cout<<"请输入每个关键字的概率:"<<endl;
for(i=1;i<=n;i++)
{
cin>>p[i];
sum += p[i];
}
cout<<"请输入每个虚拟键的概率:"<<endl;
for(i=0;i<=n;i++)
{
cin>>q[i];
sum += q[i];
}
//
if(abs(sum-1)>0.01)
{
cout<<"输入的概率和不为1,请重新输入"<<endl;
cases++;
continue;
}
for(i=1;i<=n+1;i++)
{
c[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 = l+i-1;
c[i][j] = MAX;
w[i][j] = w[i][j-1] + p[j] +q[j];
int r;
for(r=i;r<=j;r++)
{
double k = c[i][r-1] + w[i][j] + c[r+1][j];
if(k<c[i][j])
{
c[i][j] = k;
root[i][j] = k;
}
}
}
}
cout<<"最优二叉查找树的期望搜索代价为:"<<c[1]
<<endl;
}
system("pause");
return 0;
}
---------------------------------------------测试程序----------------------------------------------
请输入案例的个数:
1
请输入关键字的个数:
5
请输入每个关键字的概率:
0.15 0.10 0.05 0.10 0.20
请输入每个虚拟键的概率:
0.05 0.10 0.05 0.05 0.05 0.10
最优二叉查找树的期望搜索代价为:2.75
请按任意键继续. . .
相关文章推荐
- 最优二叉查找树的期望搜索代价(动态规划)C++实现
- 动态规划之最优二叉搜索树的结构 C++实现
- 【动态规划】最优二叉搜索树C++实现
- 最优二叉查找树-optimal-BST--C++实现
- 最优二叉查找树的详细分析,c++代码实现
- 二叉搜索树 -【动态规划】最优C++实现
- 最优二叉查找树-optimal-BST--C++实现2
- ACM最长公共子序列问题(动态规划)C++实现
- 最优二叉查找树的Ruby实现
- 算法导论--二叉查找树--C++实现
- 相似图片搜索原理二(phash—c++实现)
- 石油主管道最优位置问题(平均时间为线性时间)C++实现
- 二叉排序树(二叉查找树)的各种操作C++最新实现
- 0-1背包问题与完全背包问题C++实现 动态规划
- 动态规划的简要总结和四个经典问题的c++实现
- C++实现搜索二叉树
- C++模板实现二叉查找树(三 深度优先遍历)
- 基于C++ STL图的邻接表表示及深度、广度搜索实现
- 动态规划 -- 最优二叉查找树
- ACM最长公共子序列问题(动态规划)C++实现