最優二叉搜尋樹 的C++實現
阿新 • • 發佈:2019-01-29
#include<iostream> using namespace std; void OptimalBST(float*p_Node,float*p_NonNode, float m [6][6],float w[6][6],float s[6][6],int NodeNum) { ///初始化 for(int i = 0;i<=NodeNum;i++){ w[i+1][i] = p_NonNode[i]; m[i+1][i] = 0; } for(int r = 0;r<NodeNum;r++) for(int i = 1;i<=NodeNum-r;i++){ int j = i+r; w[i][j] = w[i][j-1]+p_NonNode[j]+p_Node[j]; m[i][j] = m[i+1][j]; ///s[i][j]表示最優樹T(i,j)的根節點元素的下標 s[i][j] = i; for(int k = i+1;k<=j;k++){ float t = m[i][k-1]+m[k+1][j]; if(t<m[i][j]){ //cout<<"m[i][j]="<<m[i][j]; //cout<<" t=" <<t; //cout<<" k="<<k<<endl; m[i][j] = t; s[i][j] = k; } } m[i][j] += w[i][j]; } } int main() { int NodeNum = 5; float p_Node[6] = {0,0.1,0.3,0.1,0.2,0.1}; float p_NonNode[6] = {0.04,0.02,0.02,0.05,0.06,0.01}; float m[6][6]; float w[6][6]; float s[6][6] = {-1}; OptimalBST(p_Node,p_NonNode,m,w,s,NodeNum); for(int i = 0;i<=NodeNum;i++){ for(int j = 0;j<=NodeNum;j++){ cout<<s[i][j]<<" "; } cout<<endl; } }
執行結果如圖
以上演算法用s[i][j]儲存最優子樹T(i,j)的根節點。當s[1][n]=k 時,Xk 為最優搜尋樹的根節點。T(1,n)的子問題為T(1,k-1)和T(k+1,n),同理可知T(1,k-1)的根節點下標為s[1][k-1]。以此類推可得此問題最優搜尋樹如圖:
演算法設計課作業,參考《演算法設計與分析》,王曉東著。
如有錯誤,歡迎評論區批評指正。
轉載請註明出處。