//输入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最短路经算法的复杂度相当。