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

来源:互联网 发布:美国国籍 知乎 编辑:程序博客网 时间:2024/06/09 13:42

定义binary search tree:是由一些项目组成的二叉树,这些项目通常成为键,来自一个有序集合,通常满足以下条件:

(1)每个节点包含一个键;

(2)一个给定节点的左子树的键小于等于该节点的键;

(3)一个给定节点的右子树的键大于等于该节点的键;

深度depth:从根节点到该节点的唯一路径的边数;

树的深度是所有节点的最大深度;

若二叉树所有节点的两个子树的深度差都不超过1,则称该二叉树是平衡的;

定义数据类型:

struct nodeTyoe{keytpye key;nodetype *right;nodetype * left;}tyoedef nodeType* nodePointer;
在二叉查找树中找出包含一个键的节点,假设这个件就在树中

void search(nodePointer tree,keytype keyin,nodePointer& p)//查找二叉树{bool found;p=tree;found=false;while(!found)if(p->key=keyin)found=true;else if(keyin<p->key)p=p->left;//查找key小,向左子节点前进else p=p->right;//查找key大,向右子节点前进  } 

设pi是keyi作为查找键的概率,ci是在给定树中查找keyi所需的比较次数

则这棵树的平均查找时间是Σcipi,是我们希望最小化的值。

我们用A[i][j]来表示键keyi到keyj在树中最优值,A[i][i]=1*pi=pi。

可以得到、

A[i][j]=min{A[i][k-1]+A[k][j]}(i<=k<=j)+Σpm(i到j)

A[i][i]=pi

A[i][i-1]=A[j+1][j]=0

最优二叉树

void optsearchtree(int n,const float p[],float& minavg,index R[][])//p[i]是查找第i个键的概率 {index i,j,k,diagoanl;float A[n+1][n];for(i=0;i<=n;i++){A[i][i-1]=0;A[i][i]=p[i] ;R[i][i]=i;//R[i][j]包含了一颗最优树根节点处的键的索引,最优树中包含第i到j个键 R[i][i-1]=0;}A[n][n+1]=0;R[n][n+1]=0;for(diagonal=1;diagonal<=n-1;diagonal++)for(i=1;i<n-diagonal;i++){j=j+diagonal;A[i][j]=min{A[i][k-1]+A[k][j]}(i<=k<=j)+Σpm//(i到j)R[i][j]=mink;//等于最小值时的k值 } minavg=A[i][n]; } 
生成最优二叉树
nodePointer tree(index i,j){index k;nodePointer p;k=R[i][j];if(k==0)return NULL;else{p=new nodeType;p->key=key[k];p->left=tree(i,k-1);p->right=tree(k+1,j);return p;} } 


原创粉丝点击