題目:
利用最優二叉搜尋樹來實現樹的搜尋代價最小。樹上的每乙個節點都有乙個被搜尋到的概率值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...