玄関コンピュータの部屋各種解説コーナーデータ圧縮法概説

6.4 LZW符号化の実例

例として、LZ77符号の例と同じ「aabbccccddddeeeeeeeeffff」という元データを前節の手順に従ってLZW符号化してみましょう。

  1. 元データを8ビットの記号とし、最初に256種類の全記号を登録した辞書を用意する。 その場合、記号を8ビットの整数として扱った場合の整数値をそのまま参照番号とする。 そして最長一致系列とその参照番号を記憶するための場所を用意し、参照番号を符号化する時のビット数pを9と初期化する。
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    最長一致系列=(空):参照番号=(空)  p=9
  2. 最初の記号aを読み込んで最長一系列とし、それを整数化した値を参照番号として記憶する。
    最長一致系列=a:参照番号=97  p=9
  3. 次の記号aを読み込み、それを最長一致系列に追加した「aa」という記号列を辞書から探す。

    この場合「aa」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「aa」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号
    aa256
    読み込んだ記号=a
    最長一致系列=a:参照番号=97  p=9
    出力データ:97=001100001(9ビットの整数化表現)
    登録語句=aa:参照番号=256
  4. 今読み込んだaをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=a:参照番号=97  p=9
  5. 次の記号bを読み込み、それを最長一致系列に追加した「ab」という記号列を辞書から探す。

    この場合「ab」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「ab」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号
    aa256ab257
    読み込んだ記号=b
    最長一致系列=a:参照番号=97  p=9
    出力データ:97
    登録語句=ab:参照番号=257
  6. 今読み込んだbをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=b:参照番号=98  p=9
  7. 次の記号bを読み込み、それを最長一致系列に追加した「bb」という記号列を辞書から探す。

    この場合「bb」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「bb」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号
    aa256ab257bb258
    読み込んだ記号=b
    最長一致系列=b:参照番号=98  p=9
    出力データ:98
    登録語句=bb:参照番号=258
  8. 今読み込んだbをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=b:参照番号=98  p=9
  9. 次の記号cを読み込み、それを最長一致系列に追加した「bc」という記号列を辞書から探す。

    この場合「bc」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「bc」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259
    読み込んだ記号=c
    最長一致系列=b:参照番号=98  p=9
    出力データ:98
    登録語句=bc:参照番号=259
  10. 今読み込んだcをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=c:参照番号=99  p=9
  11. 次の記号cを読み込み、それを最長一致系列に追加した「cc」という記号列を辞書から探す。

    この場合「cc」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「cc」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260
    読み込んだ記号=c
    最長一致系列=c:参照番号=99  p=9
    出力データ:99
    登録語句=cc:参照番号=260
  12. 今読み込んだcをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=c:参照番号=99  p=9
  13. 次の記号cを読み込み、それを最長一致系列に追加した「cc」という記号列を辞書から探す。

    この場合「cc」は260番にあるので、それを新しい最長一致系列とし、その参照番号260を記憶する。

    最長一致系列=cc:参照番号=260  p=9
  14. 次の記号cを読み込み、それを最長一致系列に追加した「ccc」という記号列を辞書から探す。

    この場合「ccc」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「ccc」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261
    読み込んだ記号=c
    最長一致系列=cc:参照番号=260  p=9
    出力データ:260
    登録語句=ccc:参照番号=261
  15. 今読み込んだcをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=c:参照番号=99  p=9
  16. 次の記号dを読み込み、それを最長一致系列に追加した「cd」という記号列を辞書から探す。

    この場合「cd」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「cd」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262
    読み込んだ記号=d
    最長一致系列=c:参照番号=99  p=9
    出力データ:99
    登録語句=cd:参照番号=262
  17. 今読み込んだdをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=d:参照番号=100  p=9
  18. 次の記号dを読み込み、それを最長一致系列に追加した「dd」という記号列を辞書から探す。

    この場合「dd」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「dd」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    読み込んだ記号=d
    最長一致系列=d:参照番号=100  p=9
    出力データ:100
    登録語句=dd:参照番号=263
  19. 今読み込んだdをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=d:参照番号=100  p=9
  20. 次の記号dを読み込み、それを最長一致系列に追加した「dd」という記号列を辞書から探す。

    この場合「dd」は263番にあるので、それを新しい最長一致系列とし、その参照番号263を記憶する。

    最長一致系列=dd:参照番号=263  p=9
  21. 次の記号dを読み込み、それを最長一致系列に追加した「ddd」という記号列を辞書から探す。

    この場合「ddd」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「ddd」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号
    ddd264
    読み込んだ記号=d
    最長一致系列=dd:参照番号=263  p=9
    出力データ:263
    登録語句=ddd:参照番号=264
  22. 今読み込んだdをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=d:参照番号=100  p=9
  23. 次の記号eを読み込み、それを最長一致系列に追加した「de」という記号列を辞書から探す。

    この場合「de」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「de」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号
    ddd264de265
    読み込んだ記号=e
    最長一致系列=d:参照番号=100  p=9
    出力データ:100
    登録語句=de:参照番号=265
  24. 今読み込んだeをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=e:参照番号=101  p=9
  25. 次の記号eを読み込み、それを最長一致系列に追加した「ee」という記号列を辞書から探す。

    この場合「ee」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「ee」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号
    ddd264de265ee266
    読み込んだ記号=e
    最長一致系列=e:参照番号=101  p=9
    出力データ:101
    登録語句=ee:参照番号=266
  26. 今読み込んだeをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=e:参照番号=101  p=9
  27. 次の記号eを読み込み、それを最長一致系列に追加した「ee」という記号列を辞書から探す。

    この場合「ee」は266番にあるので、それを新しい最長一致系列とし、その参照番号266を記憶する。

    最長一致系列=ee:参照番号=266  p=9
  28. 次の記号eを読み込み、それを最長一致系列に追加した「eee」という記号列を辞書から探す。

    この場合「eee」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「eee」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号語句番号
    ddd264de265ee266eee267
    読み込んだ記号=e
    最長一致系列=ee:参照番号=266  p=9
    出力データ:266
    登録語句=eee:参照番号=267
  29. 今読み込んだeをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=e:参照番号=101  p=9
  30. 次の記号eを読み込み、それを最長一致系列に追加した「ee」という記号列を辞書から探す。

    この場合「ee」は266番にあるので、それを新しい最長一致系列とし、その参照番号266を記憶する。

    最長一致系列=ee:参照番号=266  p=9
  31. 次の記号eを読み込み、それを最長一致系列に追加した「eee」という記号列を辞書から探す。

    この場合「eee」は267番にあるので、それを新しい最長一致系列とし、その参照番号267を記憶する。

    最長一致系列=eee:参照番号=267  p=9
  32. 次の記号eを読み込み、それを最長一致系列に追加した「eeee」という記号列を辞書から探す。

    この場合「eeee」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「eeee」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号語句番号語句番号
    ddd264de265ee266eee267eeee268
    読み込んだ記号=e
    最長一致系列=eee:参照番号=267  p=9
    出力データ:267
    登録語句=eeee:参照番号=268
  33. 今読み込んだeをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=e:参照番号=101  p=9
  34. 次の記号eを読み込み、それを最長一致系列に追加した「ee」という記号列を辞書から探す。

    この場合「ee」は266番にあるので、それを新しい最長一致系列とし、その参照番号266を記憶する。

    最長一致系列=ee:参照番号=266  p=9
  35. 次の記号fを読み込み、それを最長一致系列に追加した「eef」という記号列を辞書から探す。

    この場合「eef」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「eef」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号語句番号語句番号語句番号
    ddd264de265ee266eee267eeee268eef269
    読み込んだ記号=f
    最長一致系列=ee:参照番号=266  p=9
    出力データ:266
    登録語句=eef:参照番号=269
  36. 今読み込んだfをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=f:参照番号=102  p=9
  37. 次の記号fを読み込み、それを最長一致系列に追加した「ff」という記号列を辞書から探す。

    この場合「ff」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「ff」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    ddd264de265ee266eee267eeee268eef269ff270
    読み込んだ記号=f
    最長一致系列=f:参照番号=102  p=9
    出力データ:102
    登録語句=ff:参照番号=270
  38. 今読み込んだfをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=f:参照番号=102  p=9
  39. 次の記号fを読み込み、それを最長一致系列に追加した「ff」という記号列を辞書から探す。

    この場合「ff」は270番にあるので、それを新しい最長一致系列とし、その参照番号270を記憶する。

    最長一致系列=ff:参照番号=270  p=9
  40. 次の記号fを読み込み、それを最長一致系列に追加した「fff」という記号列を辞書から探す。

    この場合「fff」は辞書にないので、現在の最長一致系列の参照番号を9ビットで符号化して出力し、「fff」を新しい語句として辞書に登録する。

    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    ddd264de265ee266eee267eeee268eef269ff270fff271
    読み込んだ記号=f
    最長一致系列=ff:参照番号=270  p=9
    出力データ:270
    登録語句=fff:参照番号=271
  41. 今読み込んだfをあらためて最長一致系列とし、その参照番号を記憶する。
    最長一致系列=f:参照番号=102  p=9
  42. これで元データが終了したので、最長一致系系列として残っているfの参照番号を9ビットで符号化して出力する。
    最長一致系列=f:参照番号=102  p=9
    出力データ:102

