資源描述:
《實驗二霍夫曼編碼》由會員上傳分享,免費在線閱讀,更多相關內容在工程資料-天天文庫。
1、實驗報(2015—2016學年第1學期)課程名稱:信息論與編碼基礎姓名:陳明明學院:工學院專業(yè):計算機年級:2014級學號:21440222512016年5月160第7?8節(jié)綜合樓z525號室進入實驗室時間進入時儀器設備狀況離開實驗室時間離開時儀器設備狀況機器號14:55正常16:30正常46實驗項目名稱霍夫曼編碼一、實驗目的1.進一步深入理解Huffman編碼算法的原理;2.提高獨立進行算法編程的能力。二、實驗內容1.用Matlab實現二進制Huffman編碼算法程序;2.要求程序輸出顯示所有的碼字以及編碼效率;3.設計簡單的輸入界面(可以是簡單的文字提示信息),程序
2、運行時提示用戶輸入代表信源符號概率的向量;要對用戶輸入的概率向量進行合法性檢查。【二進制Huffman編碼程序實現】(1)程序的輸入:以一維數組的形式輸入要進行huffnimi編碼的信源符號的概率,在運行該程序前,顯示文字提示信息,提示所要輸入的概率矢量;然后對輸入的概率矢量進行合法性判斷,原則為:如果概率矢量中存在小于0的項,則輸入不合法,提示重新輸入;如果概率矢量的求和大于1,則輸入也不合法,提示重新輸入。(2)huffman編碼具體實現原理:1)在輸入的概率矩陣P正確的前提條件下,對P進行排序,并用矩陣L記錄p排序之前各元素的順序,然后將排序后的概率數組P的前兩項
3、,即概率最小的兩個數加和,得到新的一組概率序列,重復以上過程,最后得到一個記錄概率加和過程的矩陣p以及每次排序Z前概率順序的矩陣a。2)新生成一個n-1n列,并且每個元索含冇n個字符的空白矩陣,然后進行huffnrnn編碼:將c矩陣的第n-l行的笫一和笫二個元素分別令為0和1(表示在編碼時,根節(jié)點之下的概率較小的元素后補0,概率較大的元素后補1,后面的編碼都遵守這個原則)然后對n-i-l的第一、二個元素進行編碼,首先在矩陣a中第n-i行找到值為1所在的位置,然后在c矩陣中第n-i行中找到對應位置的編碼(該編碼即為第n-i-l行第一、二個元素的根節(jié)點),則矩陣c的第n-i
4、行的第一、二個元素的n-l的字符為以上求得的編碼值,根據之前的規(guī)則,第一個元素最后補0,第二個元素最后補1,則完成該行的第一二個元素的編碼,最后將該行的其他元素按照“矩陣c中第n-i行第j+1列的值等于對應于a矩陣中第n-i+l行中值為j+1的前面一個元素的位置在c矩陣中的編碼值”的原則進行賦值,重復以上過程即可完成huffman編碼。三、實驗過程及結果(包括源程序和計算步驟)p=input('請輸入概率矢量:’);n二length(p);fori=l:nifp(i)<0fprintfC概率矢量中存在小于0的項,輸入不合法,請重新輸入W);p二input('請輸入概
5、率矢量:’);endendifabs(sum(p)-l)>0fprintfC概率矢量的求和大于1,輸入不合法,請重新輸入!『);p二input('請輸入概率矢量:’);endq二P;a=zeros(nT,n);fori=l:n-1[q,1]二sort(q)a(i,:)二[1(1:n-i+1),zeros(1,i-1)]q二[q(l)+q(2),q(3:n),1];endfori=l:n~lc(i,1:n*n)二blanks(n*n);endc(n~l,n)二'O';c(n-1,2*n)」r;fori=2:n~lc(n~i,1:n-l)=c(n~i+l,n*(fin
6、d(a(n~i+l,:)==l))-(n-2):n*(find(a(n~i+l,:)==1)))c(n-i,n)二'O'c(n-i,n+1:2*nT)=c(n-i,1:nT)c(n-i,2*n)二'1'forj=l:i~lc(n-i,(j+l)*n+l:(j+2)*n)=c(n-i+l,n*(find(a(n-i+1,:)二二j+l)T)+l:n*find(a(n-i+l,:)==j+l))endendfori=l:nh(i,l:n)=c(l,n*(find(a(l,:)==i)-l)+l:find(a(l,:)二二i)*n)11(i)=length(find(abs(
7、h(i,:))~二32))endl=sum(p.*11);fprintf('霍夫曼編碼:');hhh=sum(p.*(~log2(p)));fprintf('霍夫曼編碼效率:);t=hh/l青輸入槪率矢里:[0.350.250.150.120.080.05]ii=10.05000.08000.12000.15000.25000.3500L=65432??1a=65432?100000000000000000000000001100111010001011010011001011000110111011001h=111000