JP3236747B2 - データ伸長方式 - Google Patents
データ伸長方式Info
- Publication number
- JP3236747B2 JP3236747B2 JP29643194A JP29643194A JP3236747B2 JP 3236747 B2 JP3236747 B2 JP 3236747B2 JP 29643194 A JP29643194 A JP 29643194A JP 29643194 A JP29643194 A JP 29643194A JP 3236747 B2 JP3236747 B2 JP 3236747B2
- Authority
- JP
- Japan
- Prior art keywords
- character string
- index
- data
- dictionary
- registered
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Description
【0001】
【産業上の利用分野】本発明は、ユニバーサル符号であ
る動的辞書型Lempel-Ziv符号により圧縮されたデータを
高速に伸長することを可能にするデータ伸長方式に関す
る。
る動的辞書型Lempel-Ziv符号により圧縮されたデータを
高速に伸長することを可能にするデータ伸長方式に関す
る。
【0002】
【従来の技術】近年、CPU性能の向上に伴い計算機で
取り扱われるテキストファイルやオブジェクトファイル
を圧縮して外部記憶媒体に格納する技術が使われ始めて
いる。
取り扱われるテキストファイルやオブジェクトファイル
を圧縮して外部記憶媒体に格納する技術が使われ始めて
いる。
【0003】そこで必要となる圧縮方式として、データ
の統計的性質に依存しないユニバーサル符号が注目され
ている。ユニバーサル符号の代表的な方式として、Lemp
el-Zivの符号化方法がある。Lempel-Zivの符号化方法
は、参照辞書の作成方法によって動的辞書方式とスライ
ド辞書方式に分類されている( 詳しくは、インターフェ
ース 1992 年 vol.8 No.183 " データ圧縮アルゴリズム
とその実現" を参照) 。特に、圧縮処理の簡潔さから、
動的辞書方式を改良したLZW(Lempel-Ziv-Welch) 符号が
良く用いられている。
の統計的性質に依存しないユニバーサル符号が注目され
ている。ユニバーサル符号の代表的な方式として、Lemp
el-Zivの符号化方法がある。Lempel-Zivの符号化方法
は、参照辞書の作成方法によって動的辞書方式とスライ
ド辞書方式に分類されている( 詳しくは、インターフェ
ース 1992 年 vol.8 No.183 " データ圧縮アルゴリズム
とその実現" を参照) 。特に、圧縮処理の簡潔さから、
動的辞書方式を改良したLZW(Lempel-Ziv-Welch) 符号が
良く用いられている。
【0004】次に、LZW 方式の圧縮処理について説明す
る。
る。
【0005】なお、これ以降の説明の中では、データ中
の個々のワード単位を文字と呼び、文字が任意の数だけ
連なったものを文字列と呼ぶことにする。LZW 方式によ
るデータ圧縮処理は増分分解と呼ばれる方法により、入
力データを相異なる文字列に分解し、各文字列にインデ
ックスを付与して辞書に登録し、その辞書を参照するこ
とにより入力文字列と最長一致する辞書のエントリを検
索し、そのエントリのインデックスを符号化することに
より、長い文字列を短いインデックスに変換することが
できるのでデータ圧縮が可能となる。
の個々のワード単位を文字と呼び、文字が任意の数だけ
連なったものを文字列と呼ぶことにする。LZW 方式によ
るデータ圧縮処理は増分分解と呼ばれる方法により、入
力データを相異なる文字列に分解し、各文字列にインデ
ックスを付与して辞書に登録し、その辞書を参照するこ
とにより入力文字列と最長一致する辞書のエントリを検
索し、そのエントリのインデックスを符号化することに
より、長い文字列を短いインデックスに変換することが
できるのでデータ圧縮が可能となる。
【0006】LZW 方式の圧縮処理を図3及び図4を用い
てより詳しく説明する。最初に、図3(a)によりLZW
方式の符号化処理の流れを説明した後に、図4により具
体的な入力文字列に対する符号化例について説明する。
まず、処理に先だって辞書の初期化が行われる(S30
1)。辞書の初期化は入力画像データ中でとりうる全て
の文字を辞書のエントリに登録することにより行われ
る。次に、データを入力し(S302)、入力文字列と
一致する最長の文字列を現在までに登録されている辞書
のエントリの中から探索する(S303)。そして、探
索された文字列に付されているインデックスを符号化し
て出力する(S304)。このとき、符号は辞書のエン
トリを完全に識別できなければならないので、現在の辞
書のエントリ数をMとすると、符号長は最低でもlog
(M)以上の整数値でなければならない。ただし、この
ときの対数の底は2である。次に、辞書に新たな文字列
を登録することになるが、一般にハードウェア規模の制
約から辞書に登録されるエントリ数は上限が決められて
いる。普通その数は2の12乗から16乗程度である。
そこで、辞書のエントリ数がその所定の大きさに達した
か否かを判定し(S305)、エントリ数が最大のとき
はS301に戻り、辞書を再初期化してから符号化処理
を進める。また、エントリ数が最大に達していないとき
は、新たな文字列を辞書に登録する(S306)。ここ
で登録される文字列は、直前に符号化された文字列の最
後尾に次に入力される文字を1文字繋げたものである。
そして、辞書の更新が済んだならば、再びS302に戻
り、順次符号化処理を継続し、処理すべきデータが無く
なるまで処理を続ける。ここで、図4(a)に示した文
字列が入力されたとき、どのように符号化処理がされる
か見ることにする。図4(b)はS302からS306
までの処理ループを1単位としたとき、処理番号、S3
03で得られる最長一致文字列、S304で出力される
符号化インデックス、S306で辞書に登録されるイン
デックス及び登録文字列を各行毎に並べてある。この例
は、入力データを構成する文字が全部でa、b、cの3
つなので、S301により、辞書は図4(b)の辞書の
インデックス0から2に各1文字づつ登録され、初期化
される。S302において、データが順次入力され、S
303において、最長一致文字列が辞書から検索され
る。すなわち処理番号L1では、入力データの先頭aか
ら入力され、文字列aはインデックス0のエントリに登
録されているが、文字列abはインデックス0から2に
は登録されていないので、最長一致文字列はaとなり、
そのとき符号化されるのは文字列aに対応するインデッ
クス0となる。よって、S304において、インデック
ス0が符号化出力される。そして、S305で辞書のエ
ントリ数が調べられた後に、S306において辞書にエ
ントリが登録される。S304で符号化したインデック
スは0なので、インデックス0が示す文字列aの後に次
に符号化する最初の入力文字bを繋げ、新たな文字列a
bを作成する(ここで、作成された文字列を符号化した
インデックスと末尾に繋げる文字により(0+b) とも
表すことにする)。この新たな文字列ab=(0+b)
をインデックス3とともに登録する。一般に、インデッ
クスiが最長一致文字列で次に続く文字がkならば、文
字列(i+k)はこれまでに辞書に登録されている全て
の文字列と異なることは明らかである。これで、処理番
号L1の処理は全て終了しS302に戻り、次の処理番
号L2に移る。処理番号L1で入力データの1番目の文
字を符号化したので、処理番号L2では2番目の文字b
から入力していく。処理番号L1と同様の処理をする
と、辞書のインデックス0から3のエントリにおいて最
長一致文字列はbであり、それに対応するインデックス
は1である。インデックス1を符号化出力し、新たな文
字列ba=(1+a)をインデックス4とともに辞書に
登録する。これで、処理番号L2が終了し、以下、図4
(b)に示すようにL3以降の処理により、最長一致文
字列の検索、インデックスの符号化、辞書エントリの登
録が順次行われる。この圧縮処理により図4(a)に示
す入力データは、下線が引かれた文字列毎に分解されて
いるのが分かる。S302で最長一致文字列を辞書から
検索する場合、辞書を網羅的に調べることは非効率的な
ので、一般に辞書を木構造で表現し、検索の高速化を行
っている。代表的な高速化手法として内部ハッシュ法や
外部ハッシュ法が知られている。次に、LZW 方式の伸長
処理について説明する。LZW 方式によるデータ伸長処理
は符号化されている辞書のインデックスから辞書のエン
トリを参照し、そのエントリに登録されている文字列を
出力することにより原データを復号化し、順次復号化さ
れる文字列から符号化時と同様の部分文字列を辞書に登
録していくことにより伸長処理がなされる。
てより詳しく説明する。最初に、図3(a)によりLZW
方式の符号化処理の流れを説明した後に、図4により具
体的な入力文字列に対する符号化例について説明する。
まず、処理に先だって辞書の初期化が行われる(S30
1)。辞書の初期化は入力画像データ中でとりうる全て
の文字を辞書のエントリに登録することにより行われ
る。次に、データを入力し(S302)、入力文字列と
一致する最長の文字列を現在までに登録されている辞書
のエントリの中から探索する(S303)。そして、探
索された文字列に付されているインデックスを符号化し
て出力する(S304)。このとき、符号は辞書のエン
トリを完全に識別できなければならないので、現在の辞
書のエントリ数をMとすると、符号長は最低でもlog
(M)以上の整数値でなければならない。ただし、この
ときの対数の底は2である。次に、辞書に新たな文字列
を登録することになるが、一般にハードウェア規模の制
約から辞書に登録されるエントリ数は上限が決められて
いる。普通その数は2の12乗から16乗程度である。
そこで、辞書のエントリ数がその所定の大きさに達した
か否かを判定し(S305)、エントリ数が最大のとき
はS301に戻り、辞書を再初期化してから符号化処理
を進める。また、エントリ数が最大に達していないとき
は、新たな文字列を辞書に登録する(S306)。ここ
で登録される文字列は、直前に符号化された文字列の最
後尾に次に入力される文字を1文字繋げたものである。
そして、辞書の更新が済んだならば、再びS302に戻
り、順次符号化処理を継続し、処理すべきデータが無く
なるまで処理を続ける。ここで、図4(a)に示した文
字列が入力されたとき、どのように符号化処理がされる
か見ることにする。図4(b)はS302からS306
までの処理ループを1単位としたとき、処理番号、S3
03で得られる最長一致文字列、S304で出力される
符号化インデックス、S306で辞書に登録されるイン
デックス及び登録文字列を各行毎に並べてある。この例
は、入力データを構成する文字が全部でa、b、cの3
つなので、S301により、辞書は図4(b)の辞書の
インデックス0から2に各1文字づつ登録され、初期化
される。S302において、データが順次入力され、S
303において、最長一致文字列が辞書から検索され
る。すなわち処理番号L1では、入力データの先頭aか
ら入力され、文字列aはインデックス0のエントリに登
録されているが、文字列abはインデックス0から2に
は登録されていないので、最長一致文字列はaとなり、
そのとき符号化されるのは文字列aに対応するインデッ
クス0となる。よって、S304において、インデック
ス0が符号化出力される。そして、S305で辞書のエ
ントリ数が調べられた後に、S306において辞書にエ
ントリが登録される。S304で符号化したインデック
スは0なので、インデックス0が示す文字列aの後に次
に符号化する最初の入力文字bを繋げ、新たな文字列a
bを作成する(ここで、作成された文字列を符号化した
インデックスと末尾に繋げる文字により(0+b) とも
表すことにする)。この新たな文字列ab=(0+b)
をインデックス3とともに登録する。一般に、インデッ
クスiが最長一致文字列で次に続く文字がkならば、文
字列(i+k)はこれまでに辞書に登録されている全て
の文字列と異なることは明らかである。これで、処理番
号L1の処理は全て終了しS302に戻り、次の処理番
号L2に移る。処理番号L1で入力データの1番目の文
字を符号化したので、処理番号L2では2番目の文字b
から入力していく。処理番号L1と同様の処理をする
と、辞書のインデックス0から3のエントリにおいて最
長一致文字列はbであり、それに対応するインデックス
は1である。インデックス1を符号化出力し、新たな文
字列ba=(1+a)をインデックス4とともに辞書に
登録する。これで、処理番号L2が終了し、以下、図4
(b)に示すようにL3以降の処理により、最長一致文
字列の検索、インデックスの符号化、辞書エントリの登
録が順次行われる。この圧縮処理により図4(a)に示
す入力データは、下線が引かれた文字列毎に分解されて
いるのが分かる。S302で最長一致文字列を辞書から
検索する場合、辞書を網羅的に調べることは非効率的な
ので、一般に辞書を木構造で表現し、検索の高速化を行
っている。代表的な高速化手法として内部ハッシュ法や
外部ハッシュ法が知られている。次に、LZW 方式の伸長
処理について説明する。LZW 方式によるデータ伸長処理
は符号化されている辞書のインデックスから辞書のエン
トリを参照し、そのエントリに登録されている文字列を
出力することにより原データを復号化し、順次復号化さ
れる文字列から符号化時と同様の部分文字列を辞書に登
録していくことにより伸長処理がなされる。
【0007】LZW 方式の伸長処理を図3及び図5を用い
てより詳しく説明する。最初に、図3(b)によりLZW
方式の伸長処理の流れを説明した後に、図5により具体
的な入力符号列に対する復号化例について説明する。ま
ず、符号化のときと同様に辞書の初期化を行う(S31
1)。そして、圧縮符号を入力し(S312)、そのイ
ンデックス値を持つ辞書のエントリを検索する(S31
3)。そして、検索された辞書のエントリに登録されて
いる文字列を読み出し、データとして出力する(S31
4)。その後、辞書のエントリ数は符号化のときと同じ
上限をもつので、その所定の上限値に達したか否かを判
定し(S315)、エントリ数が最大のときはS311
に戻り、辞書を再初期化してから伸長処理を進める。ま
た、エントリ数が最大に達していないときは、新たな文
字列を辞書に登録する(316)。ここで登録される文
字列は、直前に復号化された文字列の最後尾に現在復号
化された文字列の先頭の1文字を繋げたものである。そ
して、辞書の更新が済んだならば、再びS312に戻
り、順次伸長処理を継続し、処理すべき圧縮符号が無く
なるまで処理を続ける。
てより詳しく説明する。最初に、図3(b)によりLZW
方式の伸長処理の流れを説明した後に、図5により具体
的な入力符号列に対する復号化例について説明する。ま
ず、符号化のときと同様に辞書の初期化を行う(S31
1)。そして、圧縮符号を入力し(S312)、そのイ
ンデックス値を持つ辞書のエントリを検索する(S31
3)。そして、検索された辞書のエントリに登録されて
いる文字列を読み出し、データとして出力する(S31
4)。その後、辞書のエントリ数は符号化のときと同じ
上限をもつので、その所定の上限値に達したか否かを判
定し(S315)、エントリ数が最大のときはS311
に戻り、辞書を再初期化してから伸長処理を進める。ま
た、エントリ数が最大に達していないときは、新たな文
字列を辞書に登録する(316)。ここで登録される文
字列は、直前に復号化された文字列の最後尾に現在復号
化された文字列の先頭の1文字を繋げたものである。そ
して、辞書の更新が済んだならば、再びS312に戻
り、順次伸長処理を継続し、処理すべき圧縮符号が無く
なるまで処理を続ける。
【0008】ここで、図5(a)に示したインデックス
が入力されたとき、どのように復号化処理がされるか見
ることにする。なお、図5(a)で示す伸長処理例は図
4の圧縮処理例で圧縮された符号を復号化したものであ
る。図5(b)はS312からS315までの処理ルー
プを1単位としたとき、処理番号、S312で得られる
入力インデックス、S314で出力する伸長データ、S
315で辞書に登録されるインデックス及び登録文字列
を各行毎に並べてある。辞書の初期化は圧縮処理の例で
説明したときと同様に、辞書のインデックス0から2に
a、b、cが各1文字づつ登録される。処理番号L1に
おいて、まず、S312で圧縮符号を入力し、それから
入力インデックス0を得る。次に、S313においてイ
ンデックス0の辞書エントリに登録されている文字列は
aであることが検索され、文字列aが伸長データとして
S314により出力される。1回目の処理L1では辞書
のエントリ登録は行わず、S312に戻る。処理番号L
2では、処理番号L1と同様に圧縮符号を入力し、イン
デックス1を得る。インデックス1の辞書エントリに登
録されている文字列はbなので、文字列bが伸長データ
として出力される。そして、S315で辞書のエントリ
数が調べられた後に、S316において辞書にエントリ
が登録される。ここで登録する文字列は、前回の処理L
1で伸長した文字列aに今回の処理L2で伸長した文字
列の先頭の1文字bを繋げることにより生成する。この
文字列を圧縮処理のときと同様に(0+b)とかく。そ
して、文字列(0+b)をインデックス3とともに辞書
のエントリに登録する。これで、処理番号L2が終了
し、以下、図5(b)に示すようにL3以降の処理によ
り、インデックスの復号化、文字列の読み出し、辞書エ
ントリの更新が行われる。
が入力されたとき、どのように復号化処理がされるか見
ることにする。なお、図5(a)で示す伸長処理例は図
4の圧縮処理例で圧縮された符号を復号化したものであ
る。図5(b)はS312からS315までの処理ルー
プを1単位としたとき、処理番号、S312で得られる
入力インデックス、S314で出力する伸長データ、S
315で辞書に登録されるインデックス及び登録文字列
を各行毎に並べてある。辞書の初期化は圧縮処理の例で
説明したときと同様に、辞書のインデックス0から2に
a、b、cが各1文字づつ登録される。処理番号L1に
おいて、まず、S312で圧縮符号を入力し、それから
入力インデックス0を得る。次に、S313においてイ
ンデックス0の辞書エントリに登録されている文字列は
aであることが検索され、文字列aが伸長データとして
S314により出力される。1回目の処理L1では辞書
のエントリ登録は行わず、S312に戻る。処理番号L
2では、処理番号L1と同様に圧縮符号を入力し、イン
デックス1を得る。インデックス1の辞書エントリに登
録されている文字列はbなので、文字列bが伸長データ
として出力される。そして、S315で辞書のエントリ
数が調べられた後に、S316において辞書にエントリ
が登録される。ここで登録する文字列は、前回の処理L
1で伸長した文字列aに今回の処理L2で伸長した文字
列の先頭の1文字bを繋げることにより生成する。この
文字列を圧縮処理のときと同様に(0+b)とかく。そ
して、文字列(0+b)をインデックス3とともに辞書
のエントリに登録する。これで、処理番号L2が終了
し、以下、図5(b)に示すようにL3以降の処理によ
り、インデックスの復号化、文字列の読み出し、辞書エ
ントリの更新が行われる。
【0009】ここで、処理番号L5に注目すると、イン
デックス6が入力インデックスとして得られるが、辞書
にはインデックス0から5を持つエントリしか登録され
ていない。このような状況は、符号化時に直前の処理ル
ープで符号化されたインデックスを参照した場合(つま
り、同じ文字列パターンが続けてデータ中に現れた場
合)に生じ、また、そのときしか生じ得ないことは明白
である。すなわち、図5(b)の例では処理番号L5の
直前の処理ループL4で参照したインデックス3を再び
参照し、そのエントリの文字列abを読み出し、文字列
abの後に同じ文字列abが続くので、インデックス6
のエントリの文字列は(3+a)=abaとなる。よっ
て、処理番号L5の出力データはabaであり、辞書に
もインデックス6に文字列abaが登録される。一般
に、辞書の検索及び辞書の更新処理では図5(d)に示
すように分岐処理がなされる。ここで、辞書にはインデ
ックス0からNまでエントリが登録されていて、入力イ
ンデックスをid、直前の処理ループで参照したインデ
ックスをlastid、インデックスiで示される文字
列の先頭の文字を*iと表すものとする。まず、601
で入力インデックスidとN+1を比較する。入力イン
デックスidがN+1より小さいときは、すでにそのエ
ントリは辞書に登録されているので、通常の処理を行
う。すなわち、602で入力インデックスidが示す文
字列を伸長データとして出力し、603でインデックス
lastidの示す文字列の最後に入力インデックスi
dの示す文字列の先頭文字*idを繋げた文字列(la
stid+*id)を辞書のエントリにインデックスN
+1とともに登録する。また、601において入力イン
デックスidがN+1と等しいときは、そのエントリは
まだ辞書に登録されていないので、まず辞書の更新を行
う。すなわち、604でインデックスlastidの示
す文字列の最後に入力インデックスlastidの示す
文字列の先頭文字*lastidを繋げた文字列(la
stid+*lastid)を辞書のエントリインデッ
クスN+1とともに登録する。そして、605において
入力インデックスid(=N+1)が示す文字列(la
stid+*lastid)を伸長データとして出力す
る。さて、伸長処理を行うとき、辞書の形式は図5
(b)のように各エントリにインデックスと文字列をも
つ表形式で表されるのではなく、図5(c)で示すよう
な木構造で表される。これは、各エントリに文字列を記
憶すると表のサイズが膨大となり、実現化が不可能なた
めである。図5(c)は図5(b)の辞書を木構造で表
したもので、丸囲みが節を表し、各節には節に対応する
1文字が記憶され、インデックスが付されている。ま
た、各節からはその親の節に対してポインタでリンクさ
れており、このポインタによるリンクを枝という。
デックス6が入力インデックスとして得られるが、辞書
にはインデックス0から5を持つエントリしか登録され
ていない。このような状況は、符号化時に直前の処理ル
ープで符号化されたインデックスを参照した場合(つま
り、同じ文字列パターンが続けてデータ中に現れた場
合)に生じ、また、そのときしか生じ得ないことは明白
である。すなわち、図5(b)の例では処理番号L5の
直前の処理ループL4で参照したインデックス3を再び
参照し、そのエントリの文字列abを読み出し、文字列
abの後に同じ文字列abが続くので、インデックス6
のエントリの文字列は(3+a)=abaとなる。よっ
て、処理番号L5の出力データはabaであり、辞書に
もインデックス6に文字列abaが登録される。一般
に、辞書の検索及び辞書の更新処理では図5(d)に示
すように分岐処理がなされる。ここで、辞書にはインデ
ックス0からNまでエントリが登録されていて、入力イ
ンデックスをid、直前の処理ループで参照したインデ
ックスをlastid、インデックスiで示される文字
列の先頭の文字を*iと表すものとする。まず、601
で入力インデックスidとN+1を比較する。入力イン
デックスidがN+1より小さいときは、すでにそのエ
ントリは辞書に登録されているので、通常の処理を行
う。すなわち、602で入力インデックスidが示す文
字列を伸長データとして出力し、603でインデックス
lastidの示す文字列の最後に入力インデックスi
dの示す文字列の先頭文字*idを繋げた文字列(la
stid+*id)を辞書のエントリにインデックスN
+1とともに登録する。また、601において入力イン
デックスidがN+1と等しいときは、そのエントリは
まだ辞書に登録されていないので、まず辞書の更新を行
う。すなわち、604でインデックスlastidの示
す文字列の最後に入力インデックスlastidの示す
文字列の先頭文字*lastidを繋げた文字列(la
stid+*lastid)を辞書のエントリインデッ
クスN+1とともに登録する。そして、605において
入力インデックスid(=N+1)が示す文字列(la
stid+*lastid)を伸長データとして出力す
る。さて、伸長処理を行うとき、辞書の形式は図5
(b)のように各エントリにインデックスと文字列をも
つ表形式で表されるのではなく、図5(c)で示すよう
な木構造で表される。これは、各エントリに文字列を記
憶すると表のサイズが膨大となり、実現化が不可能なた
めである。図5(c)は図5(b)の辞書を木構造で表
したもので、丸囲みが節を表し、各節には節に対応する
1文字が記憶され、インデックスが付されている。ま
た、各節からはその親の節に対してポインタでリンクさ
れており、このポインタによるリンクを枝という。
【0010】例えば、木構造の辞書による文字列の読み
出し方法として、図5(c)の木でインデックス8が入
力されたときについて図6を用いて説明する。図6
(a)のように、インデックス8が入力されると、その
インデックスが示す節から木の根の方へ向かって、根に
到るまで順次枝を辿っていく。すると、図6(b)のよ
うにc、a、bと節に記憶されている文字が読み出さ
れ、メモリにスタックされていく。文字列の並びは辞書
から読み出される文字の順序とは逆なので、メモリにス
タックした文字を逆からb、a、cとポップアップして
いくことにより、伸長データbacが出力される。
出し方法として、図5(c)の木でインデックス8が入
力されたときについて図6を用いて説明する。図6
(a)のように、インデックス8が入力されると、その
インデックスが示す節から木の根の方へ向かって、根に
到るまで順次枝を辿っていく。すると、図6(b)のよ
うにc、a、bと節に記憶されている文字が読み出さ
れ、メモリにスタックされていく。文字列の並びは辞書
から読み出される文字の順序とは逆なので、メモリにス
タックした文字を逆からb、a、cとポップアップして
いくことにより、伸長データbacが出力される。
【0011】
【発明が解決しようとする課題】以上のように従来のデ
ータ伸長方式では、辞書を木構造により表現して文字列
を読み出していたために、各節をポインタによるリンク
を辿りながら1文字づつ読み出し、また、読み出した文
字列をメモリに一度スタックすることにより文字列の順
序を反転させてから出力しなければならなかった。この
ような過程を実行するために、伸長速度が高速にならな
いという問題点があった。このことは、リアルタイムで
データ伸長処理を行わなければならないシステムに対し
て従来の伸長方式を搭載することは困難であることを示
している。
ータ伸長方式では、辞書を木構造により表現して文字列
を読み出していたために、各節をポインタによるリンク
を辿りながら1文字づつ読み出し、また、読み出した文
字列をメモリに一度スタックすることにより文字列の順
序を反転させてから出力しなければならなかった。この
ような過程を実行するために、伸長速度が高速にならな
いという問題点があった。このことは、リアルタイムで
データ伸長処理を行わなければならないシステムに対し
て従来の伸長方式を搭載することは困難であることを示
している。
【0012】本発明では、このような問題点に対し、LZ
W 圧縮方式のように入力データを相異なる文字列に分解
し、各文字列にインデックスを付与して辞書に登録し、
その辞書を参照することにより入力文字列と最長一致す
る辞書のエントリを検索し、そのエントリのインデック
スを符号化することにより、長い文字列を短いインデッ
クスに変換することによりデータ圧縮を行うデータ圧縮
方式により圧縮されたデータを高速に伸長できるデータ
伸長方式を提供することを目的とする。
W 圧縮方式のように入力データを相異なる文字列に分解
し、各文字列にインデックスを付与して辞書に登録し、
その辞書を参照することにより入力文字列と最長一致す
る辞書のエントリを検索し、そのエントリのインデック
スを符号化することにより、長い文字列を短いインデッ
クスに変換することによりデータ圧縮を行うデータ圧縮
方式により圧縮されたデータを高速に伸長できるデータ
伸長方式を提供することを目的とする。
【0013】
【課題を解決するための手段】本発明は、これらの課題
を解決するためのものであり、入力データ列を互いに相
異なる文字列に分解し、その文字列及びその文字列を他
の文字列から一意的に識別できるインデックスがエント
リ登録された辞書を参照し、前記辞書にもとづいて符号
化するデータとの最長一致文字列を検索し、前記最長一
致文字列に対応するインデックスを用いて符号化するデ
ータ圧縮方式によって圧縮されたデータを伸長するため
のデータ伸長方式において、前記圧縮されたデータを入
力するための入力部と、伸長データを記憶するためのメ
モリと、伸張データを検索するためのインデックス及び
前記インデックスによって識別された文字列が記憶され
ているメモリアドレス及び前記インデックスによって識
別された文字列の長さが登録されている表とから構成さ
れ、前記表によって前記メモリアドレス及び文字列の長
さに変換し、前記表で指定されたメモリアドレスと文字
列の長さに従って前記メモリから文字列を読み出すこと
によって、伸長データを得るデータ伸長方式を提供す
る。
を解決するためのものであり、入力データ列を互いに相
異なる文字列に分解し、その文字列及びその文字列を他
の文字列から一意的に識別できるインデックスがエント
リ登録された辞書を参照し、前記辞書にもとづいて符号
化するデータとの最長一致文字列を検索し、前記最長一
致文字列に対応するインデックスを用いて符号化するデ
ータ圧縮方式によって圧縮されたデータを伸長するため
のデータ伸長方式において、前記圧縮されたデータを入
力するための入力部と、伸長データを記憶するためのメ
モリと、伸張データを検索するためのインデックス及び
前記インデックスによって識別された文字列が記憶され
ているメモリアドレス及び前記インデックスによって識
別された文字列の長さが登録されている表とから構成さ
れ、前記表によって前記メモリアドレス及び文字列の長
さに変換し、前記表で指定されたメモリアドレスと文字
列の長さに従って前記メモリから文字列を読み出すこと
によって、伸長データを得るデータ伸長方式を提供す
る。
【0014】
【作用】本発明のデータ伸長方式によれば、表により変
換されたメモリアドレスと文字列の長さに基づいて、メ
モリから文字列を読み出し、また、その文字列をメモリ
上の所定の書き込み位置に書き込むことにより伸長処理
が行われるので、伸長処理速度が高速になる。すなわ
ち、従来のデータ伸長方式の木構造に基づく伸長処理で
は、木構造で表される辞書用のメモリから読み出した文
字列をスタックするためのメモリに書き込み、そこから
ポップアップして文字列を反転させてから読み出し、最
終的に伸長データ用のメモリに書き込むため、本発明の
データ伸長方式に比べて、スタック用メモリのアクセス
を行うため処理量が大きくなる。
換されたメモリアドレスと文字列の長さに基づいて、メ
モリから文字列を読み出し、また、その文字列をメモリ
上の所定の書き込み位置に書き込むことにより伸長処理
が行われるので、伸長処理速度が高速になる。すなわ
ち、従来のデータ伸長方式の木構造に基づく伸長処理で
は、木構造で表される辞書用のメモリから読み出した文
字列をスタックするためのメモリに書き込み、そこから
ポップアップして文字列を反転させてから読み出し、最
終的に伸長データ用のメモリに書き込むため、本発明の
データ伸長方式に比べて、スタック用メモリのアクセス
を行うため処理量が大きくなる。
【0015】
【実施例】以下に図面を用いて本発明の実施例を説明す
る。なお、以下の実施例においては1文字は8bitで
表されるものとし、各文字の値を16進数で0からff
とする。また、インデックスの値も特に断りがないとき
は16進数で表されているものとする。図1は本発明の
構成例を示す図である。入力部101は圧縮されたデー
タを入力し、符号化されたインデックスの値を復号化
し、インデックスidを得る。そして、インデックスi
dの値をもとに表102を参照する。表102はインデ
ックス(ID)、メモリアドレス(MA)、文字列の長
さ(LEN)、の3つの欄により一つのエントリが構成
されていて、それぞれ辞書のインデックス、インデック
スが示す文字列の伸長データメモリ上のメモリアドレ
ス、インデックスが示す文字列の長さを示している。表
102には初期値として、0からffまでのインデック
スを持つエントリが登録されている。そのインデックス
値は辞書に初期登録される1文字のデータ、0からf
f、を表している。そして、インデックス0からffま
でのエントリのMAの欄は空欄で、LENの欄は全て1
である。伸長データメモリ103は復号された伸長デー
タを記憶しておくためのメモリである。これらの動作の
概略を説明する。入力部101により得られたインデッ
クスidをもとに表102を参照すると、そのインデッ
クスidからメモリアドレスP(id)と文字列の長さ
L(id)が得られる。もともとLZW 圧縮方式では符号
化済のデータを相異なる文字列に分解したときの、それ
ぞれの文字列にインデックスを付与しているので、逆に
復号時にはインデックスに対応する文字列が復号化済の
データ中に存在していることになる。そこで、各々のイ
ンデックスを復号化済のデータが記憶されている伸長デ
ータメモリ上のメモリアドレスと文字列の長さに変換す
ることにより、容易に伸長データを取り出すことができ
るようになる。そして、読み出された伸長データを伸長
データメモリ上の伸長データ書き込み位置dptにコピ
ーすることによりデータが伸長される。図1では、イン
デックス0からlstまでのエントリが登録されている
とき、インデックスidが得られた場合について示して
ある。このとき、伸長データメモリのメモリアドレスP
(id)から文字列の長さL(id)文字のデータが書
き込み位置dptにコピーされている。データ伸長処理
により文字列のコピーが終了したら、表の更新を行う。
表の更新は新たにインデックスnxtのエントリを追加
することでなされる。ここで、インデックスnxtの値
はlst+1である。インデックスnxtが示す文字列
は今コピーした文字列に次に復号される文字列の先頭の
1文字を繋げたものなので、メモリアドレスP(nx
t)は文字列のコピー先である書き込み位置dptであ
り、文字列の長さL(nxt)は今コピーした文字列の
長さL(id)に1を加えたものになる。そして、次回
の伸長処理のためにdptは点線の四角で表される位置
dpt+L(id)に移される。以上で説明した処理の
概略をさらに詳しく説明するために、図2に示すフロー
チャートを用いて処理の流れを説明する。処理が開始さ
れると、最初に表102が初期化され、伸長データメモ
リのデータ書き込み位置を示すポインタdpt(本実施
例では伸長データメモリの先頭位置からのオフセットで
表す)の値が0に初期化される(201)。この初期化
の方法については前述した通りである。次に、次回に登
録するエントリのインデックスnxtを100に初期化
する(202)。次に、圧縮データから入力部101に
より得られたインデックスidが入力される(20
3)。そして、インデックスidの値が100より小さ
いか否かを比較して、その結果により処理が分岐する
(204)。すなわち、インデックスidが100未満
のときは、インデックスidが示す文字列は初期登録さ
れた長さ1の文字であり、しかもその文字の値はidと
同じなので、ポインタdptの指すメモリ上の値(*d
ptと表す)にインデックスidの値を代入する(20
6)。また、インデックスidが100以上のときは長
さ2以上の文字列を示す。このときは、インデックスi
dが示すメモリアドレスP(id)から文字列の長さL
(id)文字の文字列を、ポインタdptの位置にコピ
ーする(205)。このとき、文字列のコピーは先頭か
ら1文字ずつ行うようにする。つまり、 *dpt = *P( id) *(dpt+1) = *(P(id) +1) *(dpt+2) = *(P(id) +2) ・ ・ ・ ・ ・ ・ *(dpt+L(id)) = *(P(id) +L(id)) のように文字列がコピーされていく。このようにする
と、木による伸長処理で図5(d)で説明したような条
件分岐処理は必要なくなる。図5(d)の条件分岐は1
番最近に辞書に登録したエントリ(インデックスlst
で表されるものとする)の文字列の最後尾の文字が未確
定であることに由来している。そのため、木による文字
列の探索は図6(a)で示したように文字列の最後尾か
ら先頭の方向へ向かって行われるために、インデックス
lstが入力されたときは、まず未確定文字を確定させ
なければならないので、条件分岐処理が必要となる。そ
れに対して、表による探索ではインデックスlstが入
力された場合、その最後尾の文字は伸長データメモリの
*dptであるから、先頭の1文字目をコピーした時
点、すなわち、 *dpt = *P(lst) となった時点で、*dptの値が確定することから、イ
ンデックスlstの示す未確定文字が確定することにな
る。よって、残りの文字、*(P(lst)+1)から
*(P(lst)+L(lst))、も順次コピーする
ことができる。
る。なお、以下の実施例においては1文字は8bitで
表されるものとし、各文字の値を16進数で0からff
とする。また、インデックスの値も特に断りがないとき
は16進数で表されているものとする。図1は本発明の
構成例を示す図である。入力部101は圧縮されたデー
タを入力し、符号化されたインデックスの値を復号化
し、インデックスidを得る。そして、インデックスi
dの値をもとに表102を参照する。表102はインデ
ックス(ID)、メモリアドレス(MA)、文字列の長
さ(LEN)、の3つの欄により一つのエントリが構成
されていて、それぞれ辞書のインデックス、インデック
スが示す文字列の伸長データメモリ上のメモリアドレ
ス、インデックスが示す文字列の長さを示している。表
102には初期値として、0からffまでのインデック
スを持つエントリが登録されている。そのインデックス
値は辞書に初期登録される1文字のデータ、0からf
f、を表している。そして、インデックス0からffま
でのエントリのMAの欄は空欄で、LENの欄は全て1
である。伸長データメモリ103は復号された伸長デー
タを記憶しておくためのメモリである。これらの動作の
概略を説明する。入力部101により得られたインデッ
クスidをもとに表102を参照すると、そのインデッ
クスidからメモリアドレスP(id)と文字列の長さ
L(id)が得られる。もともとLZW 圧縮方式では符号
化済のデータを相異なる文字列に分解したときの、それ
ぞれの文字列にインデックスを付与しているので、逆に
復号時にはインデックスに対応する文字列が復号化済の
データ中に存在していることになる。そこで、各々のイ
ンデックスを復号化済のデータが記憶されている伸長デ
ータメモリ上のメモリアドレスと文字列の長さに変換す
ることにより、容易に伸長データを取り出すことができ
るようになる。そして、読み出された伸長データを伸長
データメモリ上の伸長データ書き込み位置dptにコピ
ーすることによりデータが伸長される。図1では、イン
デックス0からlstまでのエントリが登録されている
とき、インデックスidが得られた場合について示して
ある。このとき、伸長データメモリのメモリアドレスP
(id)から文字列の長さL(id)文字のデータが書
き込み位置dptにコピーされている。データ伸長処理
により文字列のコピーが終了したら、表の更新を行う。
表の更新は新たにインデックスnxtのエントリを追加
することでなされる。ここで、インデックスnxtの値
はlst+1である。インデックスnxtが示す文字列
は今コピーした文字列に次に復号される文字列の先頭の
1文字を繋げたものなので、メモリアドレスP(nx
t)は文字列のコピー先である書き込み位置dptであ
り、文字列の長さL(nxt)は今コピーした文字列の
長さL(id)に1を加えたものになる。そして、次回
の伸長処理のためにdptは点線の四角で表される位置
dpt+L(id)に移される。以上で説明した処理の
概略をさらに詳しく説明するために、図2に示すフロー
チャートを用いて処理の流れを説明する。処理が開始さ
れると、最初に表102が初期化され、伸長データメモ
リのデータ書き込み位置を示すポインタdpt(本実施
例では伸長データメモリの先頭位置からのオフセットで
表す)の値が0に初期化される(201)。この初期化
の方法については前述した通りである。次に、次回に登
録するエントリのインデックスnxtを100に初期化
する(202)。次に、圧縮データから入力部101に
より得られたインデックスidが入力される(20
3)。そして、インデックスidの値が100より小さ
いか否かを比較して、その結果により処理が分岐する
(204)。すなわち、インデックスidが100未満
のときは、インデックスidが示す文字列は初期登録さ
れた長さ1の文字であり、しかもその文字の値はidと
同じなので、ポインタdptの指すメモリ上の値(*d
ptと表す)にインデックスidの値を代入する(20
6)。また、インデックスidが100以上のときは長
さ2以上の文字列を示す。このときは、インデックスi
dが示すメモリアドレスP(id)から文字列の長さL
(id)文字の文字列を、ポインタdptの位置にコピ
ーする(205)。このとき、文字列のコピーは先頭か
ら1文字ずつ行うようにする。つまり、 *dpt = *P( id) *(dpt+1) = *(P(id) +1) *(dpt+2) = *(P(id) +2) ・ ・ ・ ・ ・ ・ *(dpt+L(id)) = *(P(id) +L(id)) のように文字列がコピーされていく。このようにする
と、木による伸長処理で図5(d)で説明したような条
件分岐処理は必要なくなる。図5(d)の条件分岐は1
番最近に辞書に登録したエントリ(インデックスlst
で表されるものとする)の文字列の最後尾の文字が未確
定であることに由来している。そのため、木による文字
列の探索は図6(a)で示したように文字列の最後尾か
ら先頭の方向へ向かって行われるために、インデックス
lstが入力されたときは、まず未確定文字を確定させ
なければならないので、条件分岐処理が必要となる。そ
れに対して、表による探索ではインデックスlstが入
力された場合、その最後尾の文字は伸長データメモリの
*dptであるから、先頭の1文字目をコピーした時
点、すなわち、 *dpt = *P(lst) となった時点で、*dptの値が確定することから、イ
ンデックスlstの示す未確定文字が確定することにな
る。よって、残りの文字、*(P(lst)+1)から
*(P(lst)+L(lst))、も順次コピーする
ことができる。
【0016】次に、表のエントリ数が最大になったか否
かをする(s207)。
かをする(s207)。
【0017】エントリ数が最大のときは202に戻り、
インデックスnxtの値を100に初期化してから再び
伸長処理を進める。エントリ数が最大でなければ、表1
02に新たにエントリを登録する(208)。新たに登
録される文字列は、205でコピーしたインデックスi
dで示される文字列に未確定の文字を1文字加えたもの
である。よって、メモリアドレスP(nxt)は文字列
がコピーされたポインタdptの値を書き込み、文字列
の長さL(nxt)はコピーした文字列の長さL(i
d)に1を加えた値が書き込まれる。最後に、伸長デー
タの書き込み位置を示すポインタdptの値をdpt+
L(id)に更新し、次に登録するエントリのインデッ
クスnxtを1つインクリメントする(209)。そし
て、再び203に戻り、次のインデックスを入力して伸
長処理を圧縮符号がなくなるまで継続する。
インデックスnxtの値を100に初期化してから再び
伸長処理を進める。エントリ数が最大でなければ、表1
02に新たにエントリを登録する(208)。新たに登
録される文字列は、205でコピーしたインデックスi
dで示される文字列に未確定の文字を1文字加えたもの
である。よって、メモリアドレスP(nxt)は文字列
がコピーされたポインタdptの値を書き込み、文字列
の長さL(nxt)はコピーした文字列の長さL(i
d)に1を加えた値が書き込まれる。最後に、伸長デー
タの書き込み位置を示すポインタdptの値をdpt+
L(id)に更新し、次に登録するエントリのインデッ
クスnxtを1つインクリメントする(209)。そし
て、再び203に戻り、次のインデックスを入力して伸
長処理を圧縮符号がなくなるまで継続する。
【0018】
【効果】以上で説明したように、本発明によれば、辞書
のインデックスを伸長データメモリ上のメモリアドレス
と文字列の長さに変換する表を作成し、その表に従って
入力されたインデックスから伸長データメモリ上の指定
された文字列を伸長データ書き込み位置にコピーするこ
とによりデータ伸長を行うので、従来の木によるデータ
伸長処理に比べて文字列の反転処理や条件分岐処理が削
減されるので、データ伸長処理が簡単化され高速化され
る。
のインデックスを伸長データメモリ上のメモリアドレス
と文字列の長さに変換する表を作成し、その表に従って
入力されたインデックスから伸長データメモリ上の指定
された文字列を伸長データ書き込み位置にコピーするこ
とによりデータ伸長を行うので、従来の木によるデータ
伸長処理に比べて文字列の反転処理や条件分岐処理が削
減されるので、データ伸長処理が簡単化され高速化され
る。
【図1】 本発明の構成図。
【図2】 本発明の伸長処理の流れ図。
【図3】 LZW 符号化・復号化処理の流れ図。
【図4】 LZW 符号化処理の具体例を説明するための
図。
図。
【図5】 LZW 復号化処理の具体例を説明するための
図。
図。
【図6】 木による伸長処理を説明するための図。
101 入力部 102 表 103 伸長データメモリ
Claims (1)
- 【請求項1】 入力データ列を互いに相異なる文字列に
分解し、その文字列及びその文字列を他の文字列から一
意的に識別できるインデックスがエントリ登録された辞
書を参照し、前記辞書にもとづいて符号化するデータと
の最長一致文字列を検索し、前記最長一致文字列に対応
するインデックスを用いて符号化するデータ圧縮方式に
よって圧縮されたデータを伸長するためのデータ伸長方
式において、前記圧縮されたデータを入力するための入
力部と、伸長データを記憶するためのメモリと、伸張デ
ータを検索するためのインデックス及び前記インデック
スによって識別された文字列が記憶されているメモリア
ドレス及び前記インデックスによって識別された文字列
の長さが登録されている表とから構成され、前記表によ
って前記メモリアドレス及び文字列の長さに変換し、前
記表で指定されたメモリアドレスと文字列の長さに従っ
て前記メモリから文字列を読み出すことによって伸長デ
ータを得ることを特徴としたデータ伸長方式。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP29643194A JP3236747B2 (ja) | 1994-11-30 | 1994-11-30 | データ伸長方式 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP29643194A JP3236747B2 (ja) | 1994-11-30 | 1994-11-30 | データ伸長方式 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH08162974A JPH08162974A (ja) | 1996-06-21 |
JP3236747B2 true JP3236747B2 (ja) | 2001-12-10 |
Family
ID=17833455
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP29643194A Expired - Fee Related JP3236747B2 (ja) | 1994-11-30 | 1994-11-30 | データ伸長方式 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3236747B2 (ja) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP5523144B2 (ja) * | 2010-02-25 | 2014-06-18 | キヤノン株式会社 | 情報処理装置及びその制御方法及びプログラム及び記憶媒体 |
-
1994
- 1994-11-30 JP JP29643194A patent/JP3236747B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JPH08162974A (ja) | 1996-06-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3273119B2 (ja) | データ圧縮・伸長装置 | |
US5870036A (en) | Adaptive multiple dictionary data compression | |
US8838551B2 (en) | Multi-level database compression | |
KR100527891B1 (ko) | 허프만 디코딩을 수행하는 방법 | |
KR970059917A (ko) | 데이타압축, 신장방법 및 장치와 이것을 사용한 데이타처리장치 및 네트워크시스템 | |
US5815096A (en) | Method for compressing sequential data into compression symbols using double-indirect indexing into a dictionary data structure | |
US7379940B1 (en) | Focal point compression method and apparatus | |
JP4156381B2 (ja) | 文字テーブルによって実施されるデータ圧縮の方法および装置 | |
JP3236747B2 (ja) | データ伸長方式 | |
US8244677B2 (en) | Focal point compression method and apparatus | |
Ghuge | Map and Trie based Compression Algorithm for Data Transmission | |
JPH0546357A (ja) | テキストデータの圧縮方法および復元方法 | |
JPH0546358A (ja) | テキストデータの圧縮方法 | |
JPH07135471A (ja) | データ圧縮装置およびデータ伸張装置 | |
JP3038233B2 (ja) | データ圧縮及び復元装置 | |
JP3053656B2 (ja) | データ圧縮における辞書登録方式 | |
JP2774350B2 (ja) | データ圧縮方法および圧縮データのデータ復元方法 | |
JP3038234B2 (ja) | データ圧縮装置の辞書検索方式 | |
JPH05241776A (ja) | データ圧縮方式 | |
JPH05152971A (ja) | データ圧縮・復元方法 | |
JP3384844B2 (ja) | データ圧縮方法および装置並びにデータ復元方法および装置 | |
JP3115066B2 (ja) | 辞書検索方法 | |
JP3202488B2 (ja) | データ符号化及び復号化方式 | |
JP3103172B2 (ja) | 辞書検索方法 | |
JPH04167821A (ja) | データ符号化及び復号化方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20070928 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20080928 Year of fee payment: 7 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090928 Year of fee payment: 8 |
|
LAPS | Cancellation because of no payment of annual fees |