二叉查詢樹是按照二叉樹結構來組織的,因此可以用二叉鍊錶結構表示。二叉查詢樹中的關鍵字的儲存方式滿足的特徵是:
設x為二叉查詢樹中的乙個結點。如果y是x的左子樹中的乙個結點,則key[y]≤key[x]。
遞迴解法(盜圖~)
構造三個表,w表儲存各節點出現頻率,e表儲存最優二叉搜尋樹的搜尋成本期望值,root表儲存最優子樹的樹根。
根據三個表,可以利用遞迴來構建最優二叉搜尋樹。
package com.qing.org.algorithm;
/** * optimal binary search trees
* 動態規劃實現,o(n3)
* @author qing
* */
public class obst ;
public static double w = new double[n+2][n+1];
public static double e = new double[n+2][n+1];//ki到kj最優二叉樹的搜尋成本期望值
public static int root = new int[n+1][n+1];
//構造三個表w,e,root
public static void optimalbst()
}}
} }//根據三張表w,e,root構造最小二叉搜尋樹
public static void constructobst()
//利用遞迴構造子樹
public static void construct_opt_obst(int start, int end, string dir, int r) }
//列印陣列
public static void print(int a)
system.out.println(" ");
} }public static void print(double a)
system.out.println(" ");
} }public static void main(string args)
}
測試結果:
出現了!傳說中的double相加問題,雖然對最後的構造結果是沒有什麼影響,但是若是想將double相加的值得到準確結果,請使用bigdecimal並且一定要用string來夠造。
bigdecimal b1 = new bigdecimal(double.tostring(v1));
bigdecimal b2 = new bigdecimal(double.tostring(v2));
return b1.add(b2).doublevalue();
本演算法及其實現參考演算法之道第二版第4章動態規 最小二叉樹
最小二叉樹常常用在找最短路徑 最小花費等題目中。與之相關的演算法有兩種,prim演算法和kruskal演算法,比較常用的是kruskal演算法,而且prim演算法沒怎麼理解清楚,所以就寫記一下kruskal演算法吧。實現步驟 t 表示邊的集合 1.設t的初試狀態是空集 2.當t中的邊數小於 n 1條...
動態規劃 最優二叉搜尋樹
動態規劃與分治方法類似,都是通過組合子問題來求解原問題。通常用來求解最優化問題,通常按如下4個步驟設計乙個動態規劃演算法 1.刻畫乙個最優解的結構特徵 2.遞迴的定義最優解的值 3.採用自底向上的方法計算最優解的值 4.利用計算出的資訊構造乙個最優解。二叉搜尋樹 optimal binary sea...
最優二叉搜尋樹動態規劃
最優二叉搜尋樹問題是對於有序集s及其訪問概率或權值 q0,p1,q1,p2,q2,p3,q3 在所有表示有序集s的二叉搜尋樹中找出一顆具有最小平均路長的二叉搜尋樹。解決方法 使用動態規劃方法自底向上逐步構造最優二叉搜尋樹。動態規劃的兩個重要要素是 1 最優子結構。2 重疊子問題。1 所謂最優化子結構...