動態規劃 最小二叉搜尋樹(OBST

2021-07-11 02:40:58 字數 1604 閱讀 1954

二叉查詢樹是按照二叉樹結構來組織的,因此可以用二叉鍊錶結構表示。二叉查詢樹中的關鍵字的儲存方式滿足的特徵是:

設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 所謂最優化子結構...