本書從文字翻譯的案例切入,假設把英文翻譯為法文,每個英文單詞為關鍵字,其對應法文為衛星資料。用二叉查詢樹儲存,該怎麼設計這個查詢樹。即使是紅黑樹,查詢的時間複雜度也為o(lgn)即樹的深度。但是因為文章中某個單詞出現的頻率不同,所以可能有些頻率很高的單詞比如the的深度可能很深,而不常見的aha的深度卻可能很淺。根據直覺,我們應該讓本例中the更加靠近樹根才對(其實即使概率最高也不見得就是樹根)。我們應該讓查詢整個樹的期望次數最小,即構建乙個最優二叉查詢樹。乙個最優二叉查詢樹的左右子樹的肯定也是最優的。陣列p中是k1~k5的概率。k1到k5是從小到大的順序,即字典序。當找不到要查詢到英文單詞時肯定最終會走到樹葉,每個樹葉出現的概率儲存到陣列q中。我一直沒弄明白這個樹葉的概率作者是怎麼搞出來的。誰知道告訴我一下。
程式乙個注意的地方就是浮點數比較,不能直接比較,除非相差很大才行,如果兩個浮點數相等,要是直接使用大於號進行判斷也有可能成立。
**如下:
#include using namespace std;
void opticalbst(double *p,double *q,int n,double (*e)[6],int (*root)[6])
for(int l=1;l<=n;l++)
}} }
}void constructopticalbst(int (*root)[6],int i,int j)
{ if(i==1&&j==5)
{ cout<<"k"<
演算法導論筆記 第十五章 動態規劃
點此訪問 第一部分比較抽象,建議先大體上瀏覽一下,有個初步印象,等熟悉第二部分的具體的例題之後,回過頭再仔細總結這一部分。首先說明一點,動態規劃 dynamic programming 中的programming指的是一種 法,而不是程式設計的意思。動態規劃法的思想妙就妙在這個 上。根據動態規劃思想...
第十五章動態規劃之「矩陣鏈乘法」
裝配線排程與矩陣鏈乘法是很典型的動態規劃的兩個例子。關於這倆例子對於理解動態規劃的作用稍後補上。這個程式的時間複雜度為 n 3 這個可以通過替換法證明。輸出最優加括號的 對於理解遞迴很有幫助,蹭蹭蹭,先往回跑,路上什麼也不幹,跑到頭再跑回來,把該幹的都幹了,先自頂向下,再自底向上。如下 includ...
演算法導論 動態規劃之最優二叉查詢樹
如果我們想寫乙個單詞查詢的軟體的話,我們的目的就是讓查詢的總時間最短,我們首先想到用之前的二叉查詢樹。我們可以用紅黑樹或者其它的平衡二叉樹來保證每個單詞的搜尋時間。但是每個單詞出現的頻率一般不同,因此我們希望把頻率較大的單詞放在離根比較近的地方,頻率較小的放在離葉子較近的地方。而且,我們所要查詢的單...