哈夫曼編碼貪心演算法
① 哈夫曼編碼碼長怎麼算
設某信源產生有五種符號u1、u2、u3、u4和u5,對應概率P1=0.4,P2=0.1,P3=P4=0.2,P5=0.1。
霍夫曼編碼是變長編碼,思路:對概率大的編的碼字短,概率小的編的碼字長,這樣一來所編的總碼長就小,這樣編碼效率就高。上面那樣求是不對的,除非你這6個碼字是等概率的,各佔1/6。應該用對應的概率*其對應得碼長,再求和。
實際應用中
除採用定時清洗以消除誤差擴散和採用緩沖存儲以解決速率匹配以外,主要問題是解決小符號集合的統計匹配,例如黑(1)、白(0)傳真信源的統計匹配,採用0和1不同長度遊程組成擴大的符號集合信源。遊程,指相同碼元的長度(如二進碼中連續的一串0或一串1的長度或個數)。
按照CCITT標准,需要統計2×1728種遊程(長度),這樣,實現時的存儲量太大。事實上長遊程的概率很小,故CCITT還規定:若l表示遊程長度,則l=64q+r。
② 用動態規劃解決鋼條切割問題時它的最優子結構是什麼
1、兩種重要演算法思想: 動態規劃,貪心演算法
2、動態規劃:
基本原理:動態規劃英文名dynamic programming。其中pogramming指的是表格法,而非編寫計算機程序。因此,可以初步得出動態規劃的基本思想:將一個具有最優子結構性質的問題分成若干個子問題,在求解過程中,記錄下子問題的結果,存儲在一個表格中,使得公共的子問題只需要計算一次。書中給出的基本原理:動態規劃將問題分成若干個相互重疊的子問題,遞歸的求解子問題,保存子問題的解,再將它們的解組合起來,求出原問題的解。
從基本原理中可以看出動態規劃需要滿足兩個條件,最優子結構和子問題重疊。
最優子結構:書中定義:問題的最優解由相關子問題的最優解組合而成,一個問題的最優解包含其子問題的最優解。典型的有背包問題和鋼條切割我問題。所謂子問題就是一中組合,將一個問題分成許多子問題的集合。某個子問題轉化為問題時,所需要的代價是固定的。
一般這類問題的解題過程:(自己總結)
畫出子問題圖(類似於逆拓撲排序的圖,子問題必須在問題前面完成)
用數學表達式構建出問題的最優解和子問題最優解之間的代數表達式
通常採用自底向上的方法進行遞歸地求解問題的解,自底下上的含義是從最小的子問題求起。
保存每一步求出的子問題的最優解
利用計算出的信息構造一個最優解
3、貪心演算法:
基本原理:從初始狀態出發,每步都經過貪心選擇,最終得到問題的最優解。
含義: 將每一步都看成是當前最佳的選擇,做到局部最優化,直到無法選擇為止。寄希望於局部最優的選擇能夠導致全局最優解。
兩個實例:最小生成樹演算法和單源最短路徑演算法,以及集合覆蓋問題的貪心啟發式演算法。
prim演算法:將集合A看成是一棵樹,每次選擇剩餘的節點中與這棵樹形成的邊的權值最小的點加入到集合A中形成新的樹,循壞調用該過程,知道所有的點都已經放入到集合A中。初始時隨機選擇一個節點放入到集合A中。
kruskal演算法:在所有連接森林中兩顆不同樹的邊裡面,找到權重最小的邊(u,v),並將其加入到集合A中,循環調用該過程,直到所有的點已經放入到集合A中
貪心選擇:當進行選擇時,我們直接作在當前問題看來是最優的選擇,而不必考慮子問題的解。這與動態規劃不同,動態規劃當前問題依賴於較小的子問題。而貪心演算法中做當前問題最優選擇,這樣每步之後只需要做一個子問題的解。
也必須滿足最優子結構的性質,即一個問題的最優解包含其子問題的最優解。
那麼,如何區分什麼時候使用動態規劃,什麼時候使用貪心演算法呢?
典型的兩個問題,0-1背包和分數背包。兩者都具有最優子結構性質,但是貪心演算法只能用來求分數背包的問題,而不能用來求0-1背包的問題。即只有分數背包具有貪心選擇性。
我得總結(不一定對):具有貪心選擇性的一類問題是:每次做選擇時只有性能不同,而代價是一樣的。那麼這樣每次的選擇都是最好的,最終會得到最好的結果。
哈夫曼編碼也使用貪心選擇演算法。每次選擇待編碼的字元都選擇在剩餘的字元中出現次數最多的
③ 霍夫曼編碼用c語言實現
兒子放假回家沒帶課本,無法完成作業。誰能幫我傳一份冀教版小學三年級語文下冊生字表啊?關於冀教版就是:第一課,春的消息。第二課,燕子。第三課,柳笛和榆錢。第四課,古詩二首。。。。。。。。我要1-30課的生字表。謝謝
④ huffman編碼演算法可以使用貪心演算法嗎
設字元集合M={A,B,C,D,E,F}在文本中出現的頻率分別為{8,1,3,10,6,5},畫出字元集合M的Huffman編碼樹,並給出各字元的Huffman編碼
⑤ 在編程和演算法領域,有哪些經典問題
新手查詢實操V出生地
⑥ 幾種經典演算法回顧
今天無意中從箱子里發現了大學時學演算法的教材《演算法設計與分析》,雖然工作這么幾年沒在什麼地方用過演算法,但演算法的思想還是影響深刻的,可以在系統設計時提供一些思路。大致翻了翻,重溫了一下幾種幾種經典的演算法,做一下小結。分治法動態規劃貪心演算法回溯法分支限界法分治法1)基本思想將一個問題分解為多個規模較小的子問題,這些子問題互相獨立並與原問題解決方法相同。遞歸解這些子問題,然後將這各子問題的解合並得到原問題的解。2)適用問題的特徵該問題的規模縮小到一定的程度就可以容易地解決該問題可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題3)關鍵如何將問題分解為規模較小並且解決方法相同的問題分解的粒度4)步驟分解->遞歸求解->合並 divide-and-conquer(P) { if ( | P | <= n0) adhoc(P); //解決小規模的問題 divide P into smaller subinstances P1,P2,...,Pk;//分解問題 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //遞歸的解各子問題 return merge(y1,...,yk); //將各子問題的解合並為原問題的解 }google的核心演算法MapRece其實就是分治法的衍生5)分治法例子:合並排序規約過程:動態規劃1)基本思想將待求解問題分解成若干個子問題,但是經分解得到的子問題往往不是互相獨立的,如果能夠保存已解決的子問題的答案,而在需要時再找出已求得的答案,就可以避免大量重復計算2)適用問題的特徵最優子結構在遞歸計算中,許多子問題被重復計算多次3)步驟找出最優解的性質,並刻劃其結構特徵。遞歸地定義最優值。以自底向上的方式計算出最優值。根據計算最優值時得到的信息,構造最優解。貪心演算法1)基本思想貪心演算法總是作出在當前看來最好的選擇。也就是說貪心演算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的局部最優選擇2)適用問題的特徵貪心選擇性質,即所求問題的整體最優解可以通過一系列局部最優的選擇,即貪心選擇來達到。最優子結構性質3)步驟:不斷尋找局部最優解4)例子:找硬幣,哈夫曼編碼,單源最短路徑,最小生成樹(Prim和Kruskal) 最小生成樹圖示:回溯法1)基本思想在問題的解空間樹中,按深度優先策略,從根結點出發搜索解空間樹。演算法搜索至解空間樹的任意一點時,先判斷該結點是否包含問題的解。如果肯定不包含,則跳過對該結點為根的子樹的搜索,逐層向其祖先結點回溯;否則,進入該子樹,繼續按深度優先策略搜索2)適用問題的特徵:容易構建所解問題的解空間3)步驟定義問題的解空間 確定易於搜索的解空間結構以深度優先方式搜索解空間,並在搜索過程中用剪枝函數避免無效搜索 4)回溯法例子:N皇後問題分支限界法1)基本思想分支限界法常以廣度優先或以最小耗費(最大效益)優先的方式搜索問題的解空間樹。 在分支限界法中,每一個活結點只有一次機會成為擴展結點。活結點一旦成為擴展結點,就一次性產生其所有兒子結點。在這些兒子結點中,導致不可行解或導致非最優解的兒子結點被舍棄,其餘兒子結點被加入活結點表中。此後,從活結點表中取下一結點成為當前擴展結點,並重復上述結點擴展過程。這個過程一直持續到找到所需的解或活結點表為空時為止。2)分支限界法例子:單源最短路徑問題問題描述:在下圖所給的有向圖G中,每一邊都有一個非負邊權。
⑦ 劉汝佳的演算法藝術與信息學竟賽13頁1.2.2節貪心法例一:釣魚!分析部分第一段話怎樣理解
貪心法(Greedy algorithm)是一種在每一步選擇中都採取在當前狀態下最好/優的選擇,從而希望導致結果是最好/優的演算法。比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市, 那這就是一種貪心演算法。
貪心演算法在有最優子結構的問題中尤為有效。最優子結構的意思是局部最優解能決定全局最優解。簡單地說,問題能夠分解成子問題來解決,子問題的最優解能遞推到最終問題的最優解。
貪心演算法與動態規劃的不同在於它每對每個子問題的解決方案都做出選擇,不能回退。動態規劃則會保存以前的運算結果,並根據以前的結果對當前進行選擇,有回退功能。
貪心法可以解決一些最優性問題,如:求圖中的最小生成樹、求哈夫曼編碼……對於其他問題,貪心法一般不能得到我們所要求的答案。一旦一個問題可以通過貪心法來解決,那麼貪心法一般是解決這個問題的最好辦法。由於貪心法的高效性以及其所求得的答案比較接近最優結果,貪心法也可以用作輔助演算法或者直接解決一些要求結果不特別精確的問題。
貪心法解題特點
貪心法有一個共同的點就是在最優求解的過程中都採用一種局部最優策略,把問題范圍和規模縮小最後把每一步的結果合並起來得到一個全局最優解。
貪心法解題的一般步驟
(1)從問題的某個初始解出發;
(2)採用循環語句,當可以向求解目標前進一部時,就根據局部最優策略,得到一個部分解,縮小問題的范圍和規模;
(3)將所有部分解綜合起來,得到問題最終解。
⑧ 哈夫曼編碼/解碼器的實現用C++面向對象,用CLASS封裝(不要C語言,用順序表存儲)
參考這個:
http://..com/link?url=qfz0NyWy_cNy2__AMhFOxD9_mslghqVqd-uVzp53fpjdD2yCgpQRl9a
大約這些功能:
void prin(){ //終端輸出選擇菜單
cout<<"----------------------------------------------------\n\n"
<<" ∣ I---創建哈夫曼樹 ∣\n"
<<" ∣ ∣\n"
<<" ∣ E---文件編碼 ∣\n"
<<" ∣ ∣\n"
<<" ∣ D---文件解碼 ∣\n"
<<" ∣ ∣\n"
<<" ∣ P---列印代碼文件 ∣\n"
<<" ∣ ∣\n"
<<" ∣ T---印哈夫曼樹 ∣\n"
<<" ∣ ∣\n"
<<" ∣ O---哈夫曼樹的存儲結構 ∣\n"
<<" ∣ ∣\n"
<<" ∣ Q---退出 ∣\n"
<<"\n-----------------------------------------------------\n\n";
printf("選擇菜單功能選項:");
⑨ 請教一些C++(演算法與數據結構)的題目
一 就是斐波那契數列 用遞歸
二 是貪心演算法,先把隊列中每個當做一棵樹,每次選擇權值最小的兩棵樹組成一新樹加進隊列,重復上述過程至到只有一個樹,即為所求赫夫曼樹