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

6.6 LZW符号の復号化実例

例として、符号化の実例で符号化した「(97)(97)(98)(98)(99)(260)(99)(100)(263)(100)(101)(266)(267)(266)(102)(270)(102)」を前節の手順に従って復号化してみましょう。

  1. 元データを8ビットの記号とし、最初に256種類の全記号を登録した辞書を用意する。 その場合、記号を8ビットの整数として扱った場合の整数値をそのまま参照番号とする。 そして記号列を記憶するための場所を用意し、読み込む符号のビット数pを9と初期化する。
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    記号列=(空)  p=9
  2. 最初の符号「97」を読み込み、それを8ビットの記号としたものを出力し、同時に記号列として記憶する。
    読み込んだ番号=97
    出力データ:a
    記号列=a  p=9
  3. 次の符号「97」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「97」は辞書にあるのでそれに対応する語句「a」を出力し、同時にその語句の最初の記号aを現在の記号列に追加した「aa」を新しい語句として辞書に登録する。

    読み込んだ番号=97
    出力データ:a
    記号列=a  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号
    aa256
    登録語句=aa:参照番号=256
  4. 今出力した「a」をあらためて記号列とする。
    記号列=a  p=9
  5. 次の符号「98」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「98」は辞書にあるのでそれに対応する語句「b」を出力し、同時にその語句の最初の記号bを現在の記号列に追加した「ab」を新しい語句として辞書に登録する。

    読み込んだ番号=98
    出力データ:b
    記号列=a  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号
    aa256ab257
    登録語句=ab:参照番号=257
  6. 今出力した「b」をあらためて記号列とする。
    記号列=b  p=9
  7. 次の符号「98」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「98」は辞書にあるのでそれに対応する語句「b」を出力し、同時にその語句の最初の記号bを現在の記号列に追加した「bb」を新しい語句として辞書に登録する。

    読み込んだ番号=98
    出力データ:b
    記号列=a  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号
    aa256ab257bb258
    登録語句=bb:参照番号=258
  8. 今出力した「b」をあらためて記号列とする。
    記号列=b  p=9
  9. 次の符号「99」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「99」は辞書にあるのでそれに対応する語句「c」を出力し、同時にその語句の最初の記号bを現在の記号列に追加した「bc」を新しい語句として辞書に登録する。

    読み込んだ番号=99
    出力データ:c
    記号列=b  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259
    登録語句=bc:参照番号=259
  10. 今出力した「c」をあらためて記号列とする。
    記号列=c  p=9
  11. 次の符号「260」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「260」は辞書にないので、現在の記号列の最初の記号cを現在の記号列に追加した「cc」を出力し、同時に新しい語句として辞書に登録する。

    読み込んだ番号=260
    出力データ:cc
    記号列=c  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260
    登録語句=cc:参照番号=260
  12. 今出力した「cc」をあらためて記号列とする。
    記号列=cc  p=9
  13. 次の符号「99」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「99」は辞書にあるのでそれに対応する語句「c」を出力し、同時にその語句の最初の記号cを現在の記号列に追加した「ccc」を新しい語句として辞書に登録する。

    読み込んだ番号=99
    出力データ:c
    記号列=cc  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261
    登録語句=ccc:参照番号=261
  14. 今出力した「c」をあらためて記号列とする。
    記号列=c  p=9
  15. 次の符号「100」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「100」は辞書にあるのでそれに対応する語句「d」を出力し、同時にその語句の最初の記号dを現在の記号列に追加した「cd」を新しい語句として辞書に登録する。

    読み込んだ番号=100
    出力データ:d
    記号列=c  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262
    登録語句=cd:参照番号=262
  16. 今出力した「d」をあらためて記号列とする。
    記号列=d  p=9
  17. 次の符号「263」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「263」は辞書にないので、現在の記号列の最初の記号dを現在の記号列に追加した「dd」を出力し、同時に新しい語句として辞書に登録する。

    読み込んだ番号=263
    出力データ:dd
    記号列=d  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    登録語句=dd:参照番号=263
  18. 今出力した「dd」をあらためて記号列とする。
    記号列=dd  p=9
  19. 次の符号「100」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「100」は辞書にあるのでそれに対応する語句「d」を出力し、同時にその語句の最初の記号dを現在の記号列に追加した「ddd」を新しい語句として辞書に登録する。

    読み込んだ番号=100
    出力データ:d
    記号列=ddd  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号
    ddd264
    登録語句=ddd:参照番号=264
  20. 今出力した「d」をあらためて記号列とする。
    記号列=d  p=9
  21. 次の符号「101」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「101」は辞書にあるのでそれに対応する語句「e」を出力し、同時にその語句の最初の記号eを現在の記号列に追加した「de」を新しい語句として辞書に登録する。

    読み込んだ番号=101
    出力データ:e
    記号列=d  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号
    ddd264de265
    登録語句=de:参照番号=265
  22. 今出力した「e」をあらためて記号列とする。
    記号列=e  p=9
  23. 次の符号「266」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「266」は辞書にないので、現在の記号列の最初の記号eを現在の記号列に追加した「ee」を出力し、同時に新しい語句として辞書に登録する。

    読み込んだ番号=266
    出力データ:ee
    記号列=e  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号
    ddd264de265ee266
    登録語句=ee:参照番号=266
  24. 今出力した「ee」をあらためて記号列とする。
    記号列=ee  p=9
  25. 次の符号「267」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「267」は辞書にないので、現在の記号列の最初の記号eを現在の記号列に追加した「eee」を出力し、同時に新しい語句として辞書に登録する。

    読み込んだ番号=267
    出力データ:eee
    記号列=ee  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号語句番号
    ddd264de265ee266eee267
    登録語句=eee:参照番号=267
  26. 今出力した「eee」をあらためて記号列とする。
    記号列=eee  p=9
  27. 次の符号「266」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「266」は辞書にあるのでそれに対応する語句「ee」を出力し、同時にその語句の最初の記号eを現在の記号列に追加した「eeee」を新しい語句として辞書に登録する。

    読み込んだ番号=266
    出力データ:ee
    記号列=eee  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号語句番号語句番号
    ddd264de265ee266eee267eeee268
    登録語句=eeee:参照番号=268
  28. 今出力した「ee」をあらためて記号列とする。
    記号列=ee  p=9
  29. 次の符号「102」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「102」は辞書にあるのでそれに対応する語句「f」を出力し、同時にその語句の最初の記号fを現在の記号列に追加した「eef」を新しい語句として辞書に登録する。

    読み込んだ番号=102
    出力データ:f
    記号列=eef  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号語句番号語句番号語句番号
    ddd264de265ee266eee267eeee268eef269
    登録語句=eef:参照番号=269
  30. 今出力した「f」をあらためて記号列とする。
    記号列=f  p=9
  31. 次の符号「270」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「270」は辞書にないので、現在の記号列の最初の記号eを現在の記号列に追加した「ff」を出力し、同時に新しい語句として辞書に登録する。

    読み込んだ番号=270
    出力データ:ff
    記号列=f  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    ddd264de265ee266eee267eeee268eef269ff270
    登録語句=ff:参照番号=270
  32. 今出力した「ff」をあらためて記号列とする。
    記号列=ff  p=9
  33. 次の符号「102」を読み込み、その参照番号が現在の辞書にあるかどうか調べる。

    「102」は辞書にあるのでそれに対応する語句「f」を出力し、同時にその語句の最初の記号fを現在の記号列に追加した「fff」を新しい語句として辞書に登録する。

    読み込んだ番号=102
    出力データ:f
    記号列=fff  p=9
    語句番号語句番号語句番号
    (0)0(1)1(255)255
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    aa256ab257bb258bc259cc260ccc261cd262dd263
    語句番号語句番号語句番号語句番号語句番号語句番号語句番号語句番号
    ddd264de265ee266eee267eeee268eef269ff270fff271
    登録語句=fff:参照番号=271
  34. 今出力した「f」をあらためて記号列とする。
    記号列=f  p=9
  35. 符号データ終了。

この結果、最終的な復元データは次のようになります。

復元データ:aabbccccddddeeeeeeeeffff

6.7 LZ78符号化の特徴