最优BST的动态规划算法Java实现

   //输入p: 访问概率数组; 0,1,....n是排好序的Key值
   //输出A=new float[n][n]: 最优时间矩阵
   //输出R=new int[n][n]: 根结点矩阵
   static void optimalBST(float[] p,float[][] A,int[][] R){
	   int n =  p.length;
	   for(int i=0;i<n;i++){		   
		   A[i][i] = p[i];	   
		   R[i][i] = i; //the root is itself
	   }  	   
	    
	   for(int diag=1;diag<n;diag++){
		   for(int i=0;i<n;i++){
			   int j = diag + i;
			   
			   if(j>n-1) break;
			   
			   float min=-1;
			   int root=i;
			   for(int k=i;k<=j;k++){
				   float tmp1 = 0;
				   float tmp2 = 0;
				   if(k-1>=i){
					   tmp1 = A[i][k-1];
				   }
				   if(j>=k+1){
					   tmp2 = A[k+1][j];
				   }
				   float tmp = tmp1 + tmp2;
				   //all min must be greater than 0.
				   if(min<0 || tmp<min){
					   min = tmp;
					   root = k;
				   }				   
			   }
			   R[i][j] = root;
			   A[i][j] = min;
			   for(int m=i;m<=j;m++){
				   A[i][j] += p[m];
			   }
		   }
	   }
	   
   }
本算法只计算平均的BST访问开销A[0][n-1]以及每颗子树的根节点R[i][j],要构建BST,只需从R[0][n-1]递归就可以计算出。时间复杂度O(n^3),与Floyd最短路经算法的复杂度相当。

posted @ 2011-06-05 21:57  ljsspace  阅读(542)  评论(0编辑  收藏  举报