(57)【要約】【課題】本発明は、ハッシュテーブルに過去に登録されたハッシュ値を持つバケット・チェーンの各エントリの検索において一致する最大文字列が見つからない場合におけるデータ圧縮に伴うパフォーマンスを改善すること、及び、ハッシュ衝突を減少させることを目的とする。【解決手段】本発明は、文字列の選択された部分にハッシュ関数を適用してハッシュ値を計算し、当該ハッシュ値を用いて、上記バケット・チェーンの各エントリを検索して、一致する文字列の最大長を見つけることによりデータ圧縮をする技法であり、当該技法は、上記各エントリの検索において一致する最大文字列が見つからず、当該検索が無駄になったことを示す指標を取得すること、及び、当該指標が所定の閾値を超えたときに、当該ハッシュテーブルを再構築することなしに、当該ハッシュ関数を、当該文字列の選択された部分を広げる別のハッシュ関数に切り替えることを含む。【選択図】図５
2015186077.tif 000002
【特許請求の範囲】
【請求項１】
文字列の選択された部分にハッシュ関数を適用してハッシュ値を計算し、当該ハッシュ値を用いて、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリを検索して、一致する文字列の最大長を見つけることによりデータ圧縮をする方法であって、コンピュータが、
前記各エントリの検索において一致する最大文字列が見つからず、当該検索が無駄になったことを示す指標を取得するステップと、
前記指標が所定の閾値を超えたときに、前記ハッシュテーブルを再構築することなしに、前記ハッシュ関数を、前記文字列の選択された部分を広げる別のハッシュ関数に切り替えるステップと
を実行することを含む、前記方法。
【請求項２】
前記コンピュータが、
所定のタイミングで、前記別のハッシュ関数を、元のハッシュ関数に戻すステップ
をさらに実行することを含む、請求項１に記載の方法。
【請求項３】
前記別のハッシュ関数を前記元のハッシュ関数に戻すステップが、
前記ハッシュテーブルがクリアされるときに、又は、所定の長さの文字列が処理されるごとに行われる、
請求項２に記載の方法。
【請求項４】
前記指標が、前記ハッシュ値を持つ前記バケット・チェーンのエントリの最大長において、又は、前記ハッシュ値を持つ前記バケット・チェーンのエントリの検索上限において、検索中の文字列のエントリが見つからなかったときの検索に要した時間である、請求項１〜３のいずれか一項に記載の方法。
【請求項５】
前記指標が、前記ハッシュ値を持つ前記バケット・チェーンのエントリの最大長まで、又は、前記ハッシュ値を持つ前記バケット・チェーンのエントリの検索上限まで検索しても検索中の文字列のエントリが見つからなかった頻度である、請求項１〜３のいずれか一項に記載の方法。
【請求項６】
文字列の選択された部分にハッシュ関数を適用してハッシュ値を計算し、当該ハッシュ値を用いて、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリを検索して、一致する文字列の最大長を見つけることによりデータ圧縮をするためのコンピュータであって、
前記各エントリの検索において一致する最大文字列が見つからず、当該検索が無駄になったことを示す指標を取得する指標取得手段と、
前記指標が所定の閾値を超えたときに、前記ハッシュテーブルを再構築することなしに、前記ハッシュ関数を、前記文字列の選択された部分を広げる別のハッシュ関数に切り替えるハッシュ関数切り替え手段と
を備えている、前記コンピュータ。
【請求項７】
所定のタイミングで、前記別のハッシュ関数を、元のハッシュ関数に戻す回復手段
をさらに備えている、請求項６に記載のコンピュータ。
【請求項８】
前記回復手段が、前記別のハッシュ関数を元のハッシュ関数に戻すことを、
前記ハッシュテーブルがクリアされるときに、又は、所定の長さの文字列を処理するごとに行う、請求項７に記載のコンピュータ。
【請求項９】
前記指標が、前記ハッシュ値を持つ前記バケット・チェーンのエントリの最大長において、又は、前記ハッシュ値を持つ前記バケット・チェーンのエントリの検索上限において、検索中の文字列のエントリが見つからなかったときの検索に要した時間である、請求項６〜８のいずれか一項に記載のコンピュータ。
【請求項１０】
前記指標が、前記ハッシュ値を持つ前記バケット・チェーンのエントリの最大長まで、又は、前記ハッシュ値を持つ前記バケット・チェーンのエントリの検索上限まで検索しても検索中の文字列のエントリが見つからなかった頻度である、請求項６〜８のいずれか一項に記載のコンピュータ。
【請求項１１】
文字列の選択された部分にハッシュ関数を適用してハッシュ値を計算し、当該ハッシュ値を用いて、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリを検索して、一致する文字列の最大長を見つけることによりデータ圧縮をするためのコンピュータ・プログラムであて、コンピュータに、請求項１〜５のいずれか一項に記載の方法の各ステップを実行させる、前記コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ圧縮の高速化の技術に関する。特には、本発明は、文字列の選択された部分にハッシュ関数を適用してハッシュ値を計算し、当該ハッシュ値を用いて、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリを検索して、一致する文字列の最大長を見つけることによりデータ圧縮をするための技術に関する。
【背景技術】
【０００２】
ファイルを圧縮する場合に、例えば、ｚｉｐ、ＬＨＡ、ｇｚｉｐ、ｂｚｉｐ２、又はＬＺＭＡ（Lempel-Ziv-Markov chain-Algorithm）が使用されている。
【０００３】
ｂｚｉｐ２は、ブロック・ソート（Blocking Sorting）という手法を用いて高い圧縮率を達成する。これに対して、ｚｉｐ、ＬＨＡ、ｇｚｉｐは、ＬＺ７７符号とハフマン符号を組み合わせた手法である。ＬＺ７７符号は、辞書に基づく符号化方式（dictionary-based coding，辞書法）の一つであり、入力された文字列（記号列でもある）を辞書に登録し、その辞書を使って符号化を行う手法である。
【０００４】
辞書に基づく符号化方式として、静的辞書法（static dictionary method）と、適応型辞書法（adaptive dictionary method，動的辞書法ともいう）とがある。
【０００５】
静的辞書法では、符号化に先立って、辞書を編集しておいて、その辞書に基づいて符号化を行う。この静的辞書法では、符号化と復号において同じ辞書を用意しなければならない為に、復号するための辞書をファイルに添付する方法では、圧縮率の大幅な低下は避けられない。
【０００６】
一方、適応型辞書法は、前もって辞書を用意せずに、ファイル（入力ストリーム）を読み込みながら辞書を作成し、そして当該辞書に登録されている文字列が現れることに応じて、当該文字列を辞書の位置情報に変換することで圧縮を行う。この適応型辞書法では、最初は辞書が空の状態なので文字列を圧縮することはできないが、ファイルを読み込むに従って十分な文字列が辞書に登録される為に、当該ファイルの高い圧縮率を実現できる。
【０００７】
適応型辞書法として例えば、ＲＬＥ、ＢＰＥ、Ｄｅｆｌａｔｅ、及びＬＺ符号（Ziv-Lempel符号）が知られている。ＬＺ符号として例えば、ＬＺ７７、ＬＺ７８、ＬＺＳＳ、ＬＺＷ、ＬＺＭＬ、ＬＺＯ、ＬＺＭＡ、ＬＺＸ、ＬＺＲＷ、ＬＺＪＢ、ＬＺＴ及びＲＯＬＺが知られている。
【０００８】
上記適応型辞書法のうち、最も有名な手法がＬＺ符号である。ＬＺ符号は、ＬＺ７７符号（１９７７年に開発）とＬＺ７８符号（１９７８年に開発）とに大別される。ＬＺ７７符号とＬＺ７８符号とでは辞書の作成方法が異なっている。ＬＺ７７符号ではスライド辞書法に従い辞書が作成され、ＬＺ７８符号では動的辞書法に従い辞書が作成される。
【０００９】
ＬＺ７７符号には、沢山のバリエーションが存在する。その中で基本的に広く用いられている符号がＬＺＳＳ符号である。
【００１０】
ＬＺＳＳ符号では、スライド・ウィンドウ（sliding window）及び最長一致法が使用される。ＬＺＳＳ符号をプログラムする場合に、スライド・ウィンドウの参照部から最長一致系列を探す処理が行われる。当該最長一致系列を探す処理において、ハッシュ法が用いられる。すなわち、ＬＺＳＳ圧縮の際の最長一致系列探索に要する時間を短縮する為に、ハッシュテーブルが用いられる。そして、ハッシュテーブルに文字列を登録することは、ハッシュ関数を用いて入力文字列の先頭から所定の文字数分の文字列でハッシュ値を求め、当該入力文字列（正確に言えば、当該文字列へのポインタ）をハッシュテーブルに登録することによって行われる。従って、ＬＺＳＳ符号では、入力文字列をスライドさせながら、それぞれのハッシュ値を計算して辞書を作成し、また同時に当該辞書に登録された過去の文字列と一致する最長一致系列を探していく。
【００１１】
ファイル圧縮においては、高い圧縮率、圧縮速度、及び復号速度の向上、並びに、メモリ要求の改善を目指して種々の方法が検討されている。
【００１２】
下記特許文献１は、辞書検索に外部ハッシュ法のリスト構造を利用したＬＺＷ符号化の処理を記載する（請求項１）。
【００１３】
下記特許文献２は、ハッシュ関数の選択方法を記載する（要約）。
【００１４】
下記特許文献３は、複数のハッシュ値算出手段から一つを選択する式選択手段を記載する（要約）。
【００１５】
下記特許文献４は、データのファイルサイズの縮小と検索ノイズの低減化とを図ることを記載する（要約）。
【００１６】
下記特許文献５は、複数文字からなる検索文字列を，ハッシュ関数発生手段に入力し，発生するハッシュ値を用いて，上記全文インデックスに格納された対応する文字の出現位置情報を検出し，検出された各文字の出現位置情報が，相対的に検索文字列の配置順に該当するか否かを判別することにより，検索を行うことを記載する（要約）。
【００１７】
下記特許文献６は、データハッシュ化及び／またはデータ冗長性除去のような用途のための、効率的な処理に関する方法及びシステムを記載する（段落０００１）。
【００１８】
下記特許文献７は、検索性能の高速化を図ると共に総インデクスサイズの増加を最小限に抑えることが可能な技術を記載する（要約）。
【００１９】
下記非特許文献１は、ハッシュ化及び接尾辞ソートによるＬＺ７７圧縮の速度を改善する旨を記載する（ＳＵＭＭＡＲＹ）。
【先行技術文献】
【特許文献】
【００２０】
【特許文献１】特開平６−８３５７３号公報
【特許文献２】特開２００９−２９６１３１号公報
【特許文献３】特開平１１−８５７７１号公報
【特許文献４】特開２０１１−１３８２３０号公報
【特許文献５】特開平５−６１９１０号公報
【特許文献６】特表２０１０−５１５１１４号公報
【特許文献７】特開２０００−５７１５１号公報
【非特許文献】
【００２１】
【非特許文献１】Kunihiko Sadakane et. al., “Improving the Speed of LZ77 Compression by Hashing and Suffix Sorting”, IEICE transactions on fundamentals of electronics, communications and computer sciences, E83-A, No. 12, pages 2689 - 2698, 2000年12月＜http://ci.nii.ac.jp/naid/110003208520＞から入手可能
【発明の概要】
【発明が解決しようとする課題】
【００２２】
以下に、本発明の理解を容易にするために、辞書に基づく符号化方式においてデータを圧縮する為の基本的な処理を説明する。
【００２３】
辞書に基づく符号化方式では、記号を可変長の符号語に変換するのではなく、いわゆる語（word）又は節（phrase）と呼ばれる可変長の文字列を固定長又は可変長の符号語に変換する。
【００２４】
適応型辞書法では、辞書を前もって編集せずに、圧縮する文字列を読み込みながら、コンピュータは、当該文字列にハッシュ値を更新する関数を適用して計算されたハッシュ値に基づき、文字列を辞書に順次登録していく。
【００２５】
適応型辞書法のうちのＬＺ７７符号では、スライド・ウィンドウを利用する。コンピュータは、ＬＺ７７符号では、所定の数の語を保存するバッファを用意し、このバッファを利用することで符号化を行う。バッファの大きさは有限であるので、新しく記号を読み込んだ分だけ、古い文字列を捨てて行かなければならない。この動作は、符号化が進むにつれて、当該バッファに保存されている文字列が与えられた文字列全体の中をスライドしていくように見えることから、当該バッファはスライド・ウィンドウとも呼ばれている。
【００２６】
スライド・ウィンドウは、参照部（例えば、１６の大きさ）と符号化部（例えば、４の大きさ）とからなる。符号化部分が圧縮対象となる文字列である。例えば、ＬＺ７７符号のうちのＬＺＳＳ符号では、参照部の中から符号化部と最も長く一致する文字列（最長一致系列とも呼ばれる）を探して、その位置情報と長さで符号化を行う。例えば、スライド・ウィンドウの参照部が８１９２であり且つ符号化部が１６であるとすると、位置情報が１３ビット、長さの情報が４ビットとなる。従って、合計１７ビットで符号語を表すことができる。しかしながら、この場合には、２文字以下の文字列は圧縮できず、３文字以上の文字列に対してのみ符号化を行うことができる。
【００２７】
符号化における辞書の参照は、現在符号化の対象となっている位置から始まる文字列と一致し、スライド・ウィンドウ中の文字列で最も長いもの（最長一致系列と呼ばれる）を探索することにより行われる。
【００２８】
最長一致系列の探索において、参照部から最長一致系列を探す処理が重要である。例えば、スライド・ウィンドウのサイズがＮであり、符号化部のサイズがＦであるとすると、最悪、Ｎ×Ｆ回の比較が必要になる。そこで、当該比較の回数を減らす為に、ハッシュ法が用いられる。
【００２９】
ハッシュ法では、ハッシュテーブルと呼ばれるデータを格納する配列と、データを数値に変換する為のハッシュ関数とが使用される。例えば、ハッシュテーブルの大きさがＮである場合に、ハッシュ関数がデータを０〜Ｎ−１までの整数値に変換する。当該整数値がハッシュ値である。ハッシュ値は、ハッシュテーブルの添字に対応し、この位置にデータが格納される。
【００３０】
ハッシュ法において不特定多数のデータを扱う場合に、異なるデータでも同じハッシュ値が生成される場合がある。同じハッシュ値が生成されることが、ハッシュ値の衝突である。ハッシュ値の衝突が起こる場合には、ハッシュテーブルにデータを登録することができない。そこで、このハッシュ値の衝突の問題を解決する為に例えば、オープン・アドレス法、又はチェーン法が採用される。
【００３１】
オープン・アドレス法では、コンピュータは、別のハッシュ関数を用意し、文字列に当該別のハッシュ関数を適用して新しいハッシュ値を計算する。そして、コンピュータは、ハッシュテーブルの空いている場所が見つかるまで、別のハッシュ関数を用意すること及び上記新しいハッシュ値を計算することを繰り返し、そして、空いている場所が見つかった場合に、その場所にデータを入れる。
【００３２】
一方、チェーン法では、コンピュータは、ハッシュテーブルに複数のデータを格納する。しかしながら、チェーン法におけるハッシュテーブルの配列には一つのデータしか格納できない。そこで、コンピュータは、データ構造として連結リストを用意する。従って、コンピュータは、ハッシュテーブルからデータを検索する場合に、最初にハッシュ値を算出し、次に当該算出したハッシュ値と同じハッシュ値を持つエントリの連結リスト（バケット・チェーンとも呼ばれる）の中からデータを探す。当該バケット・チェーンは、同じハッシュ値を持つことにより衝突を起こした文字列を、当該バケット・チェーンの先頭から順番に格納したものである。但し、ハッシュ値の衝突が頻繁に生じる場合には、データを格納する為の連結リストが長くなる為に、最長一致系列の探索に余分な時間がかかってしまう。従って、チェーン法において、効率的な探索を行う為に、衝突をあまり生じさせないような適切なハッシュ関数の選択が重要である。
【００３３】
この最長一致系列の探索を効率的に実行する為に、非常に軽量のハッシュ関数が用いられている。
【００３４】
上記に述べた通り、データ圧縮アルゴリズム、例えばハッシュテーブルとして辞書を適用可能なデータ圧縮アルゴリズムでは、入力データ（入力ストリームともいう）中の現在のデータとハッシュテーブル（辞書）に保存されたデータとの間で一致する文字列の最長一致系列を探索する。
【００３５】
図２は、従来手法に従い、文字列の選択された部分にハッシュ値を更新する関数を適用してハッシュ値を計算し、当該ハッシュ値を用いて、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリを検索し、一致する文字列の最大長を見つける処理を説明するためのダイアグラムを示す。
【００３６】
入力ストリーム（２０１）はデータ圧縮対象のファイルであり、文字列を含む。コンピュータは、当該入力ストリーム（２０１）から、所定の固定長バイトの文字列をバッファ（すなわち、スライド・ウィンドウ）（２１１）に読み込む。コンピュータは、下記に述べるハッシュ関数が適用されるデータとして、現在、文字列「ｉ」の位置（現在の位置、２２１）を開始位置とする所定の固定長バイト（図２に示す例の場合、３バイト）の文字列（２２２）「ｉ，ｉ+１，ｉ+２」を使用するとする。
【００３７】
コンピュータは、上記文字列（２２２）にハッシュ値を更新する関数（２４１）を適用して、ハッシュ値ｈを算出する（２９１）。コンピュータは、当該算出されたハッシュ値ｈを用いて、当該ハッシュ値ｈが辞書（２５１）に登録されているか調べる（２９２）。コンピュータは、当該ハッシュ値ｈを辞書（２５１）に新たに登録し、更に、当該ハッシュ値ｈが辞書（２５１）にすでに登録されている場合には、当該ハッシュ値ｈを持つバケット・チェーン（２５１ａ）の各エントリ（２６１，２６２，２６３，・・・）を検索して、現在の位置（２２１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（２９３）。
【００３８】
図２に示す上記例の場合、上記算出したハッシュ値ｈが辞書（２５１）に登録されており且つ当該ハッシュ値ｈが衝突を起こしているので、コンピュータは、当該ハッシュ値ｈを持つ上記バケット・チェーン（２５１ａ）の各エントリ（２６１，２６２，２６３，・・・）を検索して、現在の位置（２２１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（２９３）。コンピュータは、上記バケット・チェーン（２５１ａ）のエントリ（２６１，２６２，２６３，・・・）の最後まで又は当該エントリ（２６１，２６２，２６３，・・・）の検索上限まで、一致する文字列の最大長を検索する（２９３）。当該エントリの検索上限は、データ圧縮アルゴリズムの圧縮レベル（例えば、最小の圧縮レベル、デフォルトの圧縮レベル、又は最大の圧縮レベル）がより高いほど（すなわち、より高圧縮であるほど）、より多い数のエントリを検索するように設定されうる。
【００３９】
コンピュータは、現在の位置（２２１）からの文字列と一致する文字列の最大長を見つける為に、現在の位置（２２１）からの文字列と辞書中の文字列との照合をシーケンシャルに行う。
【００４０】
コンピュータは、当該ハッシュ値ｈに関連付けられた上記バケット・チェーン（２５１ａ）の各エントリ（２６１，２６２，２６３，・・・）中において、文字列「ａｂｃ」（すなわち、a[i]b[i+1]c[i+2]）に一致する）（ハッシュ値を更新する関数（２４１）が３バイトを使用する場合であるので、最低３文字分の一致になる）、並びに、文字列「ａｂｃｄ」（すなわち、a[i]b[i+1]c[i+2]d[i+3]）に一致する）を見つけた場合には、文字列「ａｂｃｄ」を、一致する最大文字列（最長一致系列）として返す。
【００４１】
コンピュータは、次に、スライド・ウィンドウ（２１１）内において、現在の位置を、文字列「ｉ」の位置（２２１）から文字列「ｉ＋１」の位置（２３１）に一つずらす（２３２）。従って、コンピュータは、下記に述べるハッシュ関数が適用されるデータとして、現在、文字列「ｉ＋１」の位置（現在の位置、２３１）を開始位置とする所定の固定長バイト（図２に示す例の場合、３バイト）の文字列（２３２）「ｉ+１，ｉ+２，ｉ+３」を使用するとする。従って、現在処理中の文字列（２３２）「ｉ+１，ｉ+２，ｉ+３」は、一つ前に処理された文字列（２２２）「ｉ，ｉ+１，ｉ+２」中の「ｉ+１，ｉ+２」を含む。
【００４２】
コンピュータは、上記文字列（２３２）にハッシュ値を更新する関数（２４１）を適用して、ハッシュ値ｈ’を算出する（２９５）。コンピュータは、当該ハッシュ値ｈ’を用いて、当該ハッシュ値ｈ’が辞書（２５１）に登録されているか調べる（２９６）。コンピュータは、当該ハッシュ値ｈ’を辞書（２５１）に新たに登録し、更に、当該ハッシュ値ｈ’が辞書（２５１）にすでに登録されている場合には、当該ハッシュ値ｈ’を持つバケット・チェーン（２５１ｂ）の各エントリ（２８１，２８２，２８３，・・・）を検索して、現在の位置（２３１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（２９７）。
【００４３】
図２に示す上記例の場合、上記算出したハッシュ値ｈ’が辞書（２５１）に登録されており且つ当該ハッシュ値ｈ’が衝突を起こしているので、コンピュータは、当該ハッシュ値ｈ’に関連付けられた上記バケット・チェーン（２５１ｂ）の各エントリ（２８１，２８２，２８３，・・・）を検索して、現在の位置（２３１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（２９７）。コンピュータは、上記バケット・チェーン（２５１ｂ）のエントリ（２８１，２８２，２８３，・・・）の最後まで又は当該エントリ（２８１，２８２，２８３，・・・）の検索上限まで、一致する文字列の最大長を検索する（２９７）。当該エントリの検索上限は、データ圧縮アルゴリズムの圧縮レベル（例えば、最小の圧縮レベル、デフォルトの圧縮レベル、又は最大の圧縮レベル）がより高いほど（すなわち、より高圧縮であるほど）、より多い数のエントリを検索するように設定されうる。
【００４４】
コンピュータは、以降同様にして、スライド・ウィンドウ（２１１）内の現在の位置を一つずつずらして文字列を順次処理していく。また、コンピュータは、スライド・ウィンドウ（２１１）内の文字列の処理が終了したら、スライド・ウィンドウ（２１１）をクリアし、入力ストリーム（２０１）から、所定の固定長バイトの次の文字列をスライド・ウィンドウ（２１１）に読み込み、同様に、スライド・ウィンドウ（２１１）内の文字列を順次処理していく。
【００４５】
全体的なパフォーマンスの向上の為に、上記に述べた通り、ハッシュ関数それ自体は軽量である必要がある。そこで、図２に示す例において、通常のハッシュ関数と異なり、前回のハッシュ値と新しい入力文字の１バイトを使用して次回のハッシュ値を計算している。ハッシュ値を更新する関数は、新しいハッシュ値を、下記式に従い以前のハッシュ値及び新しいバイトｃから計算する。
【００４６】
new_value= (((prev_key)<< hash_shift) ^ (c)) & hash_mask)
new_value：新しいハッシュ値
prev_value：以前のハッシュ値
hash_shift：ハッシュ・シフト
c：新しいバイト
hash_mask：ハッシュ・マスク
【００４７】
上記ハッシュ・マスクとは、ハッシュテーブルの大きさで値をマスクすることである。当該ハッシュ・マスクは、計算されたハッシュ値がハッシュテーブルのテーブル・サイズに収まるようにする為に使用される。
【００４８】
ここで、例えばハッシュ・ビットが１５であり（３２Ｋのハッシュ・テーブル・サイズである）、ハッシュ・シフトが５でありうる。ハッシュ・シフトが５であるということは、１文字スライドさせるごとに前回のキーを５ビットシフトすることである。よって、１文字文中の５ビット分しかハッシュ計算に使用されていないことになる。従って、最初のバイトにおける３ビットがハッシュ計算において必ずしも使用されるとは限らず、ハッシュ衝突の可能性を増やすことを意味する。
【００４９】
図３は、従来手法に従い、文字列の選択された部分にハッシュ関数を適用してハッシュ値を計算した場合にハッシュ・インデックス衝突が生じ、一致する文字列の最大長を見つけること無しに、バケット・チェーンのエントリの探索の冗長なループ繰り返しが生じることを説明するためのダイアグラムである。
【００５０】
入力ストリーム（３０１）はデータ圧縮対象のファイルであり、文字列を含む。コンピュータは、下記に述べるハッシュ関数が適用されるデータとして、現在、文字列「ａ」の位置（現在の位置、３２１）を開始位置とする所定の固定長バイト（図３に示す例の場合、３バイト）の文字列（３２２）「ａ，ａ，ｂ」を使用するとする。
【００５１】
コンピュータは、上記文字列（３２２）に３バイトを使用するハッシュ関数（３４１）を適用して、ハッシュ値を算出する（３９１）。コンピュータは、当該算出されたハッシュ値ｈを用いて、当該ハッシュ値ｈが辞書（３５１）に登録されているか調べる（３９２）。コンピュータは、当該ハッシュ値ｈを辞書（３５１）に新たに登録し、更に、当該ハッシュ値ｈが辞書（３５１）にすでに登録されている場合には、当該ハッシュ値ｈを持つバケット・チェーン（３５１ａ）の各エントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）を検索して、現在の位置（３２１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（３９３）。
【００５２】
図３に示す上記例の場合、上記算出したハッシュ値ｈが辞書（３５１）に登録されており且つ当該ハッシュ値ｈが衝突を起こしているので、コンピュータは、当該ハッシュ値ｈを持つ上記バケット・チェーン（３５１ａ）の各エントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）を検索して、現在の位置（３２１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（３９３）。コンピュータは、上記バケット・チェーン（３５１ａ）のエントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）の最後まで又は当該エントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）の検索上限まで、一致する文字列の最大長を検索する（３９３）。当該エントリの検索上限は、データ圧縮アルゴリズムの圧縮レベル（例えば、最小の圧縮レベル、デフォルトの圧縮レベル、又は最大の圧縮レベル）がより高いほど（すなわち、より高圧縮であるほど）、多くの数のエントリを検索するように設定されうる。
【００５３】
コンピュータは、当該ハッシュ値ｈを持つ上記バケット・チェーン（３５１ａ）の各エントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）中において、文字列「ａａｂｃ」に一致する文字列を検索する。しかしながら、コンピュータは、指定されたすべてのエントリ（例えば、最大の圧縮レベルの場合における４０９６個）を検索してもそのような文字列「ａａｂｃ」であるエントリを見つけることができない。従って、数多くのエントリの検索が行われることによっても、より高い圧縮効果はもたらされない。
【００５４】
コンピュータは、引き続き、下記に述べるハッシュ関数が適用されるデータとして、現在、文字列「ａ」の位置（現在の位置、３３１）を開始位置とする所定の固定長バイト（図３に示す例の場合、３バイト）の文字列（３３２）「ａ，ａ，ｂ」を使用するとする。
【００５５】
コンピュータは、上記文字列（３３２）に３バイトを使用するハッシュ関数（３４１）を適用して、ハッシュ値を算出する（３９４）。コンピュータは、当該算出されたハッシュ値ｈを用いて、当該ハッシュ値ｈが辞書（３５１）に登録されているか調べる（３９５）。コンピュータは、当該ハッシュ値ｈを辞書（３５１）に新たに登録し、更に、当該ハッシュ値ｈが辞書（３５１）にすでに登録されている場合には、当該ハッシュ値ｈを持つバケット・チェーン（３５１ａ）の各エントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）を検索して、現在の位置（３３１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（３９６）。
【００５６】
図３に示す上記例の場合、上記算出したハッシュ値ｈが辞書（３５１）に登録されており且つ当該ハッシュ値ｈが衝突を起こしているので、コンピュータは、当該ハッシュ値ｈを持つ上記バケット・チェーン（３５１ａ）の各エントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）を検索して、現在の位置（３３１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（３９６）。コンピュータは、上記バケット・チェーン（３５１ａ）のエントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）の最後まで又は当該エントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）の検索上限まで、一致する文字列の最大長を検索する（３９６）。当該エントリの検索上限は、上記したとおりである。
【００５７】
コンピュータは、当該ハッシュ値ｈを持つ上記バケット・チェーン（３５１ａ）の各エントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）中において、文字列「ａａｂｄ」に一致する文字列を検索する。しかしながら、コンピュータは、指定されたすべてのエントリ（例えば、最大の圧縮レベルの場合における４０９６個）を検索してもそのような文字列「ａａｂｄ」であるエントリを見つけることができない。従って、数多くのエントリの検索が行われることによっても、より高い圧縮効果はもたらされない。
【００５８】
上記した例では、文字列（３２２，３３２）は、同一の３文字「ａ，ａ，ｂ」を持ち、しかし４文字目が異なる（文字列（３２２）の場合「ｃ」であり、文字列（３３２）の場合「ｄ」である）。このような場合に、固定長である３バイトを使用するハッシュ関数は、多数の衝突を発生し、その結果長いバケット・チェーンを生成する。そして、バケット・チェーン（３５１ａ）の各エントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）において４文字目以降一致する文字列を見つけることができないまま、バケット・チェーン（３５１ａ）の各エントリ（３６１，３６２，３６３，３６４，・・・，及び３６５）を検索するというループ繰り返しを引き起こす。すなわち、上記した例では、固定長である３バイトを使用するハッシュ関数は、幾つかの文字列（例えば、上記文字列（３２２，３３２））について、ハッシュ値のクラスタリング結果を生成するために、パフォーマンスの低下をもたらす。
【００５９】
上記ループ繰り返しを引き起こすという問題は、特に、より高い圧縮率が指定された場合に、圧縮の為に多くののＣＰＵ時間を要するが、当該圧縮率はさほど変わらないか寧ろ低下させる結果につながる。
【００６０】
そこで、本発明は、ハッシュテーブルに過去に登録されたハッシュ値を持つバケット・チェーンの各エントリの検索において、一致する最大文字列が見つからない場合におけるデータ圧縮に伴うパフォーマンスを改善することを目的とする。
【００６１】
また、本発明は、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリの検索において、一致する最大文字列が見つからない場合におけるハッシュ衝突を減少させることを目的とする。
【課題を解決するための手段】
【００６２】
本発明は、データ圧縮を高速化するための技法を提供する。当該技法は、当該データ圧縮をするための方法、並びに、当該データ圧縮をするためのコンピュータ、コンピュータ・プログラム及びコンピュータ・プログラム製品を包含しうる。
【００６３】
特には、本発明は、上記データ圧縮をするための圧縮アルゴリズムに関する。本発明は、上記圧縮アルゴリズムを備えたコンピュータ、コンピュータ・プログラム及びコンピュータ・プログラム製品を包含しうる。
【００６４】
（本発明に従う第１の態様）
【００６５】
本発明に従う第１の態様において、文字列の選択された部分にハッシュ関数を適用してハッシュ値を計算し、当該ハッシュ値を用いて、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリを検索して、一致する文字列の最大長を見つけることによりデータ圧縮をする方法であって、コンピュータが、
上記各エントリの検索において一致する最大文字列が見つからず、当該検索が無駄になったことを示す指標を取得するステップと、
上記指標が所定の閾値を超えたときに、上記ハッシュテーブルを再構築することなしに、上記ハッシュ関数を、上記文字列の選択された部分を広げる別のハッシュ関数に切り替えるステップと
を実行することを含む。
【００６６】
本発明の一つの実施態様において、上記コンピュータが、
所定のタイミングで、上記別のハッシュ関数を、元のハッシュ関数に戻すステップ
をさらに実行することを含みうる。
【００６７】
本発明の一つの実施態様において、上記別のハッシュ関数を上記元のハッシュ関数に戻すステップが、
上記ハッシュテーブルがクリアされるときに、又は、所定の長さの文字列が処理されるごとに行われうる。
【００６８】
本発明の一つの実施態様において、上記指標が、上記ハッシュ値を持つ上記バケット・チェーンのエントリの最大長において、又は、上記ハッシュ値を持つ上記バケット・チェーンのエントリの検索上限において、検索中の文字列のエントリが見つからなかったときの検索に要した時間でありうる。
【００６９】
本発明の一つの実施態様において、上記指標が、上記ハッシュ値を持つ上記バケット・チェーンのエントリの最大長まで、又は、上記ハッシュ値を持つ上記バケット・チェーンのエントリの検索上限まで検索しても検索中の文字列のエントリが見つからなかった頻度でありうる。
【００７０】
（本発明に従う第２の態様）
【００７１】
本発明に従う第２の態様において、文字列の選択された部分にハッシュ関数を適用してハッシュ値を計算し、当該ハッシュ値を用いて、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリを検索して、一致する文字列の最大長を見つけることによりデータ圧縮をするためのコンピュータであって、
上記各エントリの検索において一致する最大文字列が見つからず、当該検索が無駄になったことを示す指標を取得する指標取得手段と、
上記指標が所定の閾値を超えたときに、上記ハッシュテーブルを再構築することなしに、上記ハッシュ関数を、上記文字列の選択された部分を広げる別のハッシュ関数に切り替えるハッシュ関数切り替え手段と
を備えている。
【００７２】
本発明の一つの実施態様において、上記コンピュータが、
所定のタイミングで、上記別のハッシュ関数を、元のハッシュ関数に戻す回復手段
をさらに備えうる。
【００７３】
本発明の一つの実施態様において、上記回復手段が、上記別のハッシュ関数を元のハッシュ関数に戻すことを、
上記ハッシュテーブルがクリアされるときに、又は、所定の長さの文字列を処理するごとに行いうる。
【００７４】
本発明の一つの実施態様において、上記指標が、上記ハッシュ値を持つ上記バケット・チェーンのエントリの最大長において、又は、上記ハッシュ値を持つ上記バケット・チェーンのエントリの検索上限において、検索中の文字列のエントリが見つからなかったときの検索に要した時間でありうる。
【００７５】
本発明の一つの実施態様において、上記指標が、上記ハッシュ値を持つ上記バケット・チェーンのエントリの最大長まで、又は、上記ハッシュ値を持つ上記バケット・チェーンのエントリの検索上限まで検索しても検索中の文字列のエントリが見つからなかった頻度でありうる。
【００７６】
（本発明に従う第３の態様）
【００７７】
本発明に従う第３の態様において、文字列の選択された部分にハッシュ関数を適用してハッシュ値を計算し、当該ハッシュ値を用いて、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリを検索して、一致する文字列の最大長を見つけることによりデータ圧縮をするためのコンピュータ・プログラム又はコンピュータ・プログラム製品は、コンピュータに、上記第１の態様に記載の方法の各ステップを実行させる。
【００７８】
本発明の実施態様に従うコンピュータ・プログラムはそれぞれ、一つ又は複数のフレキシブル・ディスク、ＭＯ、ＣＤ−ＲＯＭ、ＤＶＤ、ＢＤ、ハードディスク装置、ＵＳＢに接続可能なメモリ媒体、ＲＯＭ、ＭＲＡＭ、ＲＡＭ等の任意のコンピュータ読み取り可能な記録媒体に格納することができる。当該コンピュータ・プログラムは、上記記録媒体への格納のために、通信回線で接続する他のコンピュータ、例えばサーバ・コンピュータからダウンロードしたり、又は他の記録媒体から複製したりすることができる。また、本発明の実施態様に従うコンピュータ・プログラムは、圧縮し、又は複数に分割して、単一又は複数の記録媒体に格納することもできる。また、様々な形態で、本発明の実施態様に従うコンピュータ・プログラム製品を提供することも勿論可能であることにも留意されたい。本発明の実施態様に従うコンピュータ・プログラム製品は、例えば、上記コンピュータ・プログラムを記録した記憶媒体、又は、上記コンピュータ・プログラムを伝送する伝送媒体を包含しうる。
【００７９】
本発明の上記概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの構成要素のコンビネーション又はサブコンビネーションもまた、本発明となりうることに留意すべきである。
【００８０】
本発明の実施態様において使用されるコンピュータの各ハードウェア構成要素を、複数のマシンと組み合わせ、それらに機能を配分し実施する等の種々の変更は当業者によって容易に想定され得ることは勿論である。それらの変更は、当然に本発明の思想に包含される概念である。ただし、これらの構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【００８１】
また、本発明は、ハードウェア、ソフトウェア、又は、ハードウェア及びソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアとの組み合わせによる実行において、上記コンピュータ・プログラムのインストールされたコンピュータにおける実行が典型的な例として挙げられる。かかる場合、当該コンピュータ・プログラムが当該コンピュータのメモリにロードされて実行されることにより、当該コンピュータ・プログラムは、当該コンピュータを制御し、本発明にかかる処理を実行させる。当該コンピュータ・プログラムは、任意の言語、コード、又は、表記によって表現可能な命令群から構成されうる。そのような命令群は、当該コンピュータが特定の機能を直接的に、又は、１．他の言語、コード若しくは表記への変換及び、２．他の媒体への複製、のいずれか一方若しくは双方が行われた後に、本発明の実施態様に従う処理を実行することを可能にするものである。
【発明の効果】
【００８２】
本発明の実施態様に従うと、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリの検索において一致する最大文字列が見つからず、当該検索が無駄になったことを示す指標が所定の閾値を超えたときに、上記ハッシュテーブルを再構築することなしに、ハッシュ関数を、文字列の選択された部分を広げる別のハッシュ関数に切り替えることから、長いバケット・チェーンを処理する為に必要とされる演算処理装置（例えば、ＣＰＵ）が浪費する時間を動的に避けることが可能になる。従って、データ圧縮に伴うパフォーマンスが改善される。
【００８３】
また、本発明の実施態様に従うと、上記したとおり、上記ハッシュテーブルを再構築することなしに、ハッシュ関数を、文字列の選択された部分を広げる別のハッシュ関数に切り替えることから、ハッシュ衝突が有意に減少する。従って、データ圧縮に伴うパフォーマンスが改善される。
【図面の簡単な説明】
【００８４】
【図１】本発明の実施態様に従う又は本発明の実施態様において使用されうるコンピュータの一例を示した図である。
【図２】従来手法に従い、文字列の選択された部分にハッシュ値を更新する関数を適用してハッシュ値を計算し、当該ハッシュ値を用いて、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリを検索し、一致する文字列の最大長を見つける処理を説明するためのダイアグラムを示す。
【図３】従来手法に従い、文字列の選択された部分にハッシュ関数を適用してハッシュ値を計算した場合にハッシュ・インデックス衝突が生じ、一致する文字列の最大長を見つけること無しに、バケット・チェーンのエントリの検索の冗長なループ繰り返しが生じることを説明するためのダイアグラムである。
【図４】本発明の実施態様に従い、ハッシュテーブルに過去に登録されたバケット・チェーンの各エントリの検索において一致する最大文字列が見つからず、当該検索が無駄になったことを示す指標が所定の閾値を超えたときに、ハッシュテーブルを再構築することなしに、ハッシュ関数を文字列の選択された部分を広げる別のハッシュ関数に切り替える処理を説明するためのダイアグラムを示す。
【図５】本発明の実施態様に従い、ハッシュ関数を文字列の選択された部分を広げる別のハッシュ関数に切り替えて、データを圧縮する処理を示すダイアグラムを示す。
【図６】図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従いデータ圧縮をするコンピュータの機能ブロック図の一例を示した図である。
【発明を実施するための形態】
【００８５】
本発明の実施形態を、以下に図面に従って説明する。以下の図を通して、特に断らない限り、同一の符号は同一の対象を指す。本発明の実施形態は、本発明の好適な態様を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。
【００８６】
本発明の実施態様において使用されうるコンピュータは、データ圧縮をすることができるコンピュータであれば特に限定されない。当該コンピュータは、例えば、メインフレーム・コンピュータ、サーバ・コンピュータ、デスクトップ・コンピュータ、ノート・コンピュータ若しくは一体型パソコン、又は、タブレット端末若しくはスマートフォン（例えば、Ｗｉｎｄｏｗｓ（登録商標）、アンドロイド（登録商標）又はｉＯＳを搭載したタブレット端末若しくスマートフォン）でありうる。
【００８７】
図１は、本発明の実施態様に従う又は本発明の実施態様において使用されうるコンピュータの一例を示した図である。
【００８８】
コンピュータ（１０１）は、ＣＰＵ（１０２）とメイン・メモリ（１０３）とを備えており、これらはバス（１０４）に接続されている。ＣＰＵ（１０２）は好ましくは、３２ビット又は６４ビットのアーキテクチャに基づくものである。当該ＣＰＵ（１０２）は例えば、インテル社のＣｏｒｅ（商標）  ｉシリーズ、Ｃｏｒｅ（商標）  ２シリーズ、Ａｔｏｍ（商標）シリーズ、Ｘｅｏｎ（登録商標）シリーズ、Ｐｅｎｔｉｕｍ（登録商標）シリーズ若しくはＣｅｌｅｒｏｎ（登録商標）シリーズ、ＡＭＤ（Advanced Micro Devices）社のＡシリーズ、Ｐｈｅｎｏｍ（商標）シリーズ、Ａｔｈｌｏｎ（商標）シリーズ、Ｔｕｒｉｏｎ（登録商標）シリーズ若しくはＳｅｍｐｒｏｎ（商標）、又は、インターナショナル・ビジネス・マシーンズ・コーポレーションのＰｏｗｅｒ（商標）シリーズでありうる。
【００８９】
バス（１０４）には、ディスプレイ・コントローラ（１０５）を介して、ディスプレイ（１０６）、例えば液晶ディスプレイ（ＬＣＤ）が接続されうる。また、液晶ディスプレイ（ＬＣＤ）は例えば、タッチパネル・ディスプレイ又はフローティング・タッチ・ディスプレイであてもよい。ディスプレイ（１０６）は、コンピュータ（１０１）上で動作中のソフトウェア（例えば、本発明の実施態様に従うコンピュータ・プログラム又は当該コンピュータ（１０１）上で動作中の各種コンピュータ・プログラム）が稼働することによって表示されるオブジェクトを、適当なグラフィック・インタフェースで表示するために使用されうる。
【００９０】
バス（１０４）には任意的に、例えばＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ディスク（１０８）、例えばハードディスク又はソリッド・ステート・ドライブ（ＳＳＤ）が接続されうる。
【００９１】
バス（１０４）には任意的に、例えばＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ドライブ（１０９）、例えばＣＤ、ＤＶＤ又はＢＤドライブが接続されうる。
【００９２】
バス（１０４）には、周辺装置コントローラ（１１０）を介して、例えばキーボード・マウス・コントローラ又はＵＳＢバスを介して、任意的に、キーボード（１１１）及びマウス（１１２）が接続されうる。
【００９３】
ディスク（１０８）には、オペレーティング・システム、例えばｚ／ＯＳ（登録商標）、ｚ／ＶＭ（登録商標）、ｚ／ＶＳＥ（登録商標）、ｚ／ＴＰＦ、ＶＯＳ３、ＵＮＩＸ（登録商標）、Ｗｉｎｄｏｗｓ（登録商標）、ＭａｃＯＳ（登録商標）、及びＪ２ＥＥなどのＪａｖａ（登録商標）処理環境、Ｊａｖａ（登録商標）アプリケーション、Ｊａｖａ（登録商標）仮想マシン（ＶＭ）、Ｊａｖａ（登録商標）実行時（ＪＩＴ）コンパイラを提供するプログラム、本発明の実施態様に従うコンピュータ・プログラム、及びその他のプログラム、並びにデータが、メイン・メモリ（１０３）にロード可能なように記憶されうる。
【００９４】
ディスク（１０８）は、コンピュータ（１０１）内に内蔵されていてもよく、当該コンピュータ（１０１）がアクセス可能なようにケーブルを介して接続されていてもよく、又は、当該コンピュータ（１０１）がアクセス可能なように有線又は無線ネットワークを介して接続されていてもよい。
【００９５】
ドライブ（１０９）は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ又はＢＤからプログラム、例えばオペレーティング・システム、アプリケーション又は本発明の実施態様に従うコンピュータ・プログラムをディスク（１０８）にインストールするために使用されうる。
【００９６】
通信インタフェース（１１４）は、例えばイーサネット（登録商標）・プロトコルに従う。通信インタフェース（１１４）は、通信コントローラ（１１３）を介してバス（１０４）に接続され、コンピュータ（１０１）を通信回線（１１５）に有線又は無線接続する役割を担い、コンピュータ（１０１）のオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は例えば、無線ＬＡＮ接続規格に基づく無線ＬＡＮ環境、ＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどのＷｉ−Ｆｉ無線ＬＡＮ環境、又は携帯電話網環境（例えば、３Ｇ又は４Ｇ環境）でありうる。
【００９７】
図４は、本発明の実施態様に従い、ハッシュテーブルに過去に登録されたバケット・チェーンの各エントリの検索において一致する最大文字列が見つからず、当該検索が無駄になったことを示す指標が所定の閾値を超えたときに、ハッシュテーブルを再構築することなしに、ハッシュ関数を文字列の選択された部分を広げる別のハッシュ関数に切り替える処理を説明するためのダイアグラムを示す。
【００９８】
入力ストリーム（４０１）はデータ圧縮対象のファイルであり、文字列を含む。コンピュータ（１０１）は、当該入力ストリーム（４０１）から、所定の固定長バイトの文字列をバッファ（すなわち、スライド・ウィンドウ）（図示せず）に読み込む。コンピュータ（１０１）は、下記に述べるハッシュ関数が適用されるデータとして、現在、文字列「ａ」の位置（現在の位置、４２１）を開始位置とする所定の固定長バイト（図４に示す例の場合、３バイト）の文字列（４２２）「ａ，ａ，ｂ」を使用するとする。
【００９９】
コンピュータ（１０１）は、上記文字列（４２２）に３バイトを使用するハッシュ関数（４４１）を適用して、ハッシュ値を算出する（４９１）。コンピュータ（１０１）は、当該算出されたハッシュ値ｈを用いて、当該ハッシュ値ｈが辞書（４５１）に登録されているか調べる（４９２）。コンピュータ（１０１）は、当該ハッシュ値ｈを辞書（４５１）に新たに登録し、更に、当該ハッシュ値ｈが辞書（４５１）にすでに登録されている場合には、当該ハッシュ値ｈを持つバケット・チェーン（４５１ａ）の各エントリ（４６１，４６２，４６３，４６４，・・・，及び４６５）を検索して、現在の位置（４２１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（４９３）。
【０１００】
図４に示す上記例の場合、上記算出したハッシュ値ｈが辞書（４５１）に登録されており且つ当該ハッシュ値ｈが衝突を起こしているので、コンピュータ（１０１）は、当該ハッシュ値ｈを持つ上記バケット・チェーン（４５１ａ）の各エントリ（４６１，４６２，４６３，４６４，・・・，及び４６５）を検索して、現在の位置（４２１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（４９３）。コンピュータ（１０１）は、上記バケット・チェーン（４５１ａ）のエントリ（４６１，４６２，４６３，４６４，・・・，及び４６５）の最後まで又は当該エントリ（４６１，４６２，４６３，４６４，・・・，及び４６５）の検索上限まで、一致する文字列の最大長を検索する（４９３）。当該エントリの検索上限は、データ圧縮アルゴリズムの圧縮レベル（例えば、最小の圧縮レベル、デフォルトの圧縮レベル、又は最大の圧縮レベル）がより高いほど（すなわち、より高圧縮であるほど）、より多い数のエントリを検索するように設定されうる。
【０１０１】
コンピュータ（１０１）は、上記ハッシュ値ｈを用いて、辞書（４５１）に過去に登録された当該ハッシュ値を持つバケット・チェーン（４５１ａ）の各エントリ（４６１，４６２，４６３，４６４，・・・，及び４６５）を検索する処理において一致する最大文字列（すなわち、「ａ，ａ，ｂ，ｃ」）が見つからず、当該検索が無駄になったことを示す指標を取得する。
【０１０２】
コンピュータ（１０１）は、上記取得した指標が所定の閾値を超えたかを判断する（４９４）。コンピュータ（１０１）は、当該指標が所定の閾値を超えていることに応じて、辞書（４５１）を再構築することなしに、３バイトを使用するハッシュ関数（現在使用中のハッシュ関数）（４４１）を、４バイトを使用するハッシュ関数（文字列の選択された部分を広げる別のハッシュ関数）（４４２）に切り替える（４９５）。当該４バイトを使用するハッシュ関数への切り替え（４９５）は、オン・ザ・フライ（On the fly）で実行される。
【０１０３】
コンピュータ（１０１）は、引き続き、下記に述べるハッシュ関数が適用されるデータとして、現在、文字列「ａ」の位置（現在の位置、４３１）を開始位置とする所定の固定長バイト（図４に示す例の場合、４バイト）の文字列（４３２）「ａ，ａ，ｂ、ｄ」を使用するとする。
【０１０４】
コンピュータ（１０１）は、上記文字列（４３２）に４バイトを使用するハッシュ関数（４４２）を適用して、ハッシュ値ｈ’を算出する（４９６）。コンピュータ（１０１）は、当該算出されたハッシュ値ｈ’を用いて、当該ハッシュ値ｈ’が辞書（４５１）に登録されているか調べる（４９７）。
【０１０５】
当該辞書（４５１）は、上記３バイトを使用するハッシュ関数（４４１）から４バイトを使用するハッシュ関数（４４２）に切り替えられた（４９５）後の、当該４バイトを使用するハッシュ関数（４４２）を適用することによって上記バケット・チェーン（４５１ｂ）に登録された文字列を含む点で、元の辞書の内容から更新されている。すなわち、当該辞書（４５１）は、４バイトを使用するハッシュ関数（４４２）を適用することによって上記バケット・チェーン（４５１ｂ）に登録されたエントリ（新たに登録されたエントリ）（４８１及び４８２）（すなわち、ハッシュ値ｈ’を持つエントリ（４８１及び４８２））を有している。また、当該辞書（４５１）は、ハッシュ値ｈ’を持つ各エントリ（４８３及び４８４）をさらに有している。当該各エントリ（４８３及び４８４）は、上記切り替えられる前の３バイトを使用するハッシュ関数（４４１）を適用することによって上記バケット・チェーン（４５１ｂ）に過去に登録されたエントリである。
【０１０６】
コンピュータ（１０１）は、当該ハッシュ値ｈ’を辞書（４５１）に新たに登録し、更に、当該ハッシュ値ｈ’が辞書（４５１）にすでに登録されている場合には、当該ハッシュ値ｈ’を持つバケット・チェーン（４５１ｂ）の各エントリ（４８１，４８２，４８３，及び４８４）を検索して、現在の位置（４３１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（４９８）。
【０１０７】
上記３バイトを使用するハッシュ関数（４４１）から４バイトを使用するハッシュ関数（４４２）に切り替えることは、文字列を辞書に登録する際に、より検索効率の良い形に辞書を作り変えることにつながる。
【０１０８】
図４に示す上記例の場合、上記算出したハッシュ値ｈ’が辞書（４５１）に登録されており且つ当該ハッシュ値ｈ’が衝突を起こしているので、コンピュータ（１０１）は、当該ハッシュ値ｈ’を持つバケット・チェーン（４５１ｂ）の各エントリ（４８１，４８２，４８３，及び４８４）を検索して、現在の位置（４３１）からの文字列と一致する文字列の最大長を見つける為の検索を行う（４９８）。
【０１０９】
図４に示す上記例の場合、コンピュータ（１０１）は、バケット・チェーン（４５１ｂ）の各エントリ（４８１，４８２，４８３，及び４８４）を検索して、文字列「ａａｂｄ」であるエントリ（４８１）を見つける。すなわち、コンピュータ（１０１）は、エントリ数の少ない（すなわち、チェーンが短い）バケット・チェーン（４５１ｂ）のエントリ（４８１）から、一致する最大文字列を検索することが可能になる。エントリ数の少ないバケット・チェーンから上記一致する最大文字列を検索することは、バケット・チェーンからの検索時間を短縮することにつながり、結果としてパフォーマンスの向上をもたらす。
【０１１０】
なお、エントリ（４８３及び４８４）は、文字列「ａａｂｄ」から始まる文字列でないが有害でない。なぜならば、エントリ（４８３及び４８４）は、一致する文字列検索で除外されるし、且つ、スライド・ウィンドウによりすぐに当該スライド・ウィンドウ外に出されうるからである。
【０１１１】
図４に示すように、ハッシュ関数を文字列の選択された部分を広げる別のハッシュ関数に切り替える処理は、下記のようなデータ・ファイルを圧縮する場合に特に有用である。
【０１１２】
zlibはDeflateアルゴリズムを利用した圧縮フォーマットの一種であり、Deflateストリームの入れ物として機能する。Deflateアルゴリズムは、ハフマン符号とＬＺ７７とを組み合わせてデータ圧縮を行うアルゴリズムである。Deflateアルゴリズムは、３バイトを使用するハッシュ関数を使用する。ＰＤＦファイルの生成の為に、Deflateアルゴリズムを使用する場合には、入力データは、当該入力データ中に埋め込まれたフォント・データを含みうる。例えばTrueType（登録商標）フォントの場合には、フォント・ファイルが幾つかのテーブル、例えばhmtx（横測定基準；horizontal metrics）テーブル及びloca（glyfテーブルにおけるアウトライン・データの場所インデックス）テーブルを含む。これらテーブル・データは、いずれも４バイトのデータ・アレイであり、データが順番に格納されている。すなわち、当該４バイト・アレイでは、最初の３バイトが同一であり、４バイト目が異なるデータが並んでいる。
【０１１３】
TrueType（登録商標）フォントのフォント・ファイルの上記特徴、すなわち上記テーブル・データが４バイトのデータ・アレイであることは、３バイトを用いるハッシュ関数（すなわち、Deflateアルゴリズム）を適用して計算されたハッシュ値間で数多くの衝突を発生させる。従って、ハッシュテーブルに過去に登録された当該衝突したハッシュ値を持つバケット・チェーンは長くなる。
【０１１４】
そこで、本発明の実施態様に従うと、上記ｐｄｆファイルを圧縮しているコンピュータは、当該ｐｄｆファイル中の上記TrueType（登録商標）フォントのデータを、３バイトを用いるハッシュ関数で圧縮し始めると、上記検索が無駄になったことを示す指標が所定の閾値が超えたことを検出する。次に、当該コンピュータは、上記検出に応じて、ハッシュテーブルを再構築することなしに、現在使用中の３バイトを用いるハッシュ関数を、４バイトを用いるハッシュ関数に切り替える。当該４バイトを用いるハッシュ関数への切り替えによって、コンピュータは、４バイトを用いるハッシュ関数を適用して計算されたハッシュ値を用いて、文字列をハッシュテーブルに登録することから、上記テーブル・データは異なるハッシュ値に分散され、ハッシュ値の衝突が減少する。従って、上記バケット・チェーンが長くなることが防がれる。
【０１１５】
図５は、本発明の実施態様に従い、ハッシュ関数を文字列の選択された部分を広げる別のハッシュ関数に切り替えて、データを圧縮する処理を示すダイアグラムを示す。
【０１１６】
ステップ５０１において、コンピュータ（１０１）は、データ圧縮アルゴリズムをメモリ（１０３）に読み込んで、データを圧縮する処理を開始する。当該データ圧縮アルゴリズムは、辞書としてハッシュテーブルを適用可能であり、動的に辞書を作りながらデータを圧縮するアルゴリズムでありうる。例えば、当該データ圧縮アルゴリズムは、適応型辞書法に従う圧縮アルゴリズムでありうる。適応型辞書法に従う圧縮アルゴリズムは、上記した通り、前もって辞書を用意せずに、ファイルを読み込みながら辞書を作成し、そして当該辞書に登録されている文字列が現れることに応じて、辞書の位置情報に変換することで圧縮を行うアルゴリズムである。
【０１１７】
ステップ５０２において、コンピュータ（１０１）は、データ圧縮をするファイルを例えば記憶媒体（１０８）から読み出し、当該ファイルを入力ストリームとし、当該入力ストリーム中の所定の数の文字列をバッファ（１０３）内に読み込む。当該バッファ（１０３）は、スライド・ウィンドウでありうる。
【０１１８】
ステップ５０３において、コンピュータ（１０１）は、上記バッファ（１０３）に読み込んだ文字列を先頭から順に１バイトずつ移動して処理する。すなわち、コンピュータ（１０１）は、当該現在の位置から所定のバイト数の文字列を選択し、当該選択された文字列の部分にハッシュ関数を適用して、ハッシュ値を計算する。そして、コンピュータ（１０１）は、当該ハッシュ値を用いて、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリを検索して、一致する文字列の最大長を検索する。コンピュータ（１０１）は、このハッシュ関数の計算と一致する文字列の最大長を検索する処理を、前記バッファ（１０３）内の文字列に対して、現在の位置を１バイトずつずらしながら順に実行する。
【０１１９】
ステップ５０４において、コンピュータ（１０１）は、ステップ５０３で算出されたハッシュ値を用いて、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリを検索する処理において一致する最大文字列が見つからず、当該検索が無駄になったことを示す指標を取得する。コンピュータ（１０１）は、上記指標を、データ圧縮アルゴリズムがデータ圧縮を行っている間に例えば、連続的に、断続的に又は所定の時間毎に取得しうる。
【０１２０】
当該指標は例えば、下記（１）〜（４）に示す指標でありうる：
（１）文字列の選択された部分にハッシュ関数を適用して計算されたハッシュ値を持つバケット・チェーンのエントリの最大長において、検索中の文字列のエントリが見つからなかったときの検索に要した時間；若しくは、
（２）文字列の選択された部分にハッシュ関数を適用して計算されたハッシュ値を持つバケット・チェーンのエントリの検索上限において、検索中の文字列のエントリが見つからなかったときの検索に要した時間：又は、
（３）文字列の選択された部分にハッシュ関数を適用して計算されたハッシュ値を持つバケット・チェーンのエントリの最大長まで検索しても検索中の文字列のエントリが見つからなかった頻度；若しくは、
（４）文字列の選択された部分にハッシュ関数を適用して計算されたハッシュ値を持つバケット・チェーンのエントリの検索上限まで検索しても検索中の文字列のエントリが見つからなかった頻度。
【０１２１】
上記（１）に示す各時間は、演算処理装置（例えば、ＣＰＵ）が上記文字列のエントリの検索を最後まで行うために必要な（実際の）時間に相当しうる。
【０１２２】
上記（２）に示す各時間は、演算処理装置（例えば、ＣＰＵ）が上記文字列のエントリを検索上限まで行うために必要な（実際の）時間に相当しうる。
【０１２３】
上記（３）に示す各頻度は、上記バケット・チェーンのエントリの検索が最後のエントリまで行われた回数を上記バケット・チェーンのエントリの検索の呼び出し合計回数で除した値でありうる。
【０１２４】
上記（４）に示す各頻度は、上記バケット・チェーンのエントリの検索が検索上限のエントリまで行われた回数を上記バケット・チェーンのエントリの検索の呼び出し合計回数で除した値でありうる。
【０１２５】
上記（２）及び上記（４）において、エントリの検索上限は例えば、データ圧縮アルゴリズムの圧縮レベル（例えば、最小の圧縮レベル、デフォルトの圧縮レベル、又は最大の圧縮レベル）がより高いほど（すなわち、より高圧縮であるほど）、より多い数のエントリを検索するように設定されうる。当該検索上限は、例えばプログラム内に予め設定されうる。当該検索上限は例えば、デフォルトの圧縮レベルの場合には１２８個のエントリとし、最大の圧縮レベルの場合には４０９６個のエントリとしうる。当該設定された検索上限が少ないほど検索時間が短く圧縮率は低くなり、一方、当該設定された検索上限が増えるほど検索時間が長いが圧縮率は高くなる。
【０１２６】
ステップ５０５において、コンピュータ（１０１）は、ステップ５０４で取得した指標が所定の閾値を超えたかを判断する。コンピュータ（１０１）は、当該指標が所定の閾値を超えていることに応じて、処理をステップ５０６に進める。一方、コンピュータ（１０１）は、当該指標が所定の閾値を超えていないことに応じて、処理をステップ５０７に進める。
【０１２７】
上記指標は、下記ステップ５０６に示すように、ハッシュテーブルのバケット・チェーンが長くなるにつれて生じる、バケット・チェーンのエントリを最後まで又は検索上限まで検索する時間を減らすことを目的として、乃至は、ハッシュ値の衝突を減少させることを目的として、ハッシュ関数の切り替えをする為に使用される。
【０１２８】
ステップ５０６において、コンピュータ（１０１）は、上記指標が所定の閾値を超えていることに応じて、ハッシュテーブルを再構築することなしに、現在使用中のハッシュ関数を、文字列の選択された部分を広げる別のハッシュ関数に切り替える。文字列の選択された部分を広げることは、現在使用中のハッシュ関数が３バイトを使用するハッシュ関数の場合には、別のハッシュ関数として上記３バイトよりも広げた、例えば４バイトを使用するハッシュ関数としうる。従って、コンピュータ（１０１）は例えば、３バイトを使用するハッシュ関数を、４バイトを使用するハッシュ関数に切り替えうる。
【０１２９】
文字列の選択された部分を広げることは、元のハッシュ関数により選択される文字列よりも多くの文字列を先読み（look ahead）することになる。従って、当該切り替えられたハッシュ関数によって求められるハッシュ値の衝突は、元のハッシュ関数によって求められるハッシュ値の衝突よりも減ることになる。
【０１３０】
切り替えるハッシュ関数が使用する文字数を元のハッシュ関数が使用する文字数よりも広げる（すなわち、大きくする）ことによって、ハッシュテーブルに新たに登録されるバケット・チェーンのエントリの長さを短くすることが可能になる。
【０１３１】
コンピュータ（１０１）は、上記ハッシュ関数の切り替えを、オン・ザ・フライで実行する。
【０１３２】
コンピュータ（１０１）は、ハッシュ関数の切り替えが終了することに応じて、処理をステップ５０７に進める。
【０１３３】
ステップ５０７において、コンピュータ（１０１）は、現在のバッファ（１０３）において処理すべき文字列データがあるかを判断する。コンピュータ（１０１）は、当該処理すべき文字列データがあることに応じて、処理をステップ５０３に戻す。コンピュータ（１０１）は、処理がステップ５０３に戻ることに応じて、上記バッファ（１０３）中の現在の処理中の文字列を１バイトずらし、次の入力バイトについて、上記ステップ５０３で説明した処理を上記切り替えられたハッシュ関数を使用して行う。一方、コンピュータ（１０１）は、当該処理すべき文字列データがないことに応じて、処理をステップ５０８に進める。
【０１３４】
ステップ５０８において、コンピュータ（１０１）は、現在のバッファ（１０３）において処理すべき次の文字列が入力ストリーム中にあるかを判断する。コンピュータ（１０１）は、入力ストリーム中に上記次の文字列があることに応じて、当該次の文字列についてデータ圧縮をするために、処理をステップ５０９進めるか、又は、処理をステップ５０２に戻す。一方、コンピュータ（１０１）は、入力ストリーム中に上記次の文字列がないことに応じて、処理を終了ステップ５１１に進める。
【０１３５】
ステップ５０９は、任意のステップである。ステップ５０９において、コンピュータ（１０１）は、切り替えられたハッシュ関数を元のハッシュ関数に戻すかを判断する。コンピュータ（１０１）は例えば、元のハッシュ関数に戻すことが設定されていることに応じて、処理をステップ５１０に進める。
【０１３６】
ステップ５１０は、任意のステップである。コンピュータ（１０１）は、所定のタイミングで、ステップ５０６で切り替えられた別のハッシュ関数を元のハッシュ関数に戻す。上記所定のタイミングとは、例えば、ハッシュテーブルがクリアされるとき、又は、所定の長さの文字列が処理されるごとでありうる。
【０１３７】
ハッシュテーブルがクリアされることは例えば、入力データから新規文字列を読み込むとき、又は、スライド・ウィンドウに新しい入力データが読み取られるときに行われうる。従って、ステップ５０６で切り替えられた別のハッシュ関数を元のハッシュ関数に戻すことは、新しい入力ストリームをバッファに読み込む直前に行われうる。
【０１３８】
切り替えられたハッシュ関数は、元のハッシュ関数から計算されたハッシュ値を用いて検索可能であった短い文字列を見つけることができない。なぜならば、元のハッシュ関数のために選択される文字列（例えば、３バイトからなる文字列）は、選択される文字列（例えば、４バイトからなる文字列）を使用する切り替えられたハッシュ関数では一般に異なるハッシュ値になるため見つけられないからである。
【０１３９】
そこで、上記所定のタイミングにおいて、ステップ５０６で切り替えられた別のハッシュ関数を元のハッシュ関数に戻すことで、元のハッシュ関数のために選択される文字列（例えば、３バイトからなる文字列）を再び見つけることが可能になる。
【０１４０】
コンピュータ（１０１）は、ステップ５０６で切り替えられた別のハッシュ関数を元のハッシュ関数に戻すことに応じて、処理をステップ５０２に戻す。コンピュータ（１０１）は、処理がステップ５０２に戻ることに応じて、上記バッファ（１０３）をクリアし、入力ストリーム中の所定の数の次の文字列を当該バッファ（１０３）内に読み込む。そして、コンピュータ（１０１）は、次のステップ５０３において、上記ステップ５０３で説明した処理を上記元に戻された元のハッシュ関数を使用して行う。
【０１４１】
ステップ５１１において、コンピュータ（１０１）は、データ圧縮アルゴリズムをメモリ（１０３）に読み込んで、データを圧縮する処理を終了する。
【０１４２】
上記したとおり、ステップ５０９及びステップ５１０は任意のステップである。従って、ステップ５０６において、別のハッシュ関数に切り替えられた後に、ステップ５０９及びステップ５１０を経由せずに、処理がステップ５０２に戻る場合もありうる。このような場合には、コンピュータ（１０１）は、処理がステップ５０２に戻ることに応じて、上記バッファ（１０３）をクリアし、入力ストリーム中の所定の数の次の文字列を当該バッファ（１０３）内に読み込み、そして、コンピュータ（１０１）は、次のステップ５０３において、上記ステップ５０３で説明した処理を上記切り替えられた別のハッシュ関数をそのまま使用して行う。従って、処理がステップ５０６に更に進んだ場合には、コンピュータ（１０１）は、当該切り替えられた別のハッシュ関数を、当該別のハッシュ関数が使用する文字列の選択された部分をさらに広げる別のハッシュ関数に切り替えうる。
【０１４３】
図５に示すフローチャートに従い圧縮されたデータは、ハッシュ関数の切り替えが行われたかどうかに関わらず、従来と同じ手法により復号することが可能である。すなわち、データ圧縮において、ハッシュ関数を切り替えることは、復号処理に何ら影響しない。
【０１４４】
図６は、図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従いデータ圧縮をするコンピュータの機能ブロック図の一例を示した図である。
【０１４５】
コンピュータ（６０１）は、本発明の実施態様に従い、上記最適化したバイナリー・モジュールをテストするためのコンピュータであり、例えば図１に示すコンピュータ（１０１）でありうる。
【０１４６】
コンピュータ（６０１）は、圧縮手段（６１１）、ハッシュテーブル格納手段（６１２）、指標取得手段（６１３）、及びハッシュ関数切り替え手段（６１４）、並びに任意的に、回復手段（６１５）を備えている。
【０１４７】
圧縮手段（６１１）は、辞書としてハッシュテーブルを適用可能であり、動的に辞書を作りながらデータを圧縮する任意のデータ圧縮アルゴリズムを実行する。
【０１４８】
ハッシュテーブル格納手段（６１２）は、圧縮手段（６１１）によって作成されるハッシュテーブルを格納する。当該ハッシュテーブルは例えば、メモリ（１０３）又は記憶媒体（１０８）中に格納されうる。
【０１４９】
指標取得手段（６１３）は、文字列の選択された部分にハッシュ関数を適用して計算されたハッシュ値であって、ハッシュテーブルに過去に登録された当該ハッシュ値を持つバケット・チェーンの各エントリの検索において一致する最大文字列が見つからず、当該検索が無駄になったことを示す指標を取得する。当該指標は例えば、上記（１）若しくは上記（２）で示す時間、又は、上記（３）若しくは上記（４）で示す頻度でありうる。
【０１５０】
ハッシュ関数切り替え手段（６１４）は、指標取得手段（６１３）が取得した指標が所定の閾値を超えたときに、ハッシュテーブルを再構築することなしに、現在使用中のハッシュ関数を、文字列の選択された部分を広げる別のハッシュ関数に切り替える。
【０１５１】
回復手段（６１５）は、任意的に、所定のタイミングで、前記別のハッシュ関数を、元のハッシュ関数に戻す。
【０１５２】
（実施例１）
本発明の実施態様に従い、３バイトを使用するハッシュ関数を、４バイトを使用するハッシュ関数に動的に切り替えるようにし（但し、元のハッシュ関数に戻す処理はなし）、デフォルトの圧縮レベル及び最大圧縮レベルそれぞれで、同一のファイル（埋め込まれたフォントを有するＰＤＦデータ）についてデータ圧縮を行った。
【０１５３】
（比較例１）
実施例１と同一の環境下において、ハッシュ関数を切り替えること無しに、３バイトを使用するハッシュ関数をそのまま使用して、デフォルトの圧縮レベル及び最大圧縮レベルそれぞれで、実施例１と同一のファイルについてデータ圧縮を行った。
【０１５４】
（実施例２）
本発明の実施態様に従い、３バイトを使用するハッシュ関数を、４バイトを使用するハッシュ関数に動的に切り替えるようにし、また、元のハッシュ関数に戻す処理をさらに行うようにして、デフォルトの圧縮レベル及び最大圧縮レベルそれぞれで、同一のファイルについてデータ圧縮を行った。
【０１５５】
（比較例２）
実施例２と同一の環境下において、ハッシュ関数を切り替えること無しに、３バイトを使用するハッシュ関数をそのまま使用して、デフォルトの圧縮レベル及び最大圧縮レベルそれぞれで、実施例２と同一のファイルについてデータ圧縮を行った。
【０１５６】
（実施例１：デフォルトの圧縮レベル）
デフォルトの圧縮レベルでは、比較例１と比べて、約２０％のパフォーマンス向上（実行時間短縮）が見られた。また、ファイルの圧縮サイズについて、実施例１に従う圧縮後のファイルサイズが、比較例１に従う圧縮後のファイルサイズに比べて約２％改善されていた。
【０１５７】
（実施例１：最大圧縮レベル）
最大圧縮レベルでは、比較例１と比べて、約７３％のパフォーマンス向上が見られた。また、ファイルの圧縮サイズについて、実施例１に従う圧縮後のファイルサイズが、比較例１に従う圧縮後のファイルサイズに比べて約２％改善されていた。
【０１５８】
（実施例２：デフォルトの圧縮レベル）
デフォルトの圧縮レベルでは、比較例２と比べて、約１３％のパフォーマンス向上が見られた。また、ファイルの圧縮サイズについて、実施例２に従う圧縮後のファイルサイズが、比較例２に従う圧縮後のファイルサイズに比べて約１％改善されていた。
【０１５９】
（実施例２：最大圧縮レベル）
最大圧縮レベルでは、比較例２と比べて、約６１％のパフォーマンス向上が見られた。また、ファイルの圧縮サイズについて、実施例２に従う圧縮後のファイルサイズと比較例２に従う圧縮後のファイルサイズとはほぼ同じであった。
【０１６０】
以上に示す実施例１及び２それぞれの結果から、本発明の実施態様に従うと、圧縮後のファイルサイズをほぼ保ちながら、大幅なパフォーマンス向上が図られた。
【図１】
2015186077.tif 000003
【図２】
2015186077.tif 000004
【図３】
2015186077.tif 000005
【図４】
2015186077.tif 000006
【図５】
2015186077.tif 000007
【図６】
2015186077.tif 000008