【正文】
列表初始化獲得哈夫曼碼字分別遍歷左右分支節(jié)結(jié)束將最后兩個出現(xiàn)概率最小的消息合成一個消息將消息添加到隊列的最后為n1消息重新進行排列做準(zhǔn)備遍歷至原始消息,即葉子節(jié)點,輸出讀碼字開始四、實驗要求1. 輸入:信源符號個數(shù)r、信源的概率分布P;2. 輸出:每個信源符號對應(yīng)的Huffman編碼的碼字。五、實驗報告要求總結(jié)Huffman編碼的基本原理及其特點?function [h,l]=huffman(p) p=[ ]if (length(find(p0))~=0) error(39。Not a prob,negative ponent39。)。 end if (abs(sum(p)1)10e10) error(39。Not a ,ponent do not add to 139。) end n=length(p)。for i=1:n1 for j=i:n if p(i)=p(j) q=p(i)。p(i)=p(j)。p(j)=q。 end endenddisp(39。184。197。194。202。214。178。188。39。),pq=p。 m=zeros(n1,n)。 for i=1:n1 [q,l]=sort(q)。 m(i,:)=[l(1:ni+1),zeros(1,i1)]。 q=[q(1)+q(2),q(3:n),1]。 end for i=1:n1 c(i,:)=blanks(n*n)。 end c(n1,n)=39。039。 c(n1,2*n)=39。139。 for i=2:n1 c(ni,1:n1)=c(ni+1,n*(find(m(ni+1,:)==1))... (n2):n*(find(m(ni+1,:)==1)))。 c(ni,n)=39。039。 c(ni,n+1:2*n1)=c(ni,1:n1)。 c(ni,2*n)=39。139。 for j=1:i1 c(ni,(j+1)*n+1:(j+2)*n)=c(ni+1,n*(find(m(ni+1,:)==j+1)1)+1:n*find(m(ni+1,:)==j+1))。 end end for i=1:n h(i,1:n)=c(1,n*(find(m(1,:)==i)1)+1:find(m(1,:)==i)*n)。 ll(i)=length(find(abs(h(i,:))~=32))。 end l=sum(p.*ll)。p = 概率分布p = ans = 01 00 111 110 101 1001 1000實驗總結(jié):原理:哈夫曼的編碼方法是一種統(tǒng)計編碼,屬于無損壓縮編碼。保證了概率大的符號對應(yīng)于短碼,概率小的符號對應(yīng)于長碼,充分應(yīng)用了短碼,從而實現(xiàn)了對信源的壓縮,這樣處理全部信息的總碼長一定小于實際信息的符號長度;用碼樹來分配各符號的碼字,先給每一符號一片樹葉,逐步合并成節(jié)點直到樹根。構(gòu)造最優(yōu)二叉樹就是其原理??s減信源的最后兩個碼字總是最后一位不同,從而保證了哈夫曼編碼是即時碼;特點:(1) 哈夫曼編碼并非是唯一的。1. 每次對信源縮減時候,賦予信源最后兩個概率最小的符號,用0和1是可以任意的,但是不會影響碼字的長度。由于其平均碼長是一樣的,故不影響編碼效率與數(shù)據(jù)壓縮性能。2. 對信源進行縮減時,兩個概率最小的符號合并后的概率與其他信源符號的概率相同時候,進行排序,其位置次序是可以任意的,所以會得到不同的哈夫曼碼。此時將影響碼字的長度,一般將合并的概率放在上面,這樣獲得較小的碼方差。(2) 為了得到方差最小的碼,應(yīng)使合并的符號位于縮減信源序列盡可能高的位置上,以減少再次合并的次數(shù),充分利用短碼。(3) Huffman編碼結(jié)果不等長,硬件實現(xiàn)困難,另外誤碼傳播嚴(yán)重。所以采用雙字長編碼,即概率高的用短字長,概率低的用長字長。(4) 一般情況下,huffman編碼的效率比其他的編碼方法的高,是最佳變長碼,但是要依靠信源的統(tǒng)計特性。過程:合并排序:756432112345602345100234100023100002100000編碼:100010011011101110001100101110111000111011100011000011011101100127