230 likes | 450 Views
具抑制錯誤蔓延功能的 LZW 碼. 授課老師:王立洋 老師 製作學生: M9535204 蔡鐘葳. Outline. ▓ K-error Protocol. ▓ LZW without K-error Protocol. ▓ LZW with K-error Protocol. ▓ Conclusion. ▓ Reference. K-error Protocol ( 1/5 ).
E N D
具抑制錯誤蔓延功能的LZW碼 授課老師:王立洋 老師製作學生:M9535204蔡鐘葳
Outline ▓ K-error Protocol ▓ LZW without K-error Protocol ▓ LZW with K-error Protocol ▓ Conclusion ▓ Reference
K-error Protocol(1/5) 具抑制錯誤蔓延能力的 LZW 碼法是由 J. A. Storer 及 J. H. Reif 於西元 1997 年所發表,他們將這套演算法稱為 K-error Protocol。 以原來的 LZW 演算法所製造出來的資料串流只要有發生錯誤,這個錯誤將導致後來的資料串流在解碼器端造成如滾雪球般的效應而全數解錯。 在以往的解法,若要防止這樣的情形,通常是在編碼器所製造出來的資料串流中加上錯誤修正碼。而 K-error Protocol 演算法的出發點在於能夠取代原來使用錯誤修正碼的方式,改以比較簡單的實作、比較快的速度但是並不需要去修正發生的錯誤,就能防止因為那個錯誤而使得參考到這個錯誤的後來的字碼被解碼錯誤。
K-error Protocol(2/5) 這個演算法能夠保證資料串流在 k(k≧0)個錯誤以內,都不會讓錯誤擴散。亦即資料串流若錯了 k 個,那在解碼的時候,只有 k 個索引值所對應的字串和來源資料不同。 要做到這一點,作者提出了兩個在實作上必要的想法: 第一是雜湊表(hashing),用來計算將放進字典中一筆新的記錄(entry)該放到那個桶子(bucket)去。雜湊的作用是要把原本存在於每筆記錄的資料順序的相關性去除。在 LZW 演算法中,一筆新的記錄和原本已建立在字典的記錄是相關聯的。而 LZW演算法的字典記錄的索引值又是漸加式的,我們在解碼端觀察:若原本該建立在某個位置的記錄因發生了錯誤沒有加進字典,或者某個不該建立於字典的加入了字典,都有可能使得後來的解碼產生大混亂。如果使用雜湊,就可以把這種位址間的資料相依性消除。
K-error Protocol(3/5) 第二是點數(count)。點數是因為使用了雜湊會發生在同一個位址中,有兩項以上的記錄的可能,然而只有一個記錄它所擁有的點數足夠大於(warms up)其他記錄的點數。每一筆記錄每增加 1 點的點數,表示這筆記錄所對應的成雙指標(pointer pair)已被建於字典當中,而且編、解碼器端都正要編、解碼這筆記錄所對應的成雙指標。 為了證明資料串流發生了錯誤之後,錯誤那筆記錄經過雜湊與某個正確的記錄在同一個位址,但是正確的那筆記錄的點數必然大於錯誤的記錄,作者提出了一個 Lag theorem。在這個理論當中,我們先對一些名詞做些解釋。
K-error Protocol(4/5) 1、成雙指標: 在 LZ 系列的演算法中,單單一個指標(索引值)從編解碼器在更新字典時的角度來看,代表這個指標所代表字串已在字典中,而更新字典需由一付成雙指標來構成。成雙指標除了可以是由兩個指標構成之外,也可以是一個指標和一個字元所構成。以LZW 解碼器端來說,當它在編造字典時,一個新的字串被加入字典是由一付成雙指標所構成(目前所收到指標所代表的字串和下一個指標的第一個字元)。 2、Lag(S): S 在這邊代表著編碼器所送出的指標序列。當解碼器端所收到的指標序列有錯誤發生,在更新字典時,將會發生下面Ⅰ和Ⅱ的情形:Ⅰ、因錯誤而增加了原本不應該增加在字典的記錄,Ⅱ、也因為錯誤而減少了原本該加進字典的記錄。將Ⅰ和Ⅱ這些遺失、多出的記錄個數總和定義為 Lag(S) 。
K-error Protocol(5/5) 3、|D|: |D|代表目前在字典 D 中記錄的數目, |Dmax| 是字典 D 最大能有幾筆記錄, Bits( i ) 用來表示索引值 i 所需之位元數。 首先在編解碼器兩端對各個雜湊記錄( hash entry )的點數先初使化成零,點數在編解碼器送出或收到指標時,必須增加一付成雙指標所對應之雜湊記錄的10點數。若在整個指標序列中,最多有 k 個錯誤( k 為任意整數),那麼足夠大的數( warming value: w(k) )為大於等於 Lag(S) 的最小整數。
Example for LZW without K-error Protocol (Encoding) Example: 用LZW without K-error Protocol對 AAAAAABABAAAB 這段字串編碼。 編碼器:輸入 AAAAAABABAAAB,輸出 13421632。 如下圖:
Example for LZW without K-error Protocol (Decoding) 如果解碼時發生資料錯誤,則會產生一連串錯誤。 解碼器:輸入資料第三個字元發生錯誤成為 13221632 時, 則輸出為 AAABBABAAAB。 如下圖:
LZW with K-error Protocol(Encoding)(1/4) 由上例可知,當解碼時的輸入錯誤時,輸出則會產生一連串錯誤。而用 K-error Protocol 修正則可以避免產生此類型錯誤。 以下為編碼演算法步驟: 步驟0:將 A 及 B 字元存入字典裡,也就是 A 及 B 字元爾後 分別會被編碼成索引值 1 及 2 。 步驟1:從目前字典內容及未被編碼之序列 AAAAAABABAAAB ,得到 S = A,length = 1, C = A,所以輸出 A 在字典裡的索引值 1,並將新的 字串AA 存入字典裡,其索引值等於 3,雜湊值 1, count(AA) = 0。
LZW with K-error Protocol(Encoding)(2/4) 步驟2:從目前字典內容及未被編碼之序列 AAAAABABAAAB ,因count(AA) = 0 ≦ count(other) + w(k) ,得到 S = A,length = 1,C = A,所以輸出 A 在字典裡的索引值 1 ,字串 AA 已在字典, count(AA) = 1 。 步驟3:序列為 AAAABABAAAB,因 count(AA) = 1 ≦ count(other) + w(k),得到 S = A,length = 1,C = A, 所以輸出 A 在字典裡的索引值 1,字串 AA 已在字 典,count(AA) = 2。 步驟4:序列為 AAABABAAAB,如同步驟2、3, count(AA) = 3。 步驟5:序列為 AABABAAAB,如同步驟2、3, count(AA) = 4。
LZW with K-error Protocol(Encoding)(3/4) 步驟6:序列為 ABABAAAB,得到 S = A,length = 1, C = B,所以輸出 A 在字典裡的索引值 1,並將新的 字串 AB 存入字典裡,其索引值等於 3,雜湊值 2, count(AB) = 0。 步驟7:序列為 BABAAAB,得到 S = B,length = 1, C = A,所以輸出 B 在字典裡的索引值 2,並將新的 字串 BA 存入字典裡,其索引值等於 4,雜湊值 1, count(BA) = 0。 步驟8:序列為 ABAAAB,因 count(AB) = 0 ≦ count(AA) + w(k),得到 S = A,length = 1,C = B,所以輸出 A 在 字典裡的索引值 1,字串 AB 已在字典, count(AB) = 1。
LZW with K-error Protocol(Encoding)(4/4) 步驟9:序列為 BAAAB,因 count(BA) = 0 ≦ count(other) + w(k),得到 S = B,length = 1,C = A,所以輸出 B 在 字典裡的索引值 2,字串 BA 已在字典, count(BA) = 1。 步驟10:序列為 AAAB,因 count(AA) = 4 ≦ count(AB)=1 + w(k),得到 S = A,length = 1,C = A,所以輸出 A 在字典裡的索引值 1,字串 AA 已在字典, count(AA) = 5。 步驟11:序列為 AAB,因 count(AA) = 5 > count(AB)=1 + w(k),count(AA) = 6,得到 S = AA,length = 2, C = B,所以輸出AA 在字典裡的索引值 3 ,字串 AAB 加入字典,其索引值 6 ,雜湊值 1。 count(AAB) = 0。 步驟12:序列為 B ,得到 S = B , length = 1 ,輸出 2 。
Example forLZW with K-error Protocol(Encoding) Example: 用LZW with K-error Protocol 對 AAAAAABABAAAB 這段字串編碼。 編碼器:輸入 AAAAAABABAAAB,輸出 111111212132。 如下圖:
Example forLZW with K-error Protocol(Decoding) 設解碼輸入的第三字元為錯誤 (1變為2),原本的成雙指標 ( 1, 1 ) 的點數於步驟 3 及步驟 4 都應增加 1 點,但是因為這個錯誤而使得該增加的點數未增加,反倒是 ( 1, 2 ) 及 ( 2, 1 ) 這兩付成雙指標原不該加的點數各增加 1 點;又因為 ( 1, 1 ) 及 ( 1, 2 ) 這兩付成雙指標都在同一個桶子中,於是 ( 1, 2 ) 的不該加而加的點數造成了解碼器在步驟 11 找不到該被正確解碼的成雙指標。詳細步驟則如下所示:
Example forLZW with K-error Protocol(Decoding) 步驟0:將 A 及 B 字元存入字典裡,也就是 A 及 B 字元爾後 分別會被編碼成索引值 1 及 2。 步驟1:收到 1,根據目前字典內容,將解碼出 A。 步驟2:收到 1,根據目前字典內容,解碼出 A。此時 S1 = A,S2 = A,所以將新的字串 AA 存入字典,其 索引值等於 3,雜湊值 1,count(AA) = 0。 步驟3:收到 2,解碼出 B。此時 S1 = A,S2 = B,將新的字 串 AB 存入字典,其索引值等於 3,雜湊值 2, count(AB) = 0。 步驟4:收到 1,解碼出 A。此時 S1 = B,S2 = A,將新的字 串 BA 存入字典,其索引值等於 4,雜湊值 1, count(BA) = 0。
Example forLZW with K-error Protocol(Decoding) 步驟5:收到 1,解碼出 A。此時 S1 = A,S2 = A,AA 已在 字典中,故 count(AA) = 1。 步驟6:收到 1,解碼出 A。此時 S1 = A,S2 = A,AA 已在 字典中,故 count(AA) = 2。 步驟7:收到 2,解碼出 B。此時 S1 = A,S2 = B,AB 已在字 典中,故 count(AB) = 1。 步驟8:收到 1,解碼出 A。此時 S1 = B,S2 = A,BA 已在字 典中,故 count(BA) = 1。 步驟9:收到 2,解碼出 B。此時 S1 = A,S2 = B,AB 已在字 典中,故 count(AB) = 2。
Example forLZW with K-error Protocol(Decoding) 步驟10:收到 1,解碼出 A。此時 S1 = B,S2 = A,BA 已在 字典中,故 count(BA) = 2。 步驟11:收到 3,因為 count(AB) == count(AA),找不出這個 桶子中的最大值,是故解碼器解釋出一 empty string。 步驟12:收到 2,解碼出 B。 解碼過程如下圖:
Conclusion 由以上範例得知,使用了 K-error Protocol 的 LZW 編解碼法,比起未使用 K-error Protocol 的 LZW 編解碼法,可以有效的抑制錯誤蔓延,對於 LZW 資料串流只要有發生錯誤,這個錯誤將導致後來的資料串流在解碼器端造成如滾雪球般的效應而全數解錯做一改良。
Reference(1/2) [1] A. Wyner and J. Ziv, “Some Asymptotic Properties of the Entropy of a Stationary Ergodic Data Source with Application to Data Compression,” IEEE Trans. Inform. Theory, vol. 35, pp. 1250-1258, 1989. [2] J. A. Storer and J. Reif, “Error resilient optimal data compression,” SIAM J. Comput., vol. 26, no. 4, pp. 934–939, Aug, 1997. [3] J. A. Storer and J. Reif, “Low-cost prevention of error propagation for data compression with dynamic dictionaries,” in Proc. IEEE Data Compression Conf., Snowbird, UT, 1997, pp. 171–180. [4] J. A. Storer, “The prevention of error propagation in dictionary compression with update and deletion,” in Proc. IEEE Data Compression Conf., Snowbird, UT, 1998, pp. 199–208.
Reference (2/2) [5] J. A. Storer, “The prevention of error propagation in dictionary compression with update and deletion,” in Proc. of the IEEE , Volume: 88 Issue: 11 , Nov. 2000 pp. 1713 -1721 [6] J. Ziv and A. Lempel, “A universal algorithm for sequential data compression,” IEEE Trans. Inform. Theory, vol.23, no. 3, pp. 337-343, 1977. [7] J. Ziv and A. Lempel, “Compression of Individual Sequences via Variable-Rate Coding,” IEEE Trans. Inform. Theory, vol. 4, pp. 536-550, 1978. [8] Y. A. Reznik and W. Spankowski, “On the average redundancy rate of the Lempel–Ziv code with K-Error protocol,” in Proc. IEEE Data Compression Conf., Snowbird, UT, 2000, pp. 373–382.