信息論實(shí)驗(yàn)(共11頁(yè))_第1頁(yè)
信息論實(shí)驗(yàn)(共11頁(yè))_第2頁(yè)
信息論實(shí)驗(yàn)(共11頁(yè))_第3頁(yè)
信息論實(shí)驗(yàn)(共11頁(yè))_第4頁(yè)
信息論實(shí)驗(yàn)(共11頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、信息論與編碼(bin m)實(shí)驗(yàn)實(shí)驗(yàn)(shyn)一 唯一可譯碼判別(pnbi)準(zhǔn)則1.實(shí)驗(yàn)?zāi)康模?)進(jìn)一步熟悉唯一可譯碼判決準(zhǔn)則;(2)掌握C語(yǔ)言字符串處理程序的設(shè)計(jì)和調(diào)試技術(shù)。2.實(shí)驗(yàn)要求 (1)已知:信源符號(hào)個(gè)數(shù)q、碼字集合C;(2)輸入:任意的一個(gè)碼,碼字個(gè)數(shù)和每個(gè)碼字在運(yùn)行時(shí)從鍵盤輸入;(3)輸出:判決(是唯一可譯碼/不是唯一可譯碼)。3.實(shí)驗(yàn)原理 其中Ai和Bi都是碼字??芍?,當(dāng)且僅當(dāng)某個(gè)有限長(zhǎng)的碼符號(hào)序列能被譯碼成兩種不同的碼字序列時(shí),此碼不是唯一可譯碼,此時(shí)B1一定是A1的前綴,而A1的尾隨后最一定是另一碼字B2的前綴;而B2的尾隨后綴又是其他碼字的后綴。最后,碼符號(hào)序列的尾部一定

2、是一個(gè)碼字。設(shè)C是碼字集合(jh),尾隨后綴集合F: (1)考察(koch)C中所有(suyu)的碼字,若Wi是Wj的前綴,則將相應(yīng)的后綴作為一個(gè)尾隨后綴碼放入集合F1中;(2)考察C和Fi兩個(gè)集合,若WiC是WjFi的前綴或者WiFi是WjC的前綴,則將相應(yīng)的后綴作為尾隨后綴碼放入集合Fi+1中;(3)F=iFi即為碼C的尾隨后綴集合;(4)若F中出現(xiàn)C中的元素,則算法終止,返回假(C不是唯一可譯碼);否則若F中沒有出現(xiàn)新的元素,則返回真。4.實(shí)驗(yàn)環(huán)境軟件:DevC+ 編程語(yǔ)言:C語(yǔ)言5.實(shí)驗(yàn)程序 #include#include#define num 20#define row 20 ch

3、ar cnumrow;char fnumrow;int N,sum=0; int flag; void weiyima(char c,char d) /檢測(cè)尾隨后綴 int i,j,k; for(i=0;i+) if(ci=0&di=0)/2字符串一樣,跳出 break; if(ci=0) /d比c長(zhǎng),將d的尾隨后綴放入f中 for(j=i;dj!=0;j+) fsumj-i=dj; fsumj-i=0; for(k=0;ksum;k+) if(strcmp(fsum,fk)=0) /*查看當(dāng)前生成的尾隨后綴在f集合中是否存在*/ sum-;break; sum+; break; if(di=

4、0) /c比d長(zhǎng),將c的尾隨后綴放入f中 for(j=i;cj!=0;j+) fsumj-i=cj; fsumj-i=0; for(k=0;ksum;k+) if(strcmp(fsum,fk)=0) /*查看當(dāng)前(dngqin)生成的尾隨后綴在f集合中是否(sh fu)存在*/ sum-;break; sum+; break; if(ci!=di)/字符不一樣(yyng)了也退出 break; /*主函數(shù)*/main()char loop;loop = y;while(loop=y) int i,j,init; flag = 0; printf(請(qǐng)輸入碼字的個(gè)數(shù):n);/輸入碼得個(gè)數(shù) sca

5、nf(%d,&N); for(init=0;initN;init+) finitinit= ; printf(請(qǐng)分別輸入碼字(每個(gè)碼字長(zhǎng)度小于50個(gè)字符):n); for(i=0;iN;i+) scanf(%s,&ci); for(i=0;iN-1;i+)/判斷如果碼本身是否重復(fù) for(j=i+1;jN;j+) if(strcmp(ci,cj)=0) flag=1;break; if(flag=1)/如果碼本身有重復(fù),就可以斷定它不是唯一可譯碼 printf(這不是唯一可譯碼。n); else for(i=0;iN-1;i+) /*此處是根據(jù)原始編碼生成的尾隨后綴集合s1放入f中*/ for

