信息論實驗-唯一可譯碼判決準則

此文大部分內容借鑑網上文章,我只是按照自己的思路整合了一遍。

實驗目的

熟悉唯一可譯碼判決準則。
掌握C語言字符串處理程序的設計和調試技術

實驗要求

已知:信源符號個數r、碼字集合C。
輸入:任意的一個碼。碼字個數和每個具體的碼字在運行時從鍵盤輸入
輸出:判決(是唯一可譯碼/不是唯一可譯碼)。

實驗原理

A.A.Sardinas和G.W.Patterson於1957年提出了一種用於判斷碼C的唯一可譯性。算法原理如下:
原理分析圖
其中 和 都是碼字。可知,當且僅當某個有限長的碼符號序列能譯成不同的碼字序列時,此碼不是唯一可譯碼,此時 一定是 的前綴,而 的尾隨後綴一定是另一個碼字 的前綴;而 的尾隨後綴優勢其他他碼字的前綴。最後,嗎符號序列的尾部一定是一個碼字。設C爲碼字集合,按以下步驟構造此碼的尾隨後綴集合
(1)考察C中所有的碼字,若WiWj 的前綴,則將相應的後綴作爲尾隨後綴碼放入集合 F0 中;
(2)考察C和 Fi 兩個集合,若WiCWiFi 的前綴或 WiFiWjC 的前綴,則將相應的後綴作爲尾隨後綴碼放入集合 Fi+1 中;
(3) F=Fi 即爲碼C的尾隨後綴集合;
(4)若 中出現了C中的元素,則算法中值,返回C不是唯一可譯碼。否則若F中沒有出現新的元素,則C是唯一可譯碼。

算法實現

主要的工作是構造C和F這兩個集合,其中集合C是待判決的碼字集合,通過輸入獲得,集合F是尾隨碼集合,集合F的構造過程就是整個算法實現的核心。用構造的鏈表來存儲集合F。
鏈表基本數據類型

struct strings
{
    char *string;
    struct strings *next;
};

程序的核心函數
1 .void houzhui(char *CP, char *tempPtr)
2. int comparing(strings *st_string, char *code)
用來判斷兩個碼字是否一個是另一個的前綴,如果是則生成後綴碼
3. void outputstr(strings *str)
用來輸出字符串。
完整代碼見Gitub倉庫
源代碼倉庫

運行測試

首先輸入一組爲唯一可譯的碼,各個碼字分別爲1222 1345 2222 4567共四個碼字
是唯一可譯碼
下面看一下當碼字不是唯一可譯的情況,同樣輸入四個不同的碼字,分別是1234 123 111 1 。但是碼字不是異字頭碼,即有的碼字是其他碼字的頭部。
不是唯一可譯碼
程序運行結果顯示該碼不是唯一可譯碼,該測試程序有效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章