資源描述:
《Huffman源程序》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、對文本文檔的Huffman編碼解碼,附詳細程序Shannon.txt是要求編碼的文檔首先,是要在commandwindow里面鍵入“fid=fopen('Shannon.txt','r');回車data=fread(fid);回車data”這是將文檔讀入,并且以ASCII碼的形式顯示出來。第一步,運行“統(tǒng)計1”文件,用來統(tǒng)計文檔中各個字符出現(xiàn)的個數(shù)第二步,運行“數(shù)量2”文件,用來計算字符的總個數(shù),總共是70個。第三步,運行“求和3”文件,用來統(tǒng)計文本里面所有字符出現(xiàn)的次數(shù),并且計算每個字符出現(xiàn)的概率。第四步
2、,運行“順序排列4”文件,將每個字符出現(xiàn)的概率進行從大到小的順序排序,然后將其放到M矩陣的第一行。第五步,運行“計算5”文件,用來進行huffman編碼的計算,具體算法如下:該矩陣定義為M矩陣,M矩陣的第一行,存放的是需要編碼的各個字符出現(xiàn)的概率,并且按照從大到小排列順序,然后再將第一行最后兩個數(shù)相加(即概率最小的兩個數(shù)相加),把相加得到的結(jié)果放到第二行,然后再將第二行重新進行排序,依此類推,一直到第69行,這時第69行只有兩個概率,并且相加肯定為1.第六步,運行“編碼6”文件,用來對M矩陣的數(shù)值進行huf
3、fman編碼,具體編碼過程如下:首先建立N矩陣,用來存放編碼的碼字,N=69*(70*70),總共69行,4990列,因為每一個碼字的編碼長度不會超過70,把4990列看成70個小段,每個小段可以存放70個字符。然后將字符0,賦給最后一行的第一小段,再將字符1,賦給最有一行的第二小段,在M矩陣中,由于每一行的最后兩個數(shù),都是這一行中概率最小的兩個數(shù),所以將倒數(shù)第二行的最后兩個數(shù)進行相加,然后用相加的結(jié)果到倒數(shù)第一行中去尋找,肯定會在倒數(shù)第一行中找到一樣的值,然后記錄下來在倒數(shù)第一行中這個值的位置,再將這個在
4、M矩陣中的位置對應(yīng)到N矩陣中,將N矩陣中的該位置的字符賦給倒數(shù)第二行的第二小段和第三小段,最后在給第二小段的后面賦字符0,給第三小段后面賦字符1,然后將在最后一行找到的那個數(shù)的左邊的數(shù),一一對應(yīng)到上一行去,右邊的數(shù),向左串一位,再對應(yīng)到上一行去,這樣依此類推,那么在N矩陣的第一行,可以得到最后的編碼。第七部,運行“首行編碼7”,輸出第一行的所有編碼,即為對應(yīng)字符的huffman編碼。clc;clearall;%將文檔讀入,并且以ASCII碼的形式顯示出來fid=fopen('Shannon.txt','r'
5、);data=fread(fid);data%統(tǒng)計文檔中各個字符出現(xiàn)的個數(shù)i=1;a=0;M=0:1:113;forii=10:122a=0;i=1;whilei<4991ifdata(i,1)==iia=a+1;endi=i+1;endj=ii-9;M(1,j)=a;fprintf('M=%d,',M(1,j));end%計算字符的總個數(shù),總共是70個i=1;j=1;N=0:1:100;whilei<114ifM(1,i)~=0N(1,j)=M(1,i);fprintf('N=%d',N(1,j));j=
6、j+1;endi=i+1;endfprintf('');fprintf('num=%d',j-1);%統(tǒng)計文本里面所有字符出現(xiàn)的次數(shù),并且計算每個字符出現(xiàn)的概率i=1;j=1;n=1;sum1=0;p=1:1:70;whilei<71sum1=sum1+N(1,j);p(1,i)=(N(1,j)/4990);n=n+1;fprintf('p=%f',p(1,i));i=i+1;j=j+1;endfprintf('');fprintf('sum1=%d',sum1);%將每個字符出現(xiàn)的概率進行從大
7、到小的順序排序,然后將其放到M矩陣的第一行i=1;j=2;whilei<71j=i+1;whilej<71ifp(1,i)
8、+M(i,j);n=1;while(n<(j-1))M(i+1,n)=M(i,n);n=n+1;endfork=1:68s=k+1;while(s<=(j-1))ifM(i+1,k)