資料結構 判定編碼方案是否為字首編碼

2021-10-05 01:47:33 字數 1194 閱讀 1436

字首編碼定義:

(字符集中)任一編碼都不是其它字元的編碼的字首

(字符集中)任一編碼都不是其它字元的編碼的字首

(字符集中)任一編碼都不是其它字元的編碼的字首

重要的話說三遍!

例:(1)找出下面不是字首編碼的選項ab

cd第一步:看a中的第乙個數1,看看其他數有沒有1開頭的。沒有。

第二步:看a中的第二個數01,看看其他數有沒有01開頭的。沒有。

第三步:看看a中的第三個數000,看看其他數有沒有000開頭的。沒有。

第四步:看看a中的第四個數001,看看其他數有沒有001開頭的。沒有。

所以a是字首編碼。

其他選項也一樣。b、c也一樣。來說說d:

第一步,看d中的第乙個數,找有0開頭的的數,有,是00;其實到這裡已經不用看了,因為d已經不是字首編碼了。但第二個數1,是第四個數11的字首,所以也能作為d不是字首編碼的理由。

(2)5 個字元有如下 4 種編碼方案,不是字首編碼的是:

a.01,0000,0001,001,1

b.011,000,001,010,1

c.000,001,010,011,100

d.000,00,01,011,10

對於a選項

第一步:看a中的第乙個數01,找有沒有其他數是01開頭的,沒有。

第二步:看a中的第二個樹0000,找有沒有其他數是0000開頭的,很顯然沒有

…略,反正就是每個數都要和其他3個數比較,看看有沒有是它開頭的。

對於d選項

第一步:看d的000,沒有000開頭的,好,繼續看00。

第二步:看d的00,找00開頭的數,有,是000,所以d不是字首編碼。同理01是011的字首,所以也可以成為d不是字首編碼的原因。

既然寫了就說完去吧,這樣搞的原因是:

比如有以下編碼串,01101001011用(2)中的a表示,那就是:

01-1-01-001-01-1

如果交由d表示:011-01-00-10-1或者01-10-10-01-011。

很顯然,d有兩種表示方法。

但如果d中000表示a,00表示b,01表示c,011表示d,10表示e,那d中的兩種表示方法,會使資訊產生歧義!如果這是以前的通訊編碼,用d型別的編碼編譯或解譯,會產生嚴重的歧義。

資料結構 判定字串是否按照出棧順序

中所引用標頭檔案源自之前的一篇的完成順序棧與鏈式棧部落格。題目解析如下 本想用 0 來判定ouput陣列是否到達末尾,可是不能得到正確結果 暫用 0 插入output陣列尾端代替判定條件 if output 0 return 1 else return 0 int main int ret stac...

判斷棧是否為空 資料結構與演算法 棧

棧 stack 有些地方稱為堆疊,是一種容器,可存入資料元素 訪問元素 刪除元素,它的特點在於只能允許在容器的一端 稱為棧頂端指標,英語 top 進行加入資料 英語 push 和輸出資料 英語 pop 的運算。沒有了位置概念,保證任何時候可以訪問 刪除的元素都是此前最後存入的那個元素,確定了一種預設...

鍊錶節點是否為空 C C 資料結構 鍊錶

鍊錶 linked list 是一種基礎資料結構,是一種線性表,在每乙個節點裡存到下乙個節點的指標 pointer 即每乙個節點都儲存著指向下乙個節點的資訊。1 初始化乙個空鍊錶。2 在鍊錶末端新增乙個新節點。3 統計鍊錶的節點數。4 在鍊錶指定位置插入。5 刪除指定節點。6 清空鍊錶 list.h...