實驗9 最優二叉搜尋樹

2021-09-22 05:50:36 字數 903 閱讀 6827

題目:

利用最優二叉搜尋樹來實現樹的搜尋代價最小。樹上的每乙個節點都有乙個被搜尋到的概率值pipi,搜尋乙個節點的花費為pi∗(depth(ki)+1)pi∗(depth(ki)+1),如何構造乙個二叉查詢樹使搜尋樹上的 所有節點的花費最小即為實現最優二叉查詢樹的問題。該問題可以用動態規劃的思路實現。 

形式化定義:給定n個不同關鍵字已經排序的序列k=(k1,k2,...,kn)因此(k1輸入輸出:

輸入為:結點的個數n,搜尋成功的概率bi,搜尋失敗的概率aj。以作業為例;

輸出為:最優二叉樹的結構。

源**:

/*

最優搜尋二叉樹

*/#include#includeusing namespace std;

#define max 30

int n;//搜尋元素個數

int b[max];//n個節點的對應的概率

int a[max + 1];//處在n個節點中間那些不存在的n+1虛節點

int w[max][max], m[max][max], s[max][max];

void input()

void obst()

for (int r = 0; r0)

if (s[root + 1][j]>0)

tree_struct(i, root - 1);

tree_struct(root + 1, j);

}}void print_s()

{ cout實驗結果:

最優二叉搜尋樹

問題描述 詳見演算法導論p212 p213 對於給定關鍵字序列,構造一顆最優的二叉查詢樹t,使得在t內的一次搜尋的期望代價最小 前提概念 最優子結構 設包含有序關鍵字 ki,kj 的最優二叉查詢樹以kr i r j 為根節點,則其左子樹 ki,kr 1 和右子樹 kr 1,kj 也同樣為最優二叉查詢...

最優二叉搜尋樹2

include stdio.h include stdlib.h include math.h define max 100 此函式返回一棵二叉樹的最小平均路長 n為有序集個數 a中存放在二叉樹中的葉節點找到x的概率 成功 b中存放在內節點上找到x的概率 失敗 s i j 存放最優子樹t i,j 根...

動態規劃 最優二叉搜尋樹

動態規劃與分治方法類似,都是通過組合子問題來求解原問題。通常用來求解最優化問題,通常按如下4個步驟設計乙個動態規劃演算法 1.刻畫乙個最優解的結構特徵 2.遞迴的定義最優解的值 3.採用自底向上的方法計算最優解的值 4.利用計算出的資訊構造乙個最優解。二叉搜尋樹 optimal binary sea...