6、(j=i+1;jN;j+) weiyima(ci,cj); for(i=0;i+) /根據(jù)(gnj)原始碼與si生成(shn chn)si+1也放入fi int s=0; for(j=0;jN;j+) /*判斷(pndun)si+1中的字符串是否與si中一樣 ,重復(fù)的則不再添加*/ if(i=sum) s=1;break; else weiyima(fi,cj); if(s=1)break; for(i=0;isum;i+) /判斷f和c中是否有相同的元素,有則是不唯一的 for(j=0;jN;j+) if(strcmp(fi,cj)=0) flag=1; break; printf(判斷結(jié)果

7、:); if(flag=1) printf(這不是唯一可譯碼。n); else printf(這是唯一可譯碼。n); /loop = getchar(); printf(是否繼續(xù) :); scanf(%s,&loop); 6.實(shí)驗(yàn)結(jié)果實(shí)驗(yàn)結(jié)果(ji gu)分析:(1)3個(gè)碼字0,01,010:不是(b shi)唯一可譯碼 C的后綴(huzhu)集合F: F1=1,10,0 其中F1中的“0”和C中的“0”重復(fù),因此不是唯一可譯碼。 例如:010可以譯碼為010或者01,0(2)3個(gè)碼字1,10,100:是唯一可譯碼 C的后綴集合F: F1=0,00 C的元素不是F1的前綴,F(xiàn)1中的元素也不是C

8、的前綴,F(xiàn)1中沒有與C相同的元素,因此該碼字是唯一可譯碼。 (3)4個(gè)碼字101,10010,0110,01:不是唯一可譯碼 C的后綴集合F: F1=10; F2=1,010; F3=01,0010 F3中的元素(yun s)在C中有,因此不是(b shi)唯一可譯碼。 如:0110101可被譯碼成01,101,01或者(huzh)0110,1017.實(shí)驗(yàn)體會(huì) 通過這次實(shí)驗(yàn),熟悉了判別是否是唯一可譯碼的方法,學(xué)會(huì)使用C語(yǔ)言進(jìn)行字符串處理程序的設(shè)計(jì)和調(diào)試,并使用輸入循環(huán)。 實(shí)驗(yàn)二 Huffman編碼1.實(shí)驗(yàn)?zāi)康?(1)進(jìn)一步熟悉Huffman編碼過程;(2)掌握C語(yǔ)言遞歸程序的設(shè)計(jì)和調(diào)試技術(shù)。2

9、.實(shí)驗(yàn)要求 (1)輸入:信源符號(hào)個(gè)數(shù)r、信源的概率分布P; (2)輸出:每個(gè)信源符號(hào)對(duì)應(yīng)的Huffman編碼的碼字。3.實(shí)驗(yàn)原理 (1)首先將q個(gè)信源符號(hào)按照概率大小遞減排列p(s1)p(s2)p(sq); (2)用“0”“1”碼符號(hào)分別代表概率最小的兩個(gè)信源符號(hào),并將這兩個(gè)概率最小的信源符號(hào)合并成一個(gè),從而得到只包含q-1個(gè)符號(hào)的新信源,成為縮減信源S1; (3)把縮減信源S1的符號(hào)仍按概率大小遞減次序排列,再將其最后兩個(gè)概率最小的信源符號(hào)分別用“0”和“1”碼符號(hào)表示,并且合并成一個(gè)符號(hào),這樣有行程q-2個(gè)信源符號(hào)的縮減信源S2; (4)依次繼續(xù)下去,直至信源最后只剩下兩個(gè)信源符號(hào)為止,將

10、這最后兩個(gè)信源符號(hào)分別用二元碼符號(hào)“0”和“1”表示; (5)最后(zuhu)從最后一級(jí)縮減信源開始,進(jìn)行回溯,就得到各信源符號(hào)所對(duì)應(yīng)的碼符號(hào)序列,即相應(yīng)的碼字。4.實(shí)驗(yàn)(shyn)環(huán)境軟件(run jin):DevC+ 編程語(yǔ)言:C語(yǔ)言5.實(shí)驗(yàn)程序#include #define maxnum 20#define max_v 10000#define max_le 30#define max_no max_le*2 -1typedef struct int bitmaxnum; int start; HCodeType; /* 編碼結(jié)構(gòu)體 */typedef struct float wei

11、ght; int parent; int lchild; int rchild; HNodeType; /* 結(jié)點(diǎn)結(jié)構(gòu)體 */* 構(gòu)造一顆哈夫曼樹 */void HuffmanTree (HNodeType HuffNodemax_no, int n) int i, j, MinSeq1, MinSeq2; float MinValue1,MinValue2; / 初始化存放哈夫曼樹數(shù)組 HuffNode 中的結(jié)點(diǎn) for (i=0; i2*n-1; i+) HuffNodei.weight = 0; HuffNodei.parent =-1; HuffNodei.lchild =-1; Hu

12、ffNodei.lchild =-1; /* end for */ /* 輸入 n 個(gè)葉子結(jié)點(diǎn)的權(quán)值 */ printf(請(qǐng)輸入碼字的概率:n); for (i=0; in; i+) / printf (輸入葉子節(jié)點(diǎn) %d: n, i); scanf (%f, &HuffNodei.weight); /* end for */ /* 循環(huán)構(gòu)造 Huffman 樹 */ for (i=0; in-1; i+) MinValue1=MinValue2=max_v; /* MinValue1、MinValue2中存放兩個(gè)無父結(jié)點(diǎn)且結(jié)點(diǎn)權(quán)值最小的兩個(gè)結(jié)點(diǎn) */ MinSeq1=MinSeq2=0; /

13、* 找出所有結(jié)點(diǎn)中權(quán)值最小、無父結(jié)點(diǎn)的兩個(gè)(lin )結(jié)點(diǎn),并合并之為一顆二叉樹 */ for (j=0; jn+i; j+) if (HuffNodej.weight MinValue1 & HuffNodej.parent=-1) MinValue2=MinValue1; MinSeq2=MinSeq1; MinValue1=HuffNodej.weight; MinSeq1=j; else if (HuffNodej.weight MinValue2 & HuffNodej.parent=-1) MinValue2=HuffNodej.weight; MinSeq2=j; /* end

14、for */ /* 設(shè)置找到的兩個(gè)(lin )子結(jié)點(diǎn) MinSeq1、MinSeq2 的父結(jié)點(diǎn)(ji din)信息 */ HuffNodeMinSeq1.parent = n+i; HuffNodeMinSeq2.parent = n+i; HuffNoden+i.weight = HuffNodeMinSeq1.weight + HuffNodeMinSeq2.weight; HuffNoden+i.lchild = MinSeq1; HuffNoden+i.rchild = MinSeq2; / printf (n); /* end for */ /* end HuffmanTree */

15、main(void)char loop;loop = y;while(loop=y) HNodeType HuffNodemax_no; /* 定義一個(gè)結(jié)點(diǎn)結(jié)構(gòu)體數(shù)組 */ HCodeType HuffCodemax_le, cd; /* 定義一個(gè)編碼結(jié)構(gòu)體數(shù)組, 同時(shí)定義一個(gè)臨時(shí)變量來存放求解編碼時(shí)的信息 */ int i, j, c, p, n; printf (請(qǐng)輸入碼字個(gè)數(shù) n:n); scanf (%d, &n); HuffmanTree (HuffNode, n); for (i=0; i n; i+) cd.start = n-1; c = i; p = HuffNodec.pa

16、rent; while (p != -1) /* 父結(jié)點(diǎn)存在 */ if (HuffNodep.lchild = c) cd.bitcd.start = 1; else cd.bitcd.start = 0; cd.start-; /* 求編碼(bin m)的低一位 */ c=p; p=HuffNodec.parent; /* 設(shè)置下一循環(huán)(xnhun)條件 */ /* end while */ /* 保存求出的每個(gè)葉結(jié)點(diǎn)的哈夫曼編碼(bin m)和編碼的起始位 */ for (j=cd.start+1; jn; j+) HuffCodei.bitj = cd.bitj; HuffCodei.

17、start = cd.start; /* end for */ printf(霍夫曼編碼為:n); /* 輸出已保存好的所有存在編碼的哈夫曼編碼 */ for (i=0; in; i+) printf(%.2f : ,HuffNodei.weight); / printf (%d s Huffman code is: , i); for (j=HuffCodei.start+1; j n; j+) printf (%d, HuffCodei.bitj); printf (n); / getchar(); / return 0; printf(是否繼續(xù)?:); scanf(%s,&loop);

18、6.實(shí)驗(yàn)結(jié)果0實(shí)驗(yàn)(shyn)結(jié)果分析010.20 0.20 0.26 0.35 0.39 0.61 10010.19 0.19 0.20 0.26 0.35 0.390110.18 0.18 0.19 0.20 0.2610.17 0.17 0.18 0.1900.15 0.15 0.1710.10 0.110.01則各碼字的Huffman編碼(bin m):0.20 : 100.19 : 110.18 : 0000.17 : 0010.15 : 0100.10 : 01100.01 : 01110第二個(gè)碼字概率(gil)0010.20 0.40 0.40 0.60 1 0110.20 0.20 0.4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論