以上の結果、最終的な符号化データは次のようになります。

符号化データ:(97)(97)(98)(98)(99)(260)(99)(100)(263)(100)(101)(266)(267)(266)(102)(270)(102)

これらの符号は全て9ビットで符号化されていますから、全体のビット数は、

17×9=153ビット

となり、この時の圧縮率と平均符号長は次のようになります。

圧縮率=153
───
24×8
153
──
192
=0.796875(79.6875%)
平均符号長=153
──
24
=6.375ビット

ちなみに同じデータをオリジナルのLZ78符号で符号化しますと、最終的に作成される辞書と符号化データ、そしてその時の圧縮率と平均符号長は以下のようになります。

語句番号語句番号語句番号語句番号語句番号語句番号語句番号
1ab234cc5cd67
語句番号語句番号語句番号語句番号語句番号語句番号語句番号
dd89ee10eee11eef1213ff14

符号化データ:a1b0b0c4c4d0d7d0e9e10e10f0f13f
全体のビット数:1+2×2+4×3+6×4+14×8=153ビット

圧縮率=153
───
24×8
153
──
192
=0.796875(79.6875%)
平均符号長=153
──
24
=6.375ビット

以上のように、このデータ場合、LZW符号とオリジナルのLZ78符号とは全く同じ圧縮率になります。 この圧縮率はLZ77符号よりも悪い値ですが、LZ78符号は元データが多いと圧縮効率が落ちる可能性のあるLZ77の問題点を解決するために考案された手法ですから、このデータのように元データが少ない場合は、LZ77符号よりも圧縮効率が悪くなる傾向があります。