以下に添付図面を参照して、情報処理プログラム、情報検索プログラム、情報処理装置、および情報検索装置の好適な実施の形態を詳細に説明する。まず、本実施の形態にかかる2n分枝ハフマン木について説明する。
<対象ファイルの圧縮までの処理の流れ>
図1は、対象ファイルの圧縮までの処理の流れを示す説明図である。本実施の形態では、まず、(1)情報処理装置が、対象ファイル群Fsを読み込んで対象ファイル群Fs内に出現する文字の出現頻度を集計する。対象ファイル群Fsは、数千〜数万種の文字(厳密には文字コード)が記述されている電子文書である。
対象ファイル群Fsは文字コードが含まれていれば、テキスト形式でもよく、HTML(HyperText Markup Language)やXML(Extensible Markup Language)で記述されていてもよい。対象ファイル群Fsとしては、たとえば、国語辞典、外国語辞典(英和や和英など)、専門用語辞典などの辞書データやWebページを適用することができる。
出現頻度とは、文字が出現する回数である。たとえば、対象ファイル群Fsのファイル数が3個(F1〜F3)であり、ある文字Xの出現回数が対象ファイルF1で2回、対象ファイルF2で3回、対象ファイルF3で0回の場合、文字Xの出現頻度は5である。文字ごとに集計された出現頻度を集計結果10とする。
つぎに、(2)情報処理装置が、集計結果10を用いて2n分枝ハフマン木H1を生成する。2n分枝ハフマン木H1とは、節点からその下位節点への枝数が2n本のハフマン木である。nはn≧2の自然数である。節点の階層数はk(kはk≧2の自然数)である。また、第i階層(iは1≦i≦kの自然数)の節点数は2n(i−1)である。各節点が上位節点へのポインタを格納している。
また、各節点は、2n個の葉または下位節点への2n個のポインタを格納可能である。本実施の形態では、日本語の漢字等は16ビットコードで表現されるため、16ビットの文字コードを圧縮/伸長の対象とする場合はn=4、k=4として説明する。2n分枝ハフマン木H1の詳細については、図2−1および図2−2において後述する。
つぎに、(3)情報処理装置は、2n分枝ハフマン木H1を2m分枝の無節点ハフマン木H2に変換する。無節点ハフマン木H2とは、根と葉のみからなる内部節点のないハフマン木である。無節点ハフマン木H2は、枝の本数が多くなるが、根から1パスで葉にアクセスすることができるハフマン木である。無節点ハフマン木H2の詳細については、図26において後述する。
このあと、(4)情報処理装置は、対象ファイル群Fsを1ファイルずつ読み込んで無節点ハフマン木により圧縮符号を探索する。そして、(5)探索された圧縮符号を並べてファイル化することで対象ファイル群Fsを圧縮する。これにより、圧縮ファイル群fsが得られることとなる。
また、(6)上記(5)の処理と並行して、圧縮符号マップ群Msを生成する。圧縮符号マップ群Msとは、圧縮符号マップMの集合であり、圧縮符号マップMとは、対象ファイル群Fsでの各文字の存否を文字ごとに示すテーブルである。圧縮符号マップ群Msを用いることにより、検索キーワードを構成する文字を含む圧縮ファイル群fsを絞り込むことができる。圧縮符号マップ群Msは、具体的には、たとえば、RAM、磁気ディスク、光ディスクなどの記憶媒体に記憶されており、CPUがアクセス可能である。
圧縮符号マップ群Msは、具体的には、文字ごとの対象ファイル数分のビット列により構成されている。たとえば、文字Xについてファイル番号#に対応するビットの値が「1」であれば、文字XはファイルF♯に存在することを示す。一方、文字Xについてファイル番号#に対応するビットの値が「0」であれば、文字XはファイルF♯に存在しないことを示す。圧縮符号マップ群Msの詳細については、図39−1および図39−2において後述する。
<2n分枝ハフマン木の内容>
図2−1は、2n(n=4により2n=16)分枝ハフマン木の生成元となる節点集合体を示す説明図である。図2−1の節点集合体100において、第1階層では1個の節点の構造体セル、第2階層では16個の節点の構造体セル、第3階層では256個の節点の構造体セル、第4階層では4096個の節点の構造体セルを有する。各構造体セルC(i,j)は、リンク元となる上位節点のポインタを格納している。最上位となる第1階層の節点の構造体C(1,1)は、根の構造体であるため、上位節点のポインタはない。
図2−2は、2n分枝ハフマン木を示す説明図である。図2−2では、n=4、すなわち、16分枝ハフマン木である。2n分枝ハフマン木は、具体的には、たとえば、RAM、磁気ディスク、光ディスクなどの記憶媒体に記憶されており、CPUがアクセス可能である。
2n分枝ハフマン木H1において、根は図2−1の第1階層の節点の構造体セルC(1,1)に相当する。また、(A)〜(C)は節点または葉を示している。図2−2中、□は葉を示しており、■は節点を示している。下位節点/葉に枝が出ていない■は、使用されない節点である。また、葉の直下の数字は、葉の番号を示している。以降、葉をL♯(♯は葉の番号)と表記する。
すなわち、(A)の□は第1階層の根からリンクする葉L1〜L3である。また、■は根からリンクする第2階層の節点であり、節点の構造体セルC(2,4)〜C(2,16)に相当する。(B)の□は第2階層の節点からリンクする葉L4〜L134である。また、■は根からリンクする第3階層の節点であり、節点の構造体セルC(3,135)〜C(3,256)に相当する。(C)の□は第3階層の節点からリンクする葉L135〜L1295である。また、■は根からリンクする第4階層の節点であり、節点の構造体セルC(4,1296)〜C(4,4096)に相当する。つぎに、圧縮の前処理について説明する。
<圧縮前処理>
図3は、圧縮前処理を示す説明図である。対象ファイル群Fsには数千〜数万種の文字が記述されており、本プログラムでは、対象ファイル群Fs内の文字コードについて出現頻度を集計して降順にソートする。そして、高位(たとえば、1〜1024位まで)の文字コードと低位(1025位以下)の文字コードに分ける。
高位の文字コードは出現頻度が高いため、16ビットコードとして圧縮符号を割り当てる。低位の文字コードは、上位8ビットと下位8ビットに分割する。16ビットコードでは最大で65536(256×256)種の文字を扱えるが、低位の文字コードを、8ビットで分割することにより、6万種以上ある低位の文字コードを256種の分割文字コードに抑えることができる。
たとえば、漢字の「兎」の16ビットの文字コードは“0x514E”であるため、上位8ビット“0x51”と下位8ビット“0x4E”に分割する。同様に、漢字の「兆」の16ビットの文字コードは“0x5146”であるため、上位8ビット“0x51”と下位8ビット“0x46”に分割する。そして、分割された8ビットの分割文字コードの出現頻度を集計する。この「兎」および「兆」の例では、分割文字コード“0x51”の出現頻度は2回、分割文字コード“0x4E”,“0x46”は1回となる。
また、<p>や<p/>といったタグなどを予約語とする。予約語は数十種決めておく。そして、高位文字コード群、分割文字コード群および予約語群を混在させて出現頻度を再集計し、出現頻度の降順に再ソートする。これにより、出現頻度の降順にソートされた約1300種の文字コードが得られる。文字コード種をこの程度の数に抑えることで、16ビットの文字コードを12ビット以下の圧縮符号に圧縮し、圧縮符号を16ビットの文字コードに伸長することが可能となる。
<情報処理装置のハードウェア構成>
図4は、実施の形態にかかる情報処理装置のハードウェア構成を示すブロック図である。図4において、情報処理装置は、CPU(Central Processing Unit)401と、ROM(Read‐Only Memory)402と、RAM(Random Access Memory)403と、磁気ディスクドライブ404と、磁気ディスク405と、光ディスクドライブ406と、光ディスク407と、ディスプレイ408と、I/F(Interface)409と、キーボード410と、マウス411と、スキャナ412と、プリンタ413と、を備えている。また、各構成部はバス400によってそれぞれ接続されている。
ここで、CPU401は、情報処理装置の全体の制御を司る。ROM402は、ブートプログラムなどのプログラムを記憶している。RAM403は、CPU401のワークエリアとして使用される。磁気ディスクドライブ404は、CPU401の制御にしたがって磁気ディスク405に対するデータのリード/ライトを制御する。磁気ディスク405は、磁気ディスクドライブ404の制御で書き込まれたデータを記憶する。
光ディスクドライブ406は、CPU401の制御にしたがって光ディスク407に対するデータのリード/ライトを制御する。光ディスク407は、光ディスクドライブ406の制御で書き込まれたデータを記憶したり、光ディスク407に記憶されたデータをコンピュータに読み取らせたりする。
ディスプレイ408は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ408は、たとえば、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
インターフェース(以下、「I/F」と略する。)409は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク414に接続され、このネットワーク414を介して他の装置に接続される。そして、I/F409は、ネットワーク414と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F409には、たとえばモデムやLANアダプタなどを採用することができる。
キーボード410は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス411は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
スキャナ412は、画像を光学的に読み取り、情報処理装置内に画像データを取り込む。なお、スキャナ412は、OCR(Optical Character Reader)機能を持たせてもよい。また、プリンタ413は、画像データや文書データを印刷する。プリンタ413には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
<情報処理装置の機能的構成1>
図5は、実施の形態にかかる情報処理装置の機能的構成1を示すブロック図である。図5では、図1に示した処理の流れ(1)〜(6)のうち、(1)および(2)の処理を実行する機能的構成を示している。図5において、情報処理装置500は、入力部501と、取得部502と、分類部506と、算出部507と、2n分枝ハフマン木生成部(ポインタ生成部508、ポインタ格納部509、葉生成部510、文字コード格納部511)と、検出部512と、特定部513と、最適化部514と、文字構造体生成部515と、を備えている。
入力部501〜文字構造体生成部515は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されたプログラムをCPU401に実行させることにより、または、I/F409により、その機能を実現する。
入力部501は、対象ファイル群Fsから文字コードを入力する機能を有する。具体的には、たとえば、CPU401が対象ファイル群Fsを走査して2nビットの文字コードを順次対象ファイル群Fsから読み出す。読み出された文字コードはCPU401内のレジスタに保持される。
取得部502は、対象ファイル群Fsに記述されている2nビットの文字コードの出現頻度の集計結果を取得する機能を有する。集計結果さえ取得できれば、集計結果自体を直接読み込んでもよく、また、入力部501によりレジスタにセットされる文字コードを順次集計してもよい。後者の場合、取得部502は、具体的には、たとえば、集計部503とソート部504とを有する。集計部503は、レジスタにセットされる文字コードの数を集計する。たとえば、CPU401がレジスタにセットされる文字コードと一致する文字コードについて文字出現頻度集計テーブルの計数値をインクリメントする。
図6は、文字出現頻度集計テーブルを示す説明図である。文字出現頻度集計テーブル600は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されており、CPU401がアクセス可能である。文字出現頻度集計テーブル600は、文字ごとに計数値を記憶する。文字項目は実際には説明の便宜上、各種文字が割り当てられているが、実際には入力文字コードと比較するため文字コードが割り当てられている。すなわち、CPU401は、入力文字コードを文字項目で走査することで一致する文字コードを検出する。そして、検出された場合に計数値を1ポイントインクリメントする。
図7は、予約語出現頻度集計テーブルを示す説明図である。予約語出現頻度集計テーブル700も、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されており、CPU401がアクセス可能である。予約語出現頻度集計テーブル700は、予約語ごとに計数値を記憶する。予約語項目は説明の便宜上、各種文字が割り当てられているが、実際には入力文字コードと比較するため文字コード列が割り当てられている。すなわち、図6に示した文字出現頻度集計テーブル600との照合に先立って、CPU401は、入力文字コードを予約語項目で走査することで一致する文字コードを検出する。
一致する場合は、次の入力文字コードを予約語項目で走査する。これを繰り返し、一致する文字コード列が検出された場合、その予約語の文字コード列の計数値を1ポイントインクリメントする。不一致の文字コードが出現した場合は、文字出現頻度集計テーブル600にアクセスして、これまで一致した文字コード列の各文字コードの計数値を1ポイントインクリメントする。そして、不一致となった文字コードについては、上述したように、文字出現頻度集計テーブル600を用いて集計する。
図5に戻って、ソート部504は、集計結果をソートする機能を有する。具体的には、たとえば、CPU401は、文字出現頻度集計テーブル600の文字(文字コード)や予約語出現頻度集計テーブル700の予約語を計数値の降順にソートする。
図8は、文字コードおよび予約語の出現頻度を統合した集計結果テーブルを示す説明図である。集計結果テーブル800では、出現頻度(計数値)の降順に文字コードまたは予約語がソートされている。集計結果テーブル800も、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されており、CPU401がアクセス可能である。
取得部502では、さらに、文字コードまたは予約語ごとに出現率を計算し、出現率に応じた出現率領域を特定する。出現率とは、対象ファイル群Fs内の全ファイル数を母集団(分母)とし、当該文字コードまたは予約語が存在するファイル数を分子とした値である。出現率領域とは、出現率の範囲をあらわす情報であり、圧縮符号マップ群Msの圧縮に用いられるハフマン木(以下、「圧縮符号マップ用ハフマン木」)を特定する。出現率領域および圧縮符号マップ用ハフマン木については後述する(図42−1〜図42−4を参照。)。
分割部505は、ソート部504によってソートされた結果、文字コードのうち出現頻度の高位の文字コードと低位の文字コードとに分け、低位の文字コードを上位ビットコードと下位ビットコードに分割する機能を有する。具体的には、たとえば、文字出現頻度集計テーブル600の文字(コード)を計数値の降順にソートした結果、たとえば、1位〜1024位までの文字コードを高位文字コードとし、1025位以降の文字コードを低位文字コードとする。CPU401は、この低位文字コードを、図3の例1)や例2)に示したように、上位8ビットコードと下位8ビットコードに分割する。
上位8ビットコードや下位8ビットコードといった分割文字コードは、最大256種となる。16ビットコードでは最大6万種以上の文字が割り当てられ、同数の葉が必要となるが、出現順位の低い低位文字コードを分割することで、1025位以降の最大約6万種の文字コードを、たかだか256種の分割文字コードで表現できる。したがって、文字コードに割り当てる葉の数を大幅に削減(1024+256+予約語数十種)することができる。この場合、集計部503は、分割文字コードの出現頻度を再集計する。さらに、分割文字コードが上位8ビットに出現した出現頻度と下位8ビットに出現した出現頻度に分けて再集計する。
図9−1は、分割文字出現頻度集計テーブルを示す説明図である。分割文字出現頻度集計テーブル901も、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されており、CPU401がアクセス可能である。そして、ソート部504では、16ビットである高位文字コード、予約語、分割文字コード(以下、「文字コード等」という)を統合して、図8に示した集計結果テーブル800を更新する。
図9−2は、上位8ビットに関する分割文字出現頻度集計テーブルを示す説明図である。分割文字出現頻度集計テーブル902も、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されており、CPU401がアクセス可能である。分割文字出現頻度集計テーブル902は、圧縮符号マップ群Msの生成に用いられる。
図9−3は、下位8ビットに関する分割文字出現頻度集計テーブルを示す説明図である。分割文字出現頻度集計テーブル903も、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されており、CPU401がアクセス可能である。分割文字出現頻度集計テーブル903は、圧縮符号マップ群Msの生成に用いられる。
分類部506は、取得部502によって取得された集計結果に基づいて、文字コード等を出現確率Pに応じて階層別に分類する機能を有する。具体的には、たとえば、文字出現頻度集計テーブル600を参照して、文字コード等を出現確率Pに応じて階層別に分類する。
ここで、出現確率Pとは、文字コード等の総数を、対象となる文字コード等の出現数(文字出現頻度集計テーブル600の計数値)で除算した値である。CPU401は、各文字コード等の出現確率Pを算出する。そして、算出された出現確率Pを階層別に分類する。たとえば、第i階層の場合、1/2ni≦P<1/2n(i−1)となる文字コードでグループ化する。ただし、第1階層(i=1)のときは1/2ni≦P<1、第n階層(i=n)のときはP<1/2n(i−1)でグループ化する。
たとえば、n=4の場合、第1階層の文字コード等は、出現確率Pが1/16≦P<1となる文字コードである。また、第2階層の文字コード等は、1/32≦P<1/16となる文字コードである。また、第3階層の文字コード等は、1/4096≦P<1/32となる文字コードである。また、第4階層の文字コード等は、P<1/4096となる文字コードである。分類結果である階層番号iや集計結果テーブル800における順位は、文字コード等ごとに付与される。集計結果テーブル800における順位は、その文字コード等の葉の番号となる。
算出部507は、分類部506によって分類された第i階層の文字コード数に基づいて、第i階層の葉へのポインタ数を算出する機能を有する。また、当該第i階層の葉へのポインタ数に基づいて、(i+1)階層の節点をリンク先とする第i階層の下位節点へのポインタ数と第i階層の節点の使用数とを算出する機能を有する。
具体的には、たとえば、CPU401は、節点集合体100と分類結果から、第i階層について、構造体セル数N(i)、葉の数Nl(i)、葉へのポインタ数Nlp(i)、下位節点へのポインタ数Nnp(i)、構造体セル使用数Ncu(i)、葉へのポインタ数の累計値ΣNlp(i)、先頭からの空きセル数Ncst(i)、末尾までの空きポインタ数Npse(i)、末尾までの空きセル数Ncse(i)を算出する。
図10は、算出部507による算出結果テーブルを示す説明図である。算出結果テーブル520も、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されており、CPU401がアクセス可能である。算出結果テーブル520には、階層ごとに算出された各項目の値がCPU401により書き込まれる。図10では、n=4の場合の算出結果を示している。
構造体セル数N(i)とは、第i階層の節点の構造体セルC(i,j)の個数である。構造体セル数N(i)は、CPU401が節点集合体100の各階層の節点の構造体セルC(i,j)の個数を計数することで得られる。n=4の場合、第1階層は1個(根)、第2階層は16個、第3階層は256個、第4階層は4096個である。
葉の数Nl(i)とは、第i階層の葉の構造体の個数である。葉の数Nl(i)は、分類結果である階層ごとの文字コード数となる。図10の例では、第1階層は3個、第2階層は54個、第3階層は353個、第4階層は885個である。
葉へのポインタ数Nlp(i)とは、第i階層の節点の構造体セルC(i,j)に格納する葉へのポインタの総数である。葉へのポインタ数Nlp(i)は葉の数Nl(i)と同数である。
下位節点へのポインタ数Nnp(i)とは、第i階層の節点の構造体セルC(i,j)に格納する下位節点へのポインタの総数である。下位節点をポイントするため、第(i+1)階層の葉へのポインタ数Nlp(i+1)と下位節点へのポインタ数Nnp(i+1)に依存する。たとえば、CPU401は、下記式(1)により、下位節点へのポインタ数Nnp(i)を算出する。
Nnp(i)={Nlp(i+1)+Nnp(i+1)}/2n+1・・・(1)
ただし、端数は切り捨て。また、i=nのときは、下位節点が存在しないため、Nnp(i)=0。
構造体セル使用数Ncu(i)とは、第i階層において、構造体セルC(i,j)のうち、葉へのポインタおよび下位節点へのポインタが格納される構造体セルC(i,j)の総数である。たとえば、CPU401は、下記式(2)により、構造体セル使用数Ncu(i)を算出する。
Ncu(i)={Nlp(i)+Nnp(i)}/2n+1・・・(2)
ただし、端数は切り捨て。
葉へのポインタ数の累計値ΣNlp(i)とは、第1階層から第i階層までの葉へのポインタ数Nlp(i)の総和である。
先頭からの空きセル数Ncst(i)とは、第i階層の先頭となる構造体セルC(i、1)からの不使用セル数である。もともと節点集合体100を構成する構造体セルC(i,j)には、それぞれ上位節点へのポインタが格納されているが、その上位節点の構造体セルC(i−1,j)が葉Ljの構造体とリンクすると、葉Ljの構造体には、構造体セルC(i,j)と同一の上位節点へのポインタが格納されることとなる。
このように、ポインタが重複するため、葉Ljの構造体に格納される上位節点へのポインタを優先するために、先頭からの空きセル数Ncst(i)を計算する。具体的には、たとえば、CPU401は、下記式(3)により、先頭からの空きセル数Ncst(i)を算出する。
Ncst(i)=ΣNlp(i−1)・・・(3)
ただし、i=1のときは、Ncst(i)=0。
したがって、図10の例では、第2階層では、構造体セルC(2,1)〜C(2,3)が先頭からの空きセル(不使用セル)となる。また、第3階層では、構造体セルC(3,1)〜C(3,57)が先頭からの空きセル(不使用セル)となる。同様に、第4階層では、構造体セルC(4,1)〜C(4,410)が先頭からの空きセル(不使用セル)となる。
末尾までの空きポインタ数Npse(i)とは、第i階層において、先頭からの空きセルの次の構造体セルC(i,j)から葉へのポインタおよび下位節点へのポインタが格納された場合の空きポインタの総数である。なお、先頭からの空きセルの空きポインタは除かれる。具体的には、たとえば、CPU401は、下記式(4)により、末尾までの空きポインタ数Npse(i)を算出する。
Npse(i)
=N(i)×2n−Nlp(i)−Nnp(i)−Ncst(i)×2n・・・(4)
末尾までの空きセル数Ncse(i)とは、第i階層の構造体セル群のうち、先頭からの空きセルと葉へのポインタや下位節点へのポインタが格納された構造体セルC(i,j)を除いた残余の構造体セルC(i,j)の個数である。具体的には、たとえば、CPU401は、下記式(5)により、末尾までの空きセル数Ncse(i)を算出する。
Ncse(i)=N(i)−Ncu(i)−Ncst(i)・・・(5)
ポインタ生成部508は、算出部507によって算出された算出結果に基づいて、第i階層の葉へのポインタと第i階層の下位節点へのポインタを生成する機能を有する。具体的には、たとえば、CPU401が算出結果テーブル520にアクセスして、第i階層の葉へのポインタ数と下位節点へのポインタ数を取得する。
2n分枝ハフマン木H1では、節点からの枝本数は2n本なので、n=4の場合、枝番号となる下位節点へのポインタは4ビットコードとなる。たとえば、第1階層の根C(1,1)においては、葉L1へのポインタは“0000”、葉L2へのポインタは“0001”、葉L3へのポインタは“0010”となる。また、下位節点C(2,4)へのポインタは“0011”、下位節点C(2,5)へのポインタは“0100”、…、下位節点C(2,8)へのポインタは“0111”となる。生成されたポインタは、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に一時的に保持される。
ポインタ格納部509は、第i階層の使用数分の節点に、ポインタ生成部508によって生成された第i階層の葉へのポインタと第i階層の下位節点へのポインタとを格納する機能を有する。具体的には、たとえば、CPU401は、第i階層の構造体セルC(i,j)のうち、ポインタの格納可能な先頭の構造体セルを特定する。
具体的には、たとえば、CPU401が算出結果テーブル520にアクセスして、先頭からの空きセル数Ncst(i)を取得する。そして、ポインタの格納可能な先頭の構造体セルC(i,j)を、構造体セルC(i,Ncst(i)+1)に決定する。この構造体セルC(i,Ncst(i)+1)以降の構造体セルに、まず葉へのポインタを葉の番号順に格納し、ついで、下位節点へのポインタを格納する。葉へのポインタおよび下位節点へのポインタが格納された構造体セルの総数は、算出結果テーブル520の構造体セル使用数Ncu(i)に一致する。
葉生成部510は、分類部506によって分類された第i階層の文字ごとに、ポインタ格納部509によって第i階層の節点に格納された葉へのポインタにより第i階層の節点のリンク先となる葉を、文字コードごとに生成する機能を有する。具体的には、たとえば、階層ごとに、葉の数Nl(i)分の葉L♯の構造体を生成する。葉L♯の構造体は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶される。
図11は、2n(16)分枝ハフマン木の構造体を示す説明図である。n=4の16分枝の場合、ハフマン木は1個の第1階層の節点(根)の構造体1101、16個の第2階層の節点の構造体1102、256個の第3階層の節点の構造体1103、4096個の第4階層の節点の構造体1104、および1295個の葉L#の構造体1105で構成される。
節点の構造体は、上位節点へのポインタ1110と下位第1節点へのポインタ1111〜第16節点へのポインタ1126の17種のポインタで構成される。葉L♯の構造体は、第1領域1131〜第4領域1134を有する。第1領域1131には、上位節点へのポインタが格納される。具体的には、たとえば、第i階層のj番目の節点の構造体の下位第12節点へのポインタがl番目の葉L♯の構造体をポイントしていた場合、第1領域1131には、第i階層のj番目の節点の構造体への先頭アドレス(ポインタ)が格納される。
また、第2領域1132には、葉の標識および伸長種別などが格納される。葉の標識とは、圧縮や伸長の際に参照されるフラグであり、「0」(OFFを示す)の場合は一般の節点を、「1」(ONを示す)の場合は葉を意味する。伸長種別は、伸長対象の出現頻度が高位の16ビットの文字コードか、低位文字コードから分割された上位8ビットの分割文字コードか、低位文字コードから分割された下位8ビットの分割文字コードか、または予約語かを示す識別子である。第3領域1133には、伸長種別に対応して、高位の16ビット文字コード、8ビットの分割文字コード、または予約語へのポインタが格納される。第4領域1134には、図8に示した出現率領域が格納される。
文字コード格納部511は、葉生成部510によって生成された葉に、当該葉の番号に対応付けられた文字コードを格納することにより、2n分枝ハフマン木H1を生成する機能を有する。具体的には、たとえば、文字コードの出現頻度の順位(図8を参照)と一致する葉L♯の番号♯を格納する葉L♯の構造体の第3領域1133にその文字コードを格納する。予約語の場合は、予約語へのポインタを格納する。なお、第3領域1133の大きさによっては予約語の文字コード列を格納してもよい。また、文字コード格納部511は、文字コードの格納とともに、格納する文字コードの出現率領域も、集計結果テーブル800から読み出して、第4領域1134に格納する。
このように、葉生成部510によって生成された葉L♯の構造体を図1に示した節点集合体100の該当する節点の構造体セルC(i,j)にリンクさせ、ポインタ格納部509により節点集合体100の構造体セルC(i,j)に葉L♯へのポインタを格納し、文字コード格納部511により葉L♯の構造体に文字コードや予約語のポインタを格納することで、節点集合体100から2n分枝ハフマン木H1が生成される。
図12は、2n分枝ハフマン木H1の構造体を示す説明図である。2n分枝ハフマン木H1は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶される。図12では、n=4、すなわち、16分枝ハフマン木を示している。
検出部512は、第i階層の葉へのポインタ数と第(i−1)階層の空き節点内の空きポインタ数とを検出する機能を有する。具体的には、たとえば、CPU401が、算出結果テーブル520から第i階層の葉へのポインタ数Nlp(i)と第(i−1)階層の末尾までの空きポインタ数Npse(i−1)とを読み出す。
特定部513は、検出部512によって検出された第i階層の葉へのポインタ数と第(i−1)階層の空き節点内の空きポインタ数とに基づいて、第i階層から第(i−1)階層の空き節点への移動対象となる第i階層の葉L♯へのポインタ(以下、「移動対象ポインタ」という)を特定する機能を有する。具体的には、たとえば、CPU401が、読み出された第i階層の葉へのポインタ数Nlp(i)と第(i−1)階層の末尾までの空きポインタ数Npse(i−1)と第(i−1)階層の下位節点へのポインタ数Nnp(i−1)を用いて、下記式(6)により判断する。
Npse(i−1)+Nnp(i−1)>Nlp(i)・・・(6)
(6)式を満たす場合、第i階層の葉L♯へのポインタはすべて第(i+1)階層に移動可能である。(6)式を満たさない場合、第(i−1)階層の末尾までの空きポインタ数Npse(i−1)と同数の第i階層の葉へのポインタを移動対象ポインタとする。たとえば、図11の2n分枝ハフマン木H1を最適化する場合、算出結果テーブル520を参照すると、i=4の場合、第4階層の葉へのポインタ数Nlp(4)=885、第3階層の末尾までの空きポインタ数Npse(3)=2775、第3階層の下位節点へのポインタ数Nnp(3)=56であるため、(6)式を満たすこととなる。したがって、第4階層の葉L411へのポインタ〜葉L1295へのポインタはすべて第3階層の空きセル内に移動可能となる。
最適化部514は、特定部513によって特定された移動対象ポインタを格納する節点へのポインタを第(i−1)階層の節点から削除し、移動対象ポインタを第(i−1)階層の節点に移動させる機能を有する。具体的には、たとえば、上記の例では、移動対象ポインタ(第4階層の葉L411へのポインタ〜葉L1295へのポインタ)を格納する節点C(4,411)〜C(4,466)へのポインタを第3階層から削除する。そして、第3階層の構造体セルC(3,80)から順次、移動対象ポインタを移動させる。すなわち、葉L411の構造体〜葉L1295の構造体は、第4階層から第3階層に昇格する。
これにより、第4階層の場合は圧縮符号長が16ビットであったが、第3階層に昇格することで、圧縮符号長が12ビットに短縮され、圧縮率の向上を図ることができる。このように、第i階層から第(i−1)階層に昇格することで、圧縮符号長がn×iビットからn×(i−1)ビットに短縮され、圧縮率の向上を図ることができる。
また、最適化部514は、最適化する都度、算出結果テーブル520を更新する。図13−1〜図13−3は、最適化する場合の算出結果テーブル520の更新例である。このように、最適化は、最下位の階層から実行することとなる。
図13−1は、第4階層から第3階層へ最適化する場合の算出結果テーブル520の更新例を示す説明図である。図13−1は、図10に示した状態からの更新例を示している。
図13−2は、第3階層から第2階層へ最適化する場合の算出結果テーブル520の更新例を示す説明図である。図13−2は、図13−1に示した状態からの更新例を示している。
図13−3は、第2階層から第1階層へ最適化する場合の算出結果テーブル520の更新例を示す説明図である。図13−3は、図13−2に示した状態からの更新例を示している。
図14は、最適化後の2n分枝ハフマン木H1の構造体を示す説明図である。図12と比較すると、最適化後の2n分枝ハフマン木H1では、第4階層の葉L♯の構造体が存在しない。このように、上位階層の空きポインタに下位階層の葉L♯へのポインタを移動させているため、圧縮符号の短縮化を図ることができる。
図15は、最適化後の2n分枝ハフマン木H1における葉L♯の構造体が格納する情報を示す説明図である。図15の各レコードがそれぞれの葉L♯の構造体が格納する情報に相当する。なお、圧縮符号は2n分枝ハフマン木H1の根から該当する葉L♯までの枝番号となる下位節点へのポインタ〜葉へのポインタのコード列である。
図5に戻って、文字構造体生成部515は、文字構造体530を生成する機能を有する。具体的には、たとえば、CPU401が、予約語出現頻度集計テーブル700、文字出現頻度集計テーブル600、分割文字出現頻度集計テーブル900、2n分枝ハフマン木H1にアクセスし、指定された情報を抽出することで、予約語の構造体、高位文字コードの構造体、および分割上位文字コードの構造体を生成する。
図16は、予約語の構造体を示す説明図である。予約語の構造体1600は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶され、CPU401がアクセス可能である。予約語の構造体1600は、予約語総数(図16の例では15個)、予約語の最大ビット長Lrmax、各予約語r1〜r15とそのビット長および葉L♯へのポインタを格納する。
CPU401は、予約語出現頻度集計テーブル700から予約語総数、各予約語、予約語の最大ビット長、各予約語のビット長を読み出す。また、2n分枝ハフマン木H1にお
ける予約語の葉L♯の構造体から上位節点を特定し、その上位節点の構造体セル内の予約語の葉L♯へのポインタを読み出す。これにより、予約語の構造体1600が生成される。
図17は、高位文字コードの構造体を示す説明図である。高位文字コードの構造体1700は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶され、CPU401がアクセス可能である。高位文字コードの構造体1700は、文字コードe♯とその葉L♯へのポインタを格納する。
CPU401は、文字出現頻度集計テーブル600から文字コードe♯を読み出す。また、2n分枝ハフマン木H1においてその文字コードe♯に対応する葉L♯の構造体から上位節点を特定し、その上位節点の構造体セル内の文字コードe♯に対応する葉L♯へのポインタを読み出す。これにより、高位文字コードの構造体1700が生成される。
図18は、分割文字コードの構造体を示す説明図である。分割文字コードの構造体1800は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶され、CPU401がアクセス可能である。分割文字コードの構造体1800は、分割文字コードとその葉L♯へのポインタを格納する。
CPU401は、分割文字出現頻度集計テーブル900から分割文字コードを読み出す。また、2n分枝ハフマン木H1においてその分割文字コードに対応する葉L♯の構造体から上位節点を特定し、その上位節点の構造体セル内の分割文字コードに対応する葉L♯へのポインタを読み出す。これにより、分割文字コードの構造体1800が生成される。
<2n分枝ハフマン木生成処理手順>
図19は、情報処理装置500が自動実行する2n分枝ハフマン木生成処理手順を示すフローチャートである。図19において、まず、入力部501により対象ファイル群Fsを読み込む(ステップS1901)。つぎに、集計部503により文字コードと予約語の出現頻度を集計する(ステップS1902)。そして、葉数削減処理を実行する(ステップS1903)。つぎに、分類部506により、文字コード等をその出現確率Pに応じて階層別に分類する(ステップS1904)。
このあと、算出部507によるパラメータ算出処理(ステップS1905)、ポインタ生成部508、ポインタ格納部509、葉生成部510、文字コード格納部511による構造体セル構築処理(ステップS1906)、最適化処理(ステップS1907)を実行する。これにより、2n分枝ハフマン木H1が自動生成される。
図20は、図19に示した葉数削減処理(ステップS1903)の詳細な処理手順を示すフローチャートである。まず、ソート部504により、16ビットの文字コードおよび予約語を出現頻度の降順にソートする(ステップS2001)。その順位を参照して、低位文字コードを抽出し(ステップS2002)、低位文字コードを前後8ビットの分割文字コードに分割する(ステップS2003)。そして、分割文字コードの出現頻度を集計する(ステップS2004)。最後に、16ビットの文字コード、分割文字コード、予約語の出現頻度をすべて含めて出現頻度の降順にソートする(ステップS2005)。このあと、ステップS1904に移行する。
図21は、図19に示したパラメータ算出処理(ステップS1905)の詳細な処理手順を示すフローチャートである。まず、階層番号iをi=1にセットし(ステップS2101)、i>kであるか否かを判断する(ステップS2102)。
i>kでない場合(ステップS2102:No)、第i階層における葉L♯へのポインタ数Nlp(i)、第i階層における下位節点へのポインタ数Nnp(i)、第i階層における構造体セルC(i,j)の使用数Ncu(i)、葉へのポインタ数の累計値ΣNlp(i)、第i階層における先頭からの空きセル数Ncst(i)、第i階層における末尾までの空きポインタ数Npse(i)、第i階層における末尾までの空きセル数Ncse(i)を算出する(ステップS2103〜S2109)。
そして、階層番号iを1ポイントインクリメントし(ステップS2110)、ステップS2102に戻る。ステップS2102において、i>kである場合(ステップS2102:Yes)、ステップS1906に移行する。
図22は、図19に示した構造体セル構築処理(ステップS1906)の詳細な処理手順を示すフローチャートである。まず、節点集合体100を読み込み(ステップS2201)、階層番号iをi=1にセットし(ステップS2202)、セル番号jをj=1にセットする(ステップS2203)。そして、第i階層の構造体セルC(i,j)の構築処理を実行する(ステップS2204)。
このあと、jが第i階層の節点数2n(i−1)に対して、j>2n(i−1)であるか否かを判断する(ステップS2205)。j>2n(i−1)でない場合(ステップS2205:No)、jを1ポイントインクリメントし(ステップS2206)、ステップS2204に戻る。一方、j>2n(i−1)である場合(ステップS2205:Yes)、i>kであるか否かを判断する(ステップS2207)。i>kでない場合(ステップS2207:No)、iを1ポイントインクリメントし(ステップS2208)、ステップS2203に戻る。一方、i>kである場合(ステップS2207:Yes)、ステップS1907に移行する。
図23は、図22に示した第i階層の構造体セルC(i,j)の構築処理(ステップS2204)の詳細な処理手順を示すフローチャート(前半)である。まず、Nlp(i)個の葉L♯へのポインタを生成し(ステップS2301)、第i階層に関する葉L♯の構造体を生成する(ステップS2302)。そして、Nnp(i)個の下位節点へのポインタを生成する(ステップS2303)。このあと、セル番号jが先頭からの空きセル数Ncst(i)に対して、j>Ncst(i)であるか否かを判断する(ステップS2304)。
j>Ncst(i)でない場合(ステップS2304:No)、構造体セルC(i,j)を空きセルに決定する(ステップS2305)。そして、jを1ポイントインクリメントし(ステップS2306)、ステップS2304に戻る。一方、j>Ncst(i)である場合(ステップS2304:Yes)、j>Ncst(i)+Ncu(i)であるか否かを判断する(ステップS2307)。Ncu(i)は第i階層における構造体セル使用数である。
j>Ncst(i)+Ncu(i)である場合(ステップS2307:Yes)、ステップS2205に移行する。一方、j>Ncst(i)+Ncu(i)でない場合(ステップS2307:No)、ステップS2401に移行する。
図24は、図22に示した第i階層の構造体セルC(i,j)の構築処理(ステップS2204)の詳細な処理手順を示すフローチャート(後半)である。ステップS2401において、構造体セルC(i,j)に空きがあるか否かを判断する(ステップS2401)。空きがない場合(ステップS2401:No)、jを1ポイントインクリメントして(ステップS2402)、ステップS2401に戻る。
一方、空きがある場合(ステップS2401:Yes)、葉L♯へのポインタを葉の番号♯の若い順に構造体セルC(i,j)に格納する(ステップS2403)。そして、格納した葉L♯のポインタによりリンク先となる葉L♯の構造体に上位節点C(i−1,j)へのポインタを生成・格納する(ステップS2404)。
そして、未保存の葉L♯へのポインタがあるか否かを判断する(ステップS2405)。未保存の葉L♯へのポインタがある場合(ステップS2405:Yes)、ステップS2401に戻る。一方、未保存の葉L♯へのポインタがない場合(ステップS2405:No)、構造体セルC(i,j)に空きがあるか否かを判断する(ステップS2406)。空きがない場合(ステップS2406:No)、jを1ポイントインクリメントして(ステップS2407)、ステップS2406に戻る。
一方、構造体セルC(i,j)に空きがある場合(ステップS2406:Yes)、下位節点へのポインタを節点番号の若い順に構造体セルC(i,j)に格納する(ステップS2408)。そして、未格納の下位節点へのポインタがあるか否かを判断する(ステップS2409)。未格納の下位節点へのポインタがある場合(ステップS2409:Yes)、ステップS2406に戻る。一方、未格納の下位節点へのポインタがない場合(ステップS2409:No)、図23のステップS2304に戻る。
図25は、図19に示した最適化処理(ステップS1907)の詳細な処理手順を示すフローチャートである。まず、階層番号iをi=kとし(ステップS2501)、i=1であるか否かを判断する(ステップS2502)。i=1でない場合(ステップS2502:No)、検出部512により、第i階層の葉L♯へのポインタ数Nlp(i)、第(i−1)階層の下位節点へのポインタ数Nnp(i−1)、および第(i−1)階層の末尾までの空きポインタ数Npse(i−1)を算出結果テーブル520から検出する(ステップS2503)。
そして、Nlp(i)=0であるか否かを判断する(ステップS2504)。Nlp(i)=0である場合(ステップS2504:Yes)、移動させる葉L♯へのポインタがないため、ステップS2509に移行する。一方、Nlp(i)=0でない場合(ステップS2504:No)、Npse(i−1)=0であるか否かを判断する(ステップS2505)。Npse(i−1)=0である場合(ステップS2505:Yes)、空きがないこととなり、ステップS2509に移行する。
一方、Npse(i−1)=0でない場合(ステップS2505:No)、特定部513により、上記(6)式を用いて、第i階層から第(i−1)階層へ移動させる葉L♯へのポインタ(移動対象ポインタ)およびその数を特定する(ステップS2506)。
つぎに、移動対象ポインタを格納している構造体セルC(i,j)をポイントする第(i−1)階層の下位節点C(i,j)へのポインタを第(i−1)階層から削除する(ステップS2507)。そして、移動対象ポインタを第(i−1)階層に移動させ、葉L♯の番号♯が連続するように格納する(ステップS2508)。この後、ステップS2509において、階層番号iを1ポイントデクリメントし(ステップS2509)、ステップS2502に戻る。ステップS2502において、階層番号i=1の場合(ステップS2502:Yes)、一連の処理を終了する。これにより、情報処理装置500が自動実行する2n分枝ハフマン木生成処理手順の一連の説明を終了する。
つぎに、2n分枝ハフマン木H1を用いた圧縮処理と伸長処理について説明する。ここでは、上述した生成処理により自動生成された2n分枝ハフマン木H1を用いてもよく、あらかじめ与えられた2n分枝ハフマン木H1であってもよい。具体的には、2n分枝ハフマン木H1を無節点ハフマン木H2に変換し、無節点ハフマン木H2を用いて圧縮処理と伸長処理を実行する。
<無節点ハフマン木>
ここで、無節点ハフマン木H2について説明する。無節点ハフマン木H2とは、根と葉のみからなる内部節点のないハフマン木である。無節点ハフマン木H2は、枝の本数が多くなるが、根から1パスで葉にアクセスすることができる。無節点ハフマン木H2は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されており、CPU401がアクセス可能である。
図26は、2m分枝の無節点ハフマン木を示す説明図である。2m(m=12)分枝の無節点ハフマン木H2では、根から葉へのポインタとなる枝番号はmビットコードのアドレスとなる。すなわち、葉の番号1〜4096の葉へのポインタは、“000000000000”〜“111111111111”となる。16ビットの文字コードの場合、12ビットコード以下に圧縮されることとなる。なお、mは、m<2nとなる値であり、たとえば、この不等式を満たす値のうち4の倍数で最大のものを用いる。mはnに応じてあらかじめ設定される。たとえば、n=4の場合、m=12とする。
図27は、2m分枝の無節点ハフマン木H2の節点(根)の構造体を示す説明図である。上述の2n分枝ハフマン木H1の場合と同様、葉の総数が1295個であるとすると、葉の数が余ることとなる。したがって、出現頻度の高い文字コード等を格納する葉に対して複数(たとえば、256個)のポインタを用意する。
図27では、出現頻度が高い2n分枝ハフマン木H1の第1階層の葉L1〜L3に対して、それぞれ256個の葉へのポインタを割り当てて根の構造体セルC(1,1)に格納する。また、出現頻度の高い第2階層の葉L4〜葉L134についても、それぞれ16個の葉へのポインタを割り当てて根の構造体セルC(1,1)に格納する。第3階層の葉L135〜葉L1295については、それぞれ1個の葉へのポインタを割り当てて根の構造体セルC(1,1)に格納する。
図28は、無節点ハフマン木H2の葉の構造体を示す説明図である。葉の全体は、第1領域2801〜第5領域2805を有する。無節点ハフマン木H2の葉の構造体は、2n分枝ハフマン木H1の葉の構造体から複写された構造体であるため、第1領域2801〜第4領域2804は、図11の第1領域1131〜第4領域1134に対応する。第1領域2801には、圧縮符号およびその圧縮符号長が格納される。第2領域2802には、図11と同様、葉の標識と伸長種別が格納される。第3領域2803には、図11と同様、伸長種別に応じて高位16ビット文字コード、低位の分割8ビット文字コード、または予約語へのポインタが格納される。
第4領域2804には、図11と同様、出現率領域が格納される。第5領域2805には、符号種別と符号区分が格納される。符号種別とは、文字コードが数字、英字、特殊記号、カタカナ、ひらがな、漢字のいずれに該当するか、または予約語へのポインタであるかを識別する情報である。符号区分とは、文字コードが16ビットであるか8ビットであるかを識別する情報である。16ビットの文字コードである場合または予約語である場合、符号区分として“1”を割り当て、8ビットの分割文字コードの場合、符号区分として“0”を割り当てる。
また、第5領域2805には、圧縮符号マップ群Msへのポインタを構成するアドレス値が格納される。圧縮符号マップ群Msへのポインタとは、圧縮符号マップ群Msのうち葉L♯の構造体に格納されている文字コード固有の圧縮符号マップM♯にアクセスするポインタである。1024種の高位文字コードの場合は、0001〜1024のアドレス値が文字コードごとに割り当てられる。
また、15種の予約語の場合は、1025〜1039のアドレス値が予約語(のポインタ)ごとに割り当てられる。上位8ビットの分割文字コードの場合は、0001〜0256のアドレス値が上位8ビットの分割文字コードごとに割り当てられる。下位8ビットの分割文字コードの場合は、0257〜0512のアドレス値が上位8ビットの分割文字コードごとに割り当てられる。なお、第5領域2805の符号区分とアドレス値により圧縮符号マップ群Msへのポインタを構成する。
図29は、葉L♯の構造体に格納される情報を示す説明図である。各レコードが葉L♯の構造体に相当する。各葉L♯の構造体は、圧縮符号およびその圧縮符号長、葉の番号、伸長種別、文字コード等(文字コード(16/8ビット)または予約語へのポインタ)、圧縮符号マップM♯へのポインタといった情報を含む。圧縮符号マップM♯へのポインタは、符号区分とアドレス値adr♯を連結したアドレスとする。
<2n分枝ハフマン木H1→無節点ハフマン木H2への変換>
無節点ハフマン木H2は、2n分枝ハフマン木H1からの変換により生成することができる。具体的には、たとえば、2n分枝ハフマン木H1から2m分枝(m=n×k)の無節点ハフマン木H2を生成することができる。以下、2m分枝の無節点ハフマン木H2へ変換するための機能的構成について説明する。
<情報処理装置500の機能的構成2>
図30は、実施の形態にかかる情報処理装置500の機能的構成2を示すブロック図である。図30では、図1に示した処理の流れ(1)〜(6)のうち、(3)の処理を実行する機能的構成を示している。なお、図5に示した構成と同一構成には同一符号を付し、その説明を省略する。
図30において、情報処理装置500は、決定部3001と、複製部3002と、根生成部3003と、第1の構築部3004と、第2の構築部3005と、文字構造体生成部515と、を備えている。決定部3001〜第2の構築部3005は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されたプログラムをCPU401に実行させることにより、または、I/F409により、その機能を実現する。
決定部3001は、2n分枝ハフマン木H1の階層数と第i階層の葉の数に基づいて、第i階層の葉ごとに葉へのポインタの種類数を決定する機能を有する。具体的には、たとえば、CPU401は、第1階層の種類数は256種、第2階層の種類数は16種、第3階層以降の種類数は1種というように、あらかじめ設定しておく。たとえば、上述した2n分枝ハフマン木H1では、第1階層の葉の数は3個、第2階層の葉の数は131個、第3階層の葉の数は1161個である。
したがって、葉のポインタ数は4025個(=3個×256種+131個×16種+1161個×1種)となり、4096個(2m個)以下となる。これにより、第1階層の種類数は256種、第2階層の種類数は16種、第3階層以降の種類数は1種に確定する。もし、4096個よりも多くなった場合は、第1階層の種類数を16種にしたり、第2階層の種類数を1種にするなどして、4096個以下となるように最適化する。
複製部3002は、2n分枝ハフマン木H1の葉を複製する機能を有する。具体的には、たとえば、CPU401は、葉L♯の構造体をコピーして、内部の上位節点へのポインタや圧縮符号長をクリアする。
根生成部3003は、2m個の葉へのポインタを格納可能な根を生成して、記憶装置に格納する機能を有する。具体的には、たとえば、n=4の場合、m=12、すなわち、4096個の空きポインタを有する根の構造体を生成する。
第1の構築部3004は、決定部3001によって決定された種類数に基づいて、複製部3002によって複製された葉ごとに当該葉へのポインタを生成し、根生成部3003によって生成された根に格納する機能を有する。具体的には、たとえば、第1階層について256種と決定された場合、第1階層に関する葉L1に対しては、葉L1へのポインタL1P(1)〜L1P(256)を生成する。そして、この葉L1へのポインタL1P(1)〜L1P(256)を根の構造体に格納する。
また、第2階層について16種と決定された場合、第2階層に関する葉L4に対しては、葉L4へのポインタL4P(1)〜L4P(16)を生成する。そして、この葉L4へのポインタL4P(1)〜L4P(16)を根の構造体に格納する。また、第3階層について1種と決定された場合、第3階層に関する葉L135に対しては、葉L135へのポインタL135P(1)を生成する。そして、この葉L135へのポインタL135P(1)を根の構造体に格納する。
第2の構築部3005は、葉に対する当該葉へのポインタ群に共通のビット列からなる圧縮符号を抽出し、当該圧縮符号およびその圧縮符号長を葉に格納して葉を再構築することにより、根および葉からなる無節点ハフマン木H2を生成する機能を有する。具体的には、たとえば、任意の葉L♯について葉L♯へのポインタが複数種生成されている場合、これらのポインタに共通のビット列を圧縮符号と特定する。また、その圧縮符号長も取得する。そして、圧縮符号および圧縮符号長をその葉L♯の構造体に格納する。
たとえば、葉L1については、256種の葉L1へのポインタL1P(1)〜L1P(256)が生成されているとした場合、以下のようなビット列となる。
ポインタL1P( 1):000000000000
ポインタL1P( 2):000000000001
ポインタL1P( 3):000000000010
ポインタL1P( 4):000000000011
・ ・
・ ・
・ ・
ポインタL1P(256):000011111111
ポインタL1P(1)〜L1P(256)では、上位4ビットの“0000”が共通のビット列となるため、この上位4ビット“0000”が葉L1の構造体の圧縮符号として特定される。また、この圧縮符号長は4ビットであるため、圧縮符号“0000”とともに葉L1の構造体に格納される。したがって、葉L1の構造体は、256種の葉L1へのポインタL1P(1)〜L1P(256)のいずれが指定されてもアクセスされることとなる。これにより、アクセス頻度が高くなるため、葉L1の構造体に格納されている文字コードはその圧縮符号へのアクセス頻度も高くなる。葉L2,L3も同様である。
また、葉L4については、16種の葉L4へのポインタL4P(1)〜L4P(16)が生成されているとした場合、以下のようなビット列となる。
ポインタL4P( 1):001100000000
ポインタL4P( 2):001100000001
ポインタL4P( 3):001100000010
ポインタL4P( 4):001100000011
・ ・
・ ・
・ ・
ポインタL4P(16):001100001111
ポインタL4P(1)〜L4P(16)では、上位8ビットの“00110000”が共通のビット列となるため、この上位8ビット“00110000”が葉L4の構造体の圧縮符号として特定される。また、この圧縮符号長は8ビットであるため、圧縮符号“00110000”とともに葉L4の構造体に格納される。したがって、葉L4の構造体は、16種の葉L4へのポインタL4P(1)〜L4P(16)のいずれが指定されてもアクセスされることとなる。これにより、アクセス頻度が高くなるため(葉L1〜L3よりは低いが)、葉L4の構造体に格納されている文字コードはその圧縮符号へのアクセス頻度も高くなる。
また、葉L135については、1種の葉L135へのポインタL135P(1)が生成されているとした場合、以下のようなビット列となる。
ポインタL135P(1):101000100000
ポインタL135P(1)は1種だけであるため、この12ビット“101000100000”が葉L135の構造体の圧縮符号として特定される。また、この圧縮符号長は12ビットであるため、圧縮符号“101000100000”とともに葉L135の構造体に格納される。このように構築することで、無節点ハフマン木H2が生成されることとなる。すなわち、無節点ハフマン木H2の根では、葉の数に応じた長さとなる葉へのポインタが、各葉に対する枝として文字コードの出現率に応じた個数分割り当てられていることとなる。
また、第2の構築部3005は、圧縮符号を葉L♯の構造体に格納する際、符号区分に応じて未使用のアドレス値adr♯を符号区分とともに格納する。具体的には、葉L♯の構造体において、伸長種別を参照して符号区分を格納する。そして、符号区分ごとに未使用のアドレス値adr♯を格納する。これにより、文字コード等ごとに、圧縮符号マップM♯へのポインタを、葉L♯の構造体ごとに格納することができる。
また、文字構造体生成部515は、あらたに構築された無節点ハフマン木H2を参照して文字構造体530を再度生成(更新)することとなる。すなわち、予約語の構造体1600や高位文字コードの構造体1700、分割文字コードの構造体1800中、あらたに生成された葉へのポインタが格納されることとなる。
<2n分枝ハフマン木H1→2m分枝無節点ハフマン木変換処理>
図31−1は、情報処理装置500が自動実行する2n分枝ハフマン木H1→2m分枝無節点ハフマン木変換処理手順を示すフローチャートである。図31−1において、まず、2n分枝ハフマン木H1の構造体を読み込み(ステップS3101)、決定部3001により、階層ごとの葉へのポインタの種類数を決定する(ステップS3102)。
つぎに、複製部3002により2n分枝ハフマン木H1の葉L♯の構造体を複製して(ステップS3103)、根生成部3003により、根の構造体を生成する(ステップS3104)。そして、階層番号iをi=1とし(ステップS3105)、第i階層の未選択の葉L♯の構造体があるか否かを判断する(ステップS3106)。
未選択の葉L♯の構造体がある場合(ステップS3106:Yes)、未選択の葉L♯の構造体を1つ選択し(ステップS3107)、決定された種類数分の葉へのポインタを生成して根の構造体に格納する(ステップS3108)。そして、種類数分の葉へのポインタから圧縮符号および圧縮符号長を特定して、葉L♯の構造体に格納する(ステップS3109)。このあと、圧縮符号マップM♯へのポインタ設定処理を実行して(ステップS3110)、ステップS3106に戻る。圧縮符号マップM♯へのポインタ設定処理については、図31−2で後述する。
一方、ステップS3106において、未選択の葉L♯の構造体がない場合(ステップS3106:No)、階層番号iを1ポイントインクリメントして(ステップS3111)、2n分枝ハフマン木H1の階層数kに対してi>kであるか否かを判断する(ステップS3112)。i>kでない場合(ステップS3112:No)、ステップS3106に戻る。一方、i>kである場合(ステップS3112:Yes)、一連の変換処理を終了する。
図31−2は、図31−1に示した圧縮符号マップM♯へのポインタ設定処理(ステップS3110)の詳細な処理手順を示すフローチャートである。まず、(ステップS3107において選択されている葉L♯の構造体を参照して、文字コード等の符号種別および符号区分を特定する(ステップS3121)。つぎに、特定された符号種別および符号区分にしたがって、アドレス値adra〜adrdの初期値を設定する(ステップS3122)。
具体的には、葉L♯の構造体について、符号種別が数字、英字、特殊記号、カタカナ、ひらがな、漢字などの文字コードであり、かつ、符号区分が“1”である場合、16ビットの文字コード用のアドレス値adraの初期値をadra=0001に設定する。
また、葉L♯の構造体について、符号種別が予約語へのポインタであり、かつ、符号区分が“1”である場合、予約語へのポインタ用のアドレス値adrbの初期値をadrb=1025に設定する。
また、葉L♯の構造体について、符号種別が上位8ビットの分割文字コードであり、かつ、符号区分が“0”である場合、上位8ビットの分割文字コード用のアドレス値adrcの初期値をadrc=0001に設定する。
また、葉L♯の構造体について、符号種別が下位8ビットの分割文字コードであり、かつ、符号区分が“0”である場合、下位8ビットの分割文字コード用のアドレス値adrdの初期値をadrd=0257に設定する。
そして、葉L♯の構造体内の符号区分を判断する(ステップS3123)。符号区分が“1”であり(ステップS3123:1)、かつ、符号種別が文字コードである場合(ステップS3124:文字コード)、アドレス値adraを葉L♯の構造体の第5領域2805に格納する(ステップS3125)。このあと、アドレス値adraをインクリメントして(ステップS3126)、ステップS3106に移行する。
また、ステップS3123において、符号区分が“1”であり(ステップS3123:1)、かつ、符号種別が予約語へのポインタである場合(ステップS3124:予約語へのポインタ)、アドレス値adrbを葉L♯の構造体の第5領域2805に格納する(ステップS3127)。このあと、アドレス値adrbをインクリメントして(ステップS3128)、ステップS3106に移行する。
また、ステップS3123において、符号区分が“0”であり(ステップS3123:0)、かつ、符号種別が上位8ビットの分割文字コードである場合(ステップS3129:上位)、アドレス値adrcを葉L♯の構造体の第5領域2805に格納する(ステップS3130)。このあと、アドレス値adrcをインクリメントして(ステップS3131)、ステップS3106に移行する。
また、ステップS3123において、符号区分が“0”であり(ステップS3123:0)、かつ、符号種別が下位8ビットの分割文字コードである場合(ステップS3129:下位)、アドレス値adrdを葉L♯の構造体の第5領域2805に格納する(ステップS3132)。このあと、アドレス値adrdをインクリメントして(ステップS3133)、ステップS3106に移行する。これにより、各葉L♯の構造体に、圧縮符号マップM♯へのポインタが設定されることとなる。したがって、無節点ハフマン木H2を探索する際に、圧縮符号マップM♯を特定することができる。
このように、2n分枝ハフマン木H1から2m分枝の無節点ハフマン木H2に変換することにより、無節点ハフマン木H2が圧縮や伸長に用いられることとなる。無節点ハフマン木H2を圧縮や伸長に用いることにより、2n分枝ハフマン木H1にくらべて圧縮率および検索速度の向上を図ることができる。
<無節点ハフマン木を用いた圧縮処理>
つぎに、2m分枝の無節点ハフマン木H2を用いた圧縮処理について説明する。2m分枝の無節点ハフマン木H2では1パスで葉にアクセスできるため、検索速度の高速化を図ることができる。以下、そのための機能的構成について説明する。
<情報処理装置500の機能的構成3>
図32は、実施の形態にかかる情報処理装置500の機能的構成3を示すブロック図である。図32では、図1に示した処理の流れ(1)〜(6)のうち、(4)〜(6)の処理を実行する機能的構成を示している。なお、図5に示した構成と同一構成には同一符号を付し、その説明を省略する。図32において、情報処理装置500は、圧縮部3200(分割部505、設定部3201、圧縮対象文字コード探索部3202、ハフマン木探索部3203、圧縮符号格納部3204)と、検出部3205と、圧縮符号マップ特定部3206と、圧縮符号マップ更新部3207と、圧縮符号マップ圧縮部3208(ビット列圧縮部3281と非圧縮領域設定部3282)と、圧縮バッファ3211とを備えている。
設定部3201〜圧縮符号マップ圧縮部3208は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されたプログラムをCPU401に実行させることにより、または、I/F409により、その機能を実現する。また、圧縮バッファ3211は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体によりその機能を実現する。
圧縮部は、対象ファイル群Fsの中から選ばれた対象ファイルFに記述されている圧縮対象文字コードをハフマン木に従って順次圧縮する機能を有する。具体的には、たとえば、分割部505、設定部3201、圧縮対象文字コード探索部3202、ハフマン木探索部3203、圧縮符号格納部3204により圧縮をおこなう。
設定部3201は、圧縮処理をおこなう場合、圧縮対象文字コードを設定する機能を有する。具体的には、たとえば、入力されてくる圧縮対象文字コードや圧縮符号列を、CPU401が内部のレジスタや外部のバッファに書き込む。
図33−1は、圧縮対象文字コード列の一例を示す説明図である。ここでは、「次の兎は」という文字列を圧縮対象文字列とし、その文字コード列を示している。なお、「兎」は低位文字コードであるため、上位8ビットと下位8ビットに分割される。
図33−2は、圧縮符号列の一例を示す説明図である。ここでも、「次の兎は」という文字列の圧縮符号列を示している。「兎」は上位8ビットと下位8ビットに分割されているため、圧縮符号も分割文字コードごとに割り当てられる。
圧縮対象文字コード探索部3202は、高位の文字コード群の中から設定部3201によって設定された圧縮対象文字コードを探索する機能を有する。具体的には、たとえば、CPU401が、レジスタにセットされた圧縮対象文字コードを、文字構造体530、すなわち、予約語の構造体1600、高位文字コードの構造体1700を走査することで探索する。
予約語の構造体1600、高位文字コードの構造体1700により一致する文字コードが探索されなかった場合は、CPU401は、分割部505により、圧縮対象文字コードを上位ビットと下位ビットに分割し、分割文字コードごとに、分割文字コードの構造体1800を走査して探索する。
ハフマン木探索部3203は、探索された文字コード等に対応付けられた葉L♯へのポインタを用いて、探索された文字コード等の圧縮符号を探索する機能を有する。具体的には、たとえば、CPU401は、文字構造体530から、一致した文字コード等に対応付けられている葉L♯へのポインタを読み出して、当該葉L♯の構造体を特定する。そして、ポイントされた葉L♯の構造体に格納されている文字コードの圧縮符号を抽出する。
たとえば、図26を用いて説明すると、葉L256に対応する文字コードが高位文字コードとして探索された場合、葉L256へのポインタを高位文字コードの構造体1700から読み出して、葉L256の構造体にアクセスする。この葉L256の構造体に格納されている文字コードの圧縮符号を葉L256の構造体から抽出する。
圧縮符号格納部3204は、ハフマン木探索部3203によって探索された圧縮符号を所定の記憶領域に格納する機能を有する。具体的には、たとえば、CPU401が、探索された圧縮符号を圧縮バッファ3211に書き込む。
(圧縮処理の具体例)
ここで、圧縮符号マップ特定部3205〜圧縮符号マップ圧縮部3208の説明の前に、2m分枝の無節点ハフマン木H2を用いた対象ファイル群Fsの圧縮処理の具体例について説明する。2m分枝の無節点ハフマン木H2を用いた圧縮処理では、ハフマン木探索において、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉L♯の構造体に格納されている文字コードを抽出して、圧縮バッファ3211に書き込む。予約語へのポインタを抽出した場合は、ポイント先の予約語を抽出して、圧縮バッファ3211に書き込む。これにより、圧縮処理の高速化を図ることができる。
図34は、2m分枝の無節点ハフマン木H2を用いた圧縮処理の具体例を示す説明図である。まず、対象ファイル群Fsから1文字目の圧縮対象文字コードを取得し、対象ファイル300上の位置を保持しておく。そして、予約語の構造体1600に対して2分木探索をおこなう。予約語は2文字以上の文字コード列であるため、1文字目の圧縮対象文字コードがヒットした場合、2文字目の文字コードを圧縮対象文字コードとして取得する。
そして、2文字目の文字コードは、1文字目の圧縮対象文字コードがヒットした位置から探索する。3文字目以降も、不一致の圧縮対象文字コードが出現するまで繰り返し2分木探索をおこなう。一致する予約語ra(aは葉の番号)が探索された場合、その葉Laへのポインタにより葉Laの構造体にアクセスする。そして、上述したハフマン木探索により、予約語raの圧縮符号を探索して、圧縮バッファ3211に格納する。
一方、不一致の圧縮文字コードが出現した場合、予約語の構造体1600に対する2分木探索を終了し(EOT(End Of Transmission)まで進み)、1文字目の圧縮対象文字コードを再度レジスタにセットして、高位文字コードの構造体1700に対する2分木探索をおこなう。
一致する文字コードeb(bは葉の番号)が探索された場合、その葉Lbへのポインタにより葉Lbの構造体にアクセスする。そして、上述したハフマン木探索により、文字コードebの圧縮符号を探索して、圧縮バッファ3211に格納する。
一方、一致する文字コードが出現せず2分木探索を終了した場合、圧縮対象文字コードは高位文字コードではないため、上位8ビットと下位8ビットに分割する。そして、上位8ビットの分割文字コードについて、分割文字コードの構造体1800に対する2分木探索をおこなう。一致する分割文字コードDc1(c1は葉の番号)が探索された場合、その葉Lc1へのポインタにより葉Lc1の構造体にアクセスする。そして、上述したハフマン木探索により、分割文字コードDc1の圧縮符号を探索して、圧縮バッファ3211に格納する。
引き続き、下位8ビットの分割文字コードについて、分割文字コードの構造体1800に対する2分木探索をおこなう。一致する分割文字コードDc2(c2は葉の番号)が探索された場合、その葉Lc2へのポインタにより葉Lc2の構造体にアクセスする。そして、上述したハフマン木探索により、分割文字コードDc2の圧縮符号を探索して、分割文字コードDc1の圧縮符号に続けて圧縮バッファ3211に格納する。
(ファイル圧縮処理手順)
図35は、情報処理装置500が自動実行する2m分枝の無節点ハフマン木H2を用いたファイル圧縮処理手順を示すフローチャートである。まず、ファイル番号:pをp=1とし(ステップS3501)、対象ファイルFpを読み込む(ステップS3502)。つぎに、圧縮処理を実行して(ステップS3503)、ファイル番号:pをインクリメントする(ステップS3504)。そして、p>αであるか否かを判断する(ステップS3505)。αは対象ファイル群Fsの総数である。p>αでない場合(ステップS3505:No)、ステップS3502に戻る。一方、p>αである場合(ステップS3505:Yes)、一連のファイル圧縮処理を終了する。
図36は、図35に示した圧縮処理(ステップS3503)の詳細な処理手順を示すフローチャート(その1)である。図36において、まず、対象ファイル群Fsに圧縮対象文字コードがあるか否かを判断する(ステップS3601)。ある場合(ステップS3601:Yes)、圧縮対象文字コードを取得してレジスタにセットする(ステップS3602)。そして、先頭の圧縮対象文字コードか否かを判断する(ステップS3603)。
ここで、先頭の圧縮対象文字コードとは、未圧縮の1文字目の文字コードをいう。先頭である場合(ステップS3603:Yes)、その圧縮対象文字コードの対象ファイル群Fs上の位置(先頭位置)となるポインタを取得し(ステップS3604)、ステップS3605に移行する。一方、先頭でない場合(ステップS3603:No)、先頭位置を取得せずにステップS3605に移行する。
そして、予約語の構造体1600に対して2分木探索をおこなう(ステップS3605)。圧縮対象文字コードが一致した場合(ステップS3606:Yes)、連続して一致した文字コード列が予約語(の文字コード列)に該当するか否かを判断する(ステップS3607)。該当しない場合(ステップS3607:No)、ステップS3602に戻って後続の文字コードを圧縮対象文字コードとして取得する。この場合、後続の文字コードは先頭ではないため、先頭位置は取得しないこととなる。
一方、ステップS3607において、予約語に該当する場合(ステップS3607:Yes)、該当する予約語の葉L♯へのポインタにより葉L♯の構造体にアクセスする(ステップS3608)。そして、ポイントされた葉L♯の構造体に格納されている予約語の圧縮符号を抽出する(ステップS3609)。
この後、抽出された圧縮符号を圧縮バッファ3211に格納して(ステップS3610)、ステップS3601に戻る。このループが予約語の圧縮処理の流れとなる。ステップS3601において、圧縮対象文字コードがない場合(ステップS3601:No)、対象ファイルFpから圧縮された圧縮ファイルfpを圧縮バッファ3211からファイル出力して保存する(ステップS3611)。そして、ステップS3504に移行する。一方、ステップS3606において不一致となった場合(ステップS3606:No)、16ビットの文字コードの圧縮処理のループに入る。
図37は、図35に示した圧縮処理(ステップS3503)の詳細な処理手順を示すフローチャート(その2)である。図37において、ステップS3604で取得された先頭位置のポインタを参照して、対象ファイル群Fsから圧縮対象文字コードを取得してレジスタにセットする(ステップS3701)。
つぎに、圧縮対象文字コードについて、高位文字コードの構造体1700に対して2分木探索をおこなう(ステップS3702)。一致した場合(ステップS3703:Yes)、該当する文字の葉L♯へのポインタにより葉L♯の構造体にアクセスする(ステップS3704)。そして、ポイントされた葉L♯の構造体に格納されている圧縮対象文字コードの圧縮符号を抽出する(ステップS3705)。
この後、探索された圧縮符号を圧縮バッファ3211に格納して(ステップS3706)、ステップS3601に戻る。このループが16ビットの文字コードの圧縮処理の流れとなる。一方、ステップS3703において一致する文字コードが存在しなかった場合(ステップS3703:No)、分割文字コードの圧縮処理のループに入る。
図38は、図35に示した圧縮処理(ステップS3503)の詳細な処理手順を示すフローチャート(その3)である。図38において、まず、圧縮対象文字コードを上位8ビットと下位8ビットとに分割し(ステップS3801)、上位8ビットの分割文字コードを抽出する(ステップS3802)。そして、分割文字コードの構造体1800に対して2分木探索をおこなう(ステップS3803)。
そして、探索された分割文字コードの葉L♯へのポインタにより葉L♯の構造体にアクセスする(ステップS3804)。そして、ポイントされた葉L♯の構造体に格納されている分割文字コードの圧縮符号を抽出する(ステップS3805)。この後、探索された圧縮符号を圧縮バッファ3211に格納する(ステップS3806)。
つぎに、下位8ビットが探索済みか否かを判断し(ステップS3807)、探索済みでない場合(ステップS3807:No)、下位8ビットの分割文字コードを抽出して(ステップS3808)、ステップS3803〜S3806を実行する。一方、下位8ビットが探索済みである場合(ステップS3807:Yes)、ステップS3601に戻り、予約語の圧縮処理のループに入る。
このように、2m分枝の無節点ハフマン木H2を用いた圧縮処理では、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉L♯の構造体に格納されている文字コードを抽出して、圧縮バッファ3211に書き込むだけでよい。したがって、圧縮処理の高速化を図ることができる。
また、圧縮対象文字コードが格納されている葉L♯の構造体を、予約語の構造体1600、高位文字コードの構造体1700および分割文字コードの構造体1800により即座に特定することができる。したがって、2m分枝の無節点ハフマン木H2の葉を探索する必要がなく、圧縮処理の高速化を図ることができる。また、低位文字コードを上位ビットコードと下位ビットコードに分割することで、6万種以上ある低位の文字コードをたかだか256種の分割文字コードの圧縮符号に圧縮することができる。したがって、圧縮率の向上を図ることができる。
また、図32に戻って、検出部3205〜圧縮符号マップ圧縮部3208について説明する。検出部3205は、圧縮部3200によるハフマン木の葉へのアクセスを検出する機能を有する。具体的には、たとえば、ハフマン木探索部3203による葉L♯の構造体へのアクセスを検出する。
圧縮符号マップ特定部3206は、圧縮符号マップ群Msの中から葉L♯の構造体に格納されている文字コード等に対応する圧縮符号マップM♯を特定する機能を有する。具体的には、たとえば、検出部3205によって、ハフマン木探索部3203による葉L♯の構造体へのアクセスが検出された場合、当該葉L#の構造体から圧縮符号マップMへのポインタを読み出す。そして、読み出された圧縮符号マップMへのポインタにより、葉L♯の構造体に格納されている文字コード等に対応する圧縮符号マップMにアクセスする。
図39−1は、圧縮符号マップ群Msの初期状態を示す説明図である。圧縮符号マップ群Msは、アドレス項目とビット列項目とを有する。そして、葉L♯の構造体ごとに、すなわち、高位文字コード、予約語、上位8ビット分割文字コード、下位8ビット分割文字コードごとに、アドレスとビット列とがレコード化されている。
アドレス項目の区分項目は、葉L♯の構造体の符号区分を示す。また、アドレス項目のアドレス値は、葉L♯の構造体のアドレス値を示す。したがって、区分項目の値とアドレス値とが連結されたアドレスが、その圧縮符号マップM♯へのポインタによりポイントされる。
ビット列項目は、ファイル番号順に並んだファイル数分のビット列により構成される。ビットの値が“1”であるファイル番号の対象ファイルには、アドレスにより指定される文字コード等が存在する。一方、ビットの値が“0”であるファイル番号の対象ファイルには、アドレスにより指定される文字コード等が存在しない。図39−1では、初期状態を示しているため、すべてのビット列の値は“0”である。
図32において、圧縮符号マップ更新部3207は、ファイル番号のビットを“0”から“1”に更新する機能を有する。具体的には、圧縮符号マップ群Msの、圧縮符号マップM♯へのポインタによりポイントされた圧縮符号マップM♯のビット列のうち、現在圧縮処理中である対象ファイルのファイル番号のビットを“0”から“1”に更新する。
図39−2は、圧縮符号マップ更新部3207による更新後の圧縮符号マップ群Msを示す説明図である。たとえば、一行目のレコードに該当する文字コード等は、対象ファイルF1〜F4には存在せず、対象ファイルFαには存在することを示している。
圧縮符号マップ圧縮部3208は、図39−2に示した更新後の圧縮符号マップ群Msを圧縮する機能を有する。圧縮符号マップ圧縮部3208は、ビット列圧縮部3281と非圧縮領域設定部3282とを有する。ビット列圧縮部3281は、圧縮符号マップ群Msの各ビット列を圧縮する。ファイル総数αが膨大(たとえば、α=10000)である場合、ビット列において“0”が連続する箇所も多くなる。また、出現頻度が高い文字については、これとは逆に“1”が連続する箇所が多くなる。したがって、文字の出現率に応じた出現率領域を設定する。出現率領域とは、出現率の範囲である。出現率領域に応じて、圧縮符号マップ群Msの圧縮用ハフマン木を割り当てる。
図40は、出現率と出現率領域との関係を示す説明図である。出現率が0〜100%の範囲とすると、図40に示したように、A〜E領域およびA´〜E´領域に領域分割することができる。したがって、A〜E領域およびA´〜E´領域で特定された出現率領域に応じて、圧縮符号マップ群Msの圧縮用ハフマン木を圧縮パターンとして割り当てる。
図41は、出現率領域別の圧縮パターンを有する圧縮パターンテーブルを示す説明図である。出現率領域は、図28に示したように、葉L♯の構造体の第4領域2804に格納されているため、葉L♯の構造体が指定されることで、圧縮パターンテーブルを参照して、圧縮パターンが特定されることとなる。なお、A領域およびA´領域は、非圧縮のため、圧縮パターンとなるハフマン木は存在しない。
図42−1は、B領域およびB´領域の場合の圧縮パターンを示す説明図である。圧縮パターン4201は、16種のハフマン木となる。
図42−2は、C領域およびC´領域の場合の圧縮パターンを示す説明図である。圧縮パターン4202は、16種+1種のハフマン木となる。圧縮パターン4202では、B領域およびB´領域に比べて、“0”が連続する箇所または“1”が連続する箇所が確率的に多くなる。したがって、16ビット連続して値が“0”であるビット列に、符号語“00”が割り当てられている。
図42−3は、D領域およびD´領域の場合の圧縮パターンを示す説明図である。圧縮パターン4203は、16種+1種のハフマン木となる。圧縮パターン4203では、C領域およびC´領域に比べて、“0”が連続する箇所または“1”が連続する箇所が確率的に多くなる。したがって、32ビット連続して値が“0”であるビット列に、符号語“00”が割り当てられている。
図42−4は、E領域およびE´領域の場合の圧縮パターンを示す説明図である。圧縮パターン4204は、16種+1種のハフマン木となる。圧縮パターン4204では、D領域およびD´領域に比べて、“0”が連続する箇所または“1”が連続する箇所が確率的に多くなる。したがって、64ビット連続して値が“0”であるビット列に、符号語“00”が割り当てられている。このように、出現率領域に応じて、文字コードが存在しないことを意味する“0”の連続数が増加するため、文字コードの出現率に応じて圧縮符号マップMsの圧縮効率の向上を図ることができる。
図43は、圧縮された圧縮符号マップ群Msを示す説明図である。圧縮符号マップ群Msでは、葉L♯の構造体に対応するレコードごとに、図42−1〜図42−4に示した圧縮パターン4201〜4204を用いてビット列が圧縮されている。
また、図32において、非圧縮領域設定部3282は、圧縮符号マップ群Msにおいて非圧縮領域を設定する機能を有する。具体的には、対象ファイルFの追加が検出された場合、ファイル番号pが連続するように採番する。そして、文字コードごとに文字コードの追加ファイルでの存否をあらわすビット列を、対象ファイル群Fsのファイル番号pと連続するように配列した非圧縮領域を設定する。
たとえば、対象ファイルFが後から追加されると、追加された対象ファイルFβを圧縮する際、圧縮符号マップ群Msにも文字の存否を示すビット列を追加する必要がある。圧縮前の圧縮符号マップ群Msでは、ファイル番号:1〜αのビット列については、圧縮パターン4201〜4204により圧縮されてレコードごとに符号長が異なる。すなわち、可変長であるため圧縮領域となる。
したがって、図43に示したように、圧縮符号列の先頭(ファイル番号α側)は整列するが末尾が整列しない。仮に、ビット列の並びを、ファイル番号:1〜αの順に、アドレス項目側から割り当てると、追加ファイルのビット列は、圧縮符号列の末尾側に挿入することとなり、圧縮符号列と追加ファイルのビット列とが非連続となってしまう。したがって、あらかじめ、圧縮符号マップ群Msの圧縮領域のビット列を、先頭位置から末尾位置にかけて対象ファイル群Fsのファイル番号pの降順に配列しておく。そして、非圧縮領域設定部3282は、圧縮符号マップ群Msにおいて、圧縮符号マップへのポインタと圧縮領域との間に非圧縮領域を設定する。
図44は、圧縮された圧縮符号マップ群msへのビット列追加を示す説明図である。図44に示すように、ファイル番号;1〜αのうち圧縮符号列が整列する側にファイル番号:αのビットを割り当てる。これにより、ファイル番号;1〜αのビット列を圧縮した場合でも、非圧縮のファイル番号:α+1〜βのビット列を挿入しても、ファイル番号順にビット列を連続させることができる。これにより、ファイル番号;1〜αのビット列が圧縮されても、追加ファイルのファイル番号とそのビットとのずれがなく、対象ファイルの絞込みを正確に実行することができる。なお、追加ファイルのビット列の追加は、圧縮符号マップ更新部3207により実行される。
図45は、削除マップを示す説明図である。対象ファイル群Fs(対象ファイルF1〜Fβ)の中には、途中で削除される対象ファイルもある。削除された対象ファイルFを絞り込みによって得ても無駄であるため、削除マップMdを用意しておく。削除マップMdは、ファイル総数α(追加があった場合はβ)分のビット列であり、初期状態では、すべて“1”に設定されている。
削除された対象ファイルがあった場合、削除マップMd中、削除された対象ファイルのファイル番号:dのビットの値を“1”→“0”に変更する。削除マップMdは対象ファイルの絞込み時に利用される。このため、圧縮符号マップ群Msにおいて、ある文字コードについてある対象ファイルFのビットが“1”であっても、削除マップMdでは“0”の場合、検索対象外となる。なお、削除マップMdの更新は、圧縮符号マップ更新部3207により実行される。
(圧縮符号マップ生成処理手順)
つぎに、圧縮符号マップ生成処理について説明する。圧縮符号マップ生成処理は、図34および図35に示したファイル圧縮処理と並列に実行される処理である。具体的には、図34を参照すると、CPU401は、圧縮対象文字コードを圧縮する際に、葉L♯の構造体にアクセスする。圧縮符号マップ生成処理は、ファイル圧縮処理時における葉L♯の構造体へのアクセスの都度、実行される。これにより、対象ファイルFを一回走査するだけで、対象ファイルFの圧縮と対象ファイルFに存在する文字の圧縮符号マップMを同時に生成することができ、処理の高速化を図ることができる。なお、圧縮符号マップ群Msの初期状態は、図39−1に示したとおりである。
図46は、圧縮符号マップ生成処理手順を示すフローチャートである。まず、葉L♯の構造体へのアクセスがあったか否かを判断する(ステップS4601)。葉L♯の構造体へのアクセスがあった場合(ステップS4601:Yes)、アクセスした葉L♯の構造体の第5領域2805内の情報(符号区分および圧縮符号マップ用のアドレス値)を取得する(ステップS4602)。取得された符号区分にアドレス値をつなげたアドレスが圧縮符号マップM♯へのポインタになる。取得された圧縮符号マップM♯へのポインタにより、該当する圧縮符号マップM♯にアクセスする(ステップS4603)。
そして、ステップS4601における葉L♯の構造体にアクセスしたときのファイル番号pのビットが“0”であるか否かを判断する(ステップS4604)。“0”である場合(ステップS4604:Yes)、ファイル番号pのビットを“0”→“1”に設定し(ステップS4605)、ステップS4601に戻る。一方、ステップS4604において、“1”である場合(ステップS4604:No)、ステップS4605を実行せずに、ステップS4601に戻る。
また、ステップS4601において、葉L♯の構造体へのアクセスがない場合(ステップS4601:No)、ステップS4606に移行する。ステップS4606において、対象ファイルの読込が終了したか否かを判断する(ステップS4606)。終了していない場合(ステップS4606:No)、ステップS4601に戻る。一方、終了した場合(ステップS4606:Yes)、圧縮符号マップ生成処理を終了する。このように、対象ファイルFを一回走査するだけで、対象ファイルFの圧縮と対象ファイルFに存在する文字の圧縮符号マップMを同時に生成することができ、処理の高速化を図ることができる。
(圧縮符号マップ圧縮処理手順)
つぎに、圧縮符号マップ圧縮処理について説明する。圧縮符号マップ圧縮処理は、図39−2に示したように、圧縮符号マップ生成処理にて生成された圧縮符号マップ群Msの圧縮領域であるファイル番号1〜αまでのビット列を圧縮する処理である。具体的には、図41に示した圧縮パターンテーブルと図42−1〜図42−4に示した圧縮パターン(圧縮符号マップ用ハフマン木)を用いて、圧縮符号マップ群Msの圧縮領域のビット列を圧縮する。これにより、図43に示したような圧縮後の圧縮符号マップ群Msを得ることができる。以下、圧縮符号マップ圧縮処理手順について説明する。
図47は、圧縮符号マップ圧縮処理手順を示すフローチャートである。図47において、まず、圧縮符号マップ群Msにおいて、未選択のアドレス(圧縮符号マップへのポインタ)があるか否かを判断する(ステップS4701)。未選択のアドレスがある場合(ステップS4701:Yes)、未選択のアドレスを選択して葉L♯の構造体にアクセスし(ステップS4702)、葉L♯の構造体の第1領域2801の中から文字コードを取得する(ステップS4703)。そして、アクセス先の葉L♯の構造体の第4領域2804から出現率領域を取得することで、取得された文字コードの出現率領域を特定する(ステップS4704)。
このあと、図41の圧縮パターンテーブルを参照して、特定された出現率領域が非圧縮領域(たとえば、出現率領域A、A’)であるか否かを判断する(ステップS4705)。非圧縮領域である場合(ステップS4705:Yes)、ステップS4701に戻り、つぎのアドレスを選択する。
一方、非圧縮領域でない場合(ステップS4705:No)、特定された出現率領域により、図42−1〜図42−4に示した圧縮符号マップ用ハフマン木の中から該当する圧縮符号マップ用ハフマン木を選択する(ステップS4706)。また、圧縮対象となる取得文字コードの圧縮符号マップMにおける圧縮領域のビット列を抽出する(ステップS4707)。
そして、取得文字コードの出現率が50%以上であるか否かを判断する(ステップS4708)。出現率とは、上述したように、対象ファイル群Fs内の全ファイル数を母集団(分母)とし、当該文字コードまたは予約語が存在するファイル数を分子とした値である。出現率領域は、出現率に応じて決められているため(図40を参照)、出現率領域がA〜Eである場合、取得文字コードの出現率が50%以上でないと判断する。一方、出現率領域がA’〜E’である場合、取得文字コードの出現率が50%以上であると判断する。
そして、出現率が50%以上である場合(ステップS4708:Yes)、圧縮効率を上げるために、ステップS4706で抽出されたビット列を反転する(ステップS4709)。たとえば、抽出されたビット列が“1110”である場合、“0001”にして、“0”の個数を増やす。そして、反転後のビット列を、ステップS4706で選択したハフマン木を用いて圧縮して(ステップS4710)、ステップS4701に戻る。このように、ビット列反転をおこなうことで、出現率領域A’〜E’の圧縮符号マップ用ハフマン木を用意する必要がないため、省メモリ化を図ることができる。
一方、ステップS4708において、出現率が50%以上でない場合(ステップS4708:No)、ビット列反転(ステップS4709)をおこなうことなく、ステップS4707で抽出されたビット列を、ステップS4706で選択したハフマン木を用いて圧縮して(ステップS4710)、ステップS4701に戻る。また、ステップS4701において、未選択のアドレスがない場合(ステップS4701:No)、圧縮符号マップ圧縮処理を終了する。
このような圧縮符号マップ圧縮処理手順により、アドレスごとにファイル番号1〜αのビット列が、出現率に応じて圧縮され、図43に示したような圧縮後の圧縮符号マップ群Msを得ることができる。
(追加ファイル圧縮処理手順)
つぎに、追加ファイル圧縮処理について説明する。追加ファイル圧縮処理は、あとから対象ファイルFが追加された場合、追加分の対象ファイルについての文字コード(厳密には圧縮符号マップへのポインタとなるアドレス)ごとに追加分の対象ファイルのビット列を追加する処理である。具体的には、ファイル番号α+1〜βまでのビット列を追加することで、図44に示したような圧縮符号マップ群Msが得られる。以下、圧縮後の圧縮符号マップ群Msを例に挙げて追加ファイル圧縮処理手順について説明する。なお、β個の追加分の対象ファイルについては、ファイル番号α+1〜βを付加しておく。
図48は、追加ファイル圧縮処理手順を示すフローチャートである。まず、追加ファイル数β分のマップ領域を設定する(ステップS4801)。具体的には、圧縮符号マップ群Msのアドレスとファイル番号1〜αの圧縮符号列との間に追加ファイルのビット列(初期値は“0”)を確保する。
つぎに、ファイル番号pをp=α+1とし(ステップS4802)、対象ファイルFpを読み込む(ステップS4803)。そして、圧縮処理を実行する(ステップS4804)。圧縮処理(ステップS4804)は、図35および図36に示した圧縮処理(ステップS3503)と同じ処理である。圧縮処理(ステップS4804)のあと、ファイル番号pをインクリメントし(ステップS4805)、p>βであるか否かを判断する(ステップS4806)。p>βでない場合(ステップS4806:No)、ステップS4803に戻る。一方、p>βである場合(ステップS4806:Yes)、追加ファイル圧縮処理を終了する。
(削除マップ更新処理手順)
つぎに、削除マップ更新処理について説明する。削除マップ更新処理は、図45に示した削除マップMd内の選択されたビットを更新する処理である。
図49は、削除マップ更新処理手順を示すフローチャートである。まず、ファイル削除があるまで待ちうけ(ステップS4901:No)、ファイル削除があった場合(ステップS4901:Yes)、削除された対象ファイルのファイル番号dを検出する(ステップS4902)。そして、削除マップMdにおけるファイル番号dのビットを、“1”から“0”に更新する(ステップS4903)。これにより、削除マップ更新処理を終了する。削除マップMdは対象ファイルの絞込み時に利用される。このため、圧縮符号マップ群Msにおいて、ある文字コードについてある対象ファイルのビットが“1”であっても、削除マップMdでは“0”の場合、検索対象外となる。
<圧縮ファイルfの検索と対象ファイルFへの伸長までの処理の流れ>
図50は、圧縮ファイルfの検索と対象ファイルFへの伸長までの処理の流れを示す説明図である。図50では、まず、(7)情報検索装置が、検索キーワードの入力を受け付けて読み込む。つぎに、(8)無節点ハフマン木H2により、検索キーワードを構成する各文字の文字コードを圧縮することで、圧縮符号群が得られる。そして、(9)各圧縮符号に対応する葉L♯の構造体から圧縮符号マップへのポインタを取得して圧縮符号マップ群Msにアクセスする。
なお、圧縮符号マップ群Msの場合、(7)検索キーワードの読み込みを契機として、圧縮符号マップ用ハフマン木により圧縮符号マップ群Msを伸長し、圧縮符号マップ群Msを生成しておく。
(10)そして、各文字コードの圧縮符号マップMのビット列をファイル番号pごとにAND演算することで、検索キーワードを構成する文字をすべて含む圧縮ファイルf(特定圧縮ファイルft)を特定する。これにより、圧縮ファイル群fsのまま検索キーワードについてファイル絞込みをおこなうことができる。
(11)最後に、(9)で特定圧縮ファイルftを無節点ハフマン木H2を用いて伸長し、伸長された対象ファイルF(伸長ファイルFt)内の文字列と検索キーワードとを照合し、ヒットした文字列を強調表示などの文字列置換をする。これにより、圧縮ファイルfの伸長と検索キーワードの一致判定(照合)を一連の処理で実行することができる。
(機能的構成4)
図51は、実施の形態にかかる情報検索装置の機能的構成を示すブロック図である。図51では、図50に示した処理(7)〜(11)を実行する機能的構成を示している。図51において、情報検索装置5100は、入力部5101と、検索キーワード圧縮部5102と、圧縮符号マップ伸長部5103と、圧縮符号マップ特定部5104と、圧縮ファイル特定部5105と、照合フラグ設定部5106と、抽出部5107と、葉特定部5108と、伸長コード格納部5109と、照合部5110と、文字列置換部5111と、出力部5112とを備える。
入力部5101〜出力部5112は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されたプログラムをCPU401に実行させることにより、または、I/F409により、その機能を実現する。また、伸長バッファ5120は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体によりその機能を実現する。なお、情報検索装置5100は、上述した情報処理装置500と同一装置であってもよく、異なる装置であってもよい。
まず、入力部5101は、検索キーワードの入力を受け付ける機能を有する。入力部5101は、図50に示した(7)に相当する機能である。
検索キーワード圧縮部5102は、検索キーワードを圧縮する機能を有する。検索キーワード圧縮部5102は、図50に示した(8)に相当する機能である。具体的には、図34に示したように、検索キーワード(圧縮対象文字コード列)を順次圧縮する。すなわち、文字構造体530を参照して、入力部5101によって入力された検索キーワードを構成する文字コードごとに葉L♯へのポインタを特定する。そして、特定された葉L♯へのポインタにより葉L♯の構造体にアクセスして、当該アクセス先の葉L♯の構造体に格納されている圧縮符号を抽出する。圧縮された検索キーワードの圧縮符号群は、圧縮バッファに格納される。
圧縮符号マップ伸長部5103は、圧縮処理された圧縮符号マップ群Msを伸長する機能を有する。具体的には、検索キーワードの入力を契機として、圧縮に用いた圧縮符号マップ用ハフマン木により、圧縮符号マップ群Msにおけるファイル番号1〜αの圧縮符号マップの圧縮符号列(図43、図44を参照)をハフマン伸長する。これにより、圧縮符号マップ群Msを復元することができる。
圧縮符号マップ特定部5104は、圧縮符号マップ群Msのうち、検索キーワードを構成する文字の文字コードに対応する圧縮符号マップMを特定する機能を有する。圧縮符号マップ特定部5104は、図50に示した(9)に相当する機能である。圧縮符号マップ特定部5104では、検索キーワードの圧縮時にアクセスした葉L♯の構造体に格納されている圧縮符号マップへのポインタを取得する。そして、取得した圧縮符号マップへのポインタにより、該当する圧縮符号マップMにアクセスする。
圧縮ファイル特定部5105は、圧縮符号マップ特定部5104によって特定された圧縮符号マップMを参照することにより、検索キーワード圧縮部5102によって圧縮された圧縮符号群をすべて含む圧縮ファイルを圧縮ファイル群から特定する機能を有する。圧縮ファイル特定部5105は、図50に示した(10)に相当する機能である。圧縮ファイル特定部5105では、圧縮ファイルごとに、検索キーワードを構成する各文字コードのビットをAND演算する。そして、AND演算結果が“1”であれば、そのファイル番号pの圧縮ファイルfpに検索キーワードを構成する文字がすべて含まれていることとなる。これにより、圧縮ファイル群Fsの絞込みをおこなうことができる。
図52は、圧縮ファイル特定部5105により特定例を示す説明図である。図52では、例として検索キーワードを『増殖細胞』とする。そして、圧縮符号マップ特定部5104によって特定された圧縮符号マップMを圧縮符号マップM1〜M4とする。また、図52では、理解の容易のため、ファイル数αをα=4とし、追加ファイル数βをβ=0とする。
圧縮符号マップM1〜M4のビット列および削除マップMdをファイル番号ごとの列でAND演算する。ファイル番号1の列は、『増』,『殖』,『細』,『胞』がすべて存在しないため、AND演算結果は“0”である。ファイル番号2の列は、『増』,『殖』,『細』,『胞』がすべて存在するが、対象ファイルF2は削除されているため、削除マップMdのビットが“0”である。したがって、AND演算結果は“0”である。
ファイル番号3の列は、『増』,『殖』,『細』,『胞』がすべて存在し、かつ、削除マップMdのビットが“1”である。したがって、AND演算結果は“1”である。ファイル番号4の列は、『殖』,『細』,『胞』が存在しないため、AND演算結果は“0”である。これにより、図52の例では、圧縮ファイルf1〜f4のうち、ファイル番号3の圧縮ファイルf3に絞り込まれることとなる。なお、圧縮ファイル特定部5105によって特定された圧縮ファイルf内の圧縮符号列は、CPU401により、内部のレジスタや外部のバッファに書き込まれる。
照合フラグ設定部5106は、圧縮ファイル特定部5105により葉L♯の構造体にアクセスされた際、葉L♯の構造体内の照合フラグをONに設定する機能を有する。照合フラグは、その葉L♯の構造体に対応する文字コードが伸長バッファ5120に格納された場合、対象となる検索キーワード内の文字コードと照合するか否かを判断するフラグである。照合フラグがONの場合は照合し、OFFの場合は照合しない。デフォルトはOFFであり、検索結果が得られると、OFFにリセットされる。これにより、照合フラグがONである葉L♯の構造体の文字コードのみと照合をおこなうことができ、無駄な照合を回避することができる。
抽出部5107は、圧縮ファイル特定部5105によって特定された圧縮ファイルfの中から葉L♯へのポインタと同じ長さとなる圧縮符号列を抽出する機能を有する。抽出された圧縮符号列は、根の構造体セルC(1,1)に格納されている葉L♯へのポインタ群のいずれかのポインタに一致することとなる。
葉特定部5108は、抽出部5107によって抽出された圧縮符号列に基づいて、無節点ハフマン木H2により葉L♯の構造体を特定する機能を有する。具体的には、たとえば、抽出された圧縮符号を含む枝番号に一致する葉L♯へのポインタを、無節点ハフマン木H2の根の構造体セルC(1,1)の中から探索する。そして、探索された場合、ポイント先となる葉L♯の構造体に1パスでアクセスする。
たとえば、葉L1の構造体に含まれている圧縮符号は“0000”、葉L1をポイントする葉L1へのポインタL1P(1)〜L1P(256)は、“000000000000”〜“000011111111”である。したがって、抽出された圧縮符号“0000”を含む葉L♯へのポインタが、“000000000000”〜“000011111111”である場合、そのポイント先である葉L1の構造体にアクセスする。
伸長コード格納部5109は、葉特定部5108によってアクセスされた葉L♯の構造体に格納されている文字コード等を抽出して、伸長コードとして伸長バッファ5120に格納する機能を有する。具体的には、たとえば、上記の例では、葉L1の構造体にアクセスしているため、葉L1の構造体の第3領域2803に格納されている文字コードe1を伸長コードとして抽出する。そして、抽出された伸長コードを伸長バッファ5120に書き込む。ここで、伸長コードの格納の具体例について説明する。
図53−1〜図53−5は、抽出部5107、葉特定部5108および伸長コード格納部5109による2m分枝の無節点ハフマン木H2を用いた伸長処理の具体例を示す説明図である。図53−1〜図53−5では、図33−2に示した圧縮符号列を伸長する例を示している。伸長処理では、レジスタに圧縮符号列をセットし、マスクパターンにより圧縮符号を抽出する。抽出した圧縮符号を、1パス(1枝分のアクセス)で2m分枝の無節点ハフマン木H2の根から探索する。そして、アクセスした葉L♯の構造体に格納されている文字コードを読み出して伸長バッファ5120に格納する。
圧縮符号を抽出するため、マスクパターンのマスク位置をオフセットする。また、マスクパターンの初期値を“0xFFF00000”とする。このマスクパターンは先頭12ビットが“1”であり、後続の20ビットが“0”のビット列である。
CPU401はビットアドレスabiとバイトオフセットbyosとビットオフセットbiosとを算出する。ビットアドレスabiは、抽出された圧縮符号のビット位置を示す値であり、今回のビットアドレスabiは、前回のビットアドレスabiに前回抽出された圧縮符号の圧縮符号長legを加算した値となる。なお、初期状態では、ビットアドレスabiはabi=0とする。
バイトオフセットbyosは、メモリに保持されている圧縮符号列のバイト境界を示す値であり、ビットアドレスabi/8の商で求められる。たとえば、バイトオフセットbyos=0のときは、メモリに記憶されている先頭からの圧縮符号列をレジスタにセットし、バイトオフセットbyos=1のときは、メモリに記憶されている先頭1バイト目からの圧縮符号列をレジスタにセットする。
また、ビットオフセットbiosは、マスクパターンのマスク位置(“FFF”)をオフセットする値であり、ビットアドレスabi/8の余りである。たとえば、ビットオフセットbios=0のときは、マスク位置はシフトされないこととなり、マスクパターンは、“0xFFF00000”となる。一方、ビットオフセットbios=4のときは、マスク位置は末尾方向に4ビットシフトすることとなり、マスクパターンは、“0x0FFF0000”となる。
レジスタシフト数rsは、マスクパターンとのAND演算後のレジスタ内の圧縮符号列を末尾方向にシフトするビット数であり、rs=32−12−biosで求められる。このシフトにより、シフト後のレジスタの末尾mビットのビット列を対象ビット列として抽出する。対象ビット列の抽出後はレジスタをクリアする。
なお、図53−1〜図53−5において、メモリには図34に示した圧縮符号列が保持されているものとする。また、図53−1〜図53−5のメモリ内のブロックは1バイトのビット列を示しており、内部の数字は、バイト境界となるバイト位置を示している。
図53−1は、初期状態((A)の状態)を示している。(A)では、ビットアドレスabi=0により、バイトオフセットbyos=0、ビットオフセットbios=0となる。バイトオフセットbyos=0により、メモリに保持されている圧縮符号列のうち先頭から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=0により、マスクパターンは、“0xFFF00000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン “0
xFFF00000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=0により、レジスタシフト数rsは、rs=32−m―bios=32−12−0=20となる。したがって、レジスタ内のAND結果を末尾方向に20ビット分シフトする。このシフトによりレジスタには、“110001001100”が残されるため、末尾12ビットを対象ビット列として抽出する。この場合は、“110001001100”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図27に示したように、無節点ハフマン木H2の根の構造体セルC(1,1)には、葉L1〜L1295へのポインタが格納されている。したがって、無節点ハフマン木H2の根の構造体セルC(1,1)の中から、抽出された対象ビット列“110001001100”と一致する葉L♯へのポインタ(枝番号)を探索する。この場合、葉L3421へのポインタ群の中の1つと一致するため、該当する葉L3421へのポインタを読み出して、葉L3421の構造体にアクセスする。
葉L3421の構造体には、文字コード“0x216B”(文字:「次」に相当)が格納されているため、当該文字コード“0x216B”を抽出して伸長バッファ5120に格納する。また、葉L3421の構造体には、文字コード“0x216B”の圧縮符号長leg(=12ビット)も格納されているため、文字コード“0x216B”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=0+12=12となる。
図53−2は、図53−1に示した(A)の状態からレジスタをバイトオフセットbios分シフトした場合の伸長処理((B)の状態)を示している。前回である(A)のビットアドレスabiはabi=0、圧縮符号長legは12ビットであるため、(B)のビットアドレスabiはabi=12ビットとなる。
また、このビットアドレスabi=12により、バイトオフセットbyos=1、ビットオフセットbios=4となる。バイトオフセットbyos=1により、メモリに保持されている圧縮符号列のうち先頭1バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=4により、マスクパターンは、“0x0FFF0000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0x0FFF0000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=4により、レジスタシフト数rsは、rs=32−m―bios=32−12−4=16となる。したがって、レジスタ内のAND結果を末尾方向に16ビット分シフトする。このシフトによりレジスタには、“0000010001001010”が残されるため、末尾12ビットを対象ビット列として抽出する。この場合は、“010001001010”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図27に示したように、無節点ハフマン木H2の根の構造体セルC(1,1)には、葉L1〜L1295へのポインタが格納されている。したがって、無節点ハフマン木H2の根の構造体セルC(1,1)の中から、抽出された対象ビット列“010001001010”と一致する葉L♯へのポインタ(枝番号)を探索する。この場合、対象ビット列“010001001010”が葉L24へのポインタ群の中の1つと一致するため、該当する葉L24へのポインタを読み出して、葉L24の構造体にアクセスする。
葉L24の構造体には、文字コード“0x6E30”(文字:「の」に相当)が格納されているため、当該文字コード“0x6E30”を抽出して伸長バッファ5120に格納する。また、葉L24の構造体には、文字コード“0x6E30”の圧縮符号長leg(=8ビット)も格納されているため、文字コード“0x6E30”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=12+8=20となる。
図53−3は、図53−2に示した(B)の状態からレジスタをバイトオフセットbios分シフトした場合の伸長処理((C)の状態)を示している。前回である(B)のビットアドレスabiはabi=12、圧縮符号長legは8ビットであるため、(C)のビットアドレスabiはabi=20ビットとなる。
また、このビットアドレスabi=20により、バイトオフセットbyos=2、ビットオフセットbios=4となる。バイトオフセットbyos=2により、メモリに保持されている圧縮符号列のうち先頭2バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=4により、マスクパターンは、“0x0FFF0000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0x0FFF0000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=4により、レジスタシフト数rsは、rs=32−m―bios=32−12−4=16となる。したがって、レジスタ内のAND結果を末尾方向に16ビット分シフトする。このシフトによりレジスタには、“0000101001000000”が残されるため、末尾12ビットを対象ビット列として抽出する。この場合は、“101001000000”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図27に示したように、無節点ハフマン木H2の根の構造体セルC(1,1)には、葉L1〜L1295へのポインタが格納されている。したがって、無節点ハフマン木H2の根の構造体セルC(1,1)の中から、抽出された対象ビット列“101001000000”と一致する葉L♯へのポインタ(枝番号)を探索する。この場合、対象ビット列“101001000000”が葉L167へのポインタ群の中の1つと一致するため、該当する葉L167へのポインタを読み出して、葉L167の構造体にアクセスする。
葉L167の構造体には、分割文字コード“0x51”が格納されているため、当該文字コード“0x51”を抽出して伸長バッファ5120に格納する。また、葉L167の構造体には、文字コード“0x51”の圧縮符号長leg(=12ビット)も格納されているため、文字コード“0x51”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=20+12=32となる。
図53−4は、図53−3に示した(C)の状態からレジスタをバイトオフセットbios分シフトした場合の伸長処理((D)の状態)を示している。前回である(C)のビットアドレスabiはabi=20、圧縮符号長legは12ビットであるため、(D)のビットアドレスabiはabi=32ビットとなる。
また、このビットアドレスabi=32により、バイトオフセットbyos=4、ビットオフセットbios=0となる。バイトオフセットbyos=4により、メモリに保持されている圧縮符号列のうち先頭4バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=0により、マスクパターンは、“0xFFF00000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0xFFF00000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=0により、レジスタシフト数rsは、rs=32−m―bios=32−12−0=20となる。したがって、レジスタ内のAND結果を末尾方向に20ビット分シフトする。このシフトによりレジスタには、“101000110101”が残されるため、末尾12ビットを対象ビット列として抽出する。この場合は、“101000110101”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図27に示したように、無節点ハフマン木H2の根の構造体セルC(1,1)には、葉L1〜L1295へのポインタが格納されている。したがって、無節点ハフマン木H2の根の構造体セルC(1,1)の中から、抽出された対象ビット列“101001000000”と一致する葉L♯へのポインタ(枝番号)を探索する。この場合、対象ビット列“101001000000”が葉L156へのポインタ群の中の一つと一致するため、葉L156へのポインタを読み出して、葉L156の構造体にアクセスする。
葉L156の構造体には、分割文字コード“0x4E”が格納されているため、当該文字コード“0x4E”を抽出して伸長バッファ5120に格納する。また、葉L156の構造体には、文字コード“0x4E”の圧縮符号長leg(=12ビット)も格納されているため、文字コード“0x4E”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=32+12=44となる。
図53−5は、図53−4に示した(D)の状態からレジスタをバイトオフセットbios分シフトした場合の伸長処理((E)の状態)を示している。前回である(D)のビットアドレスabiはabi=32、圧縮符号長legは12ビットであるため、(E)のビットアドレスabiはabi=44ビットとなる。
また、このビットアドレスabi=44により、バイトオフセットbyos=5、ビットオフセットbios=4となる。バイトオフセットbyos=5により、メモリに保持されている圧縮符号列のうち先頭5バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=4により、マスクパターンは、“0x0FFF0000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0x0FFF0000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=4により、レジスタシフト数rsは、rs=32−m―bios=32−12−4=16となる。したがって、レジスタ内のAND結果を末尾方向に16ビット分シフトする。このシフトによりレジスタには、“0000011110111111”が残されるため、末尾12ビットを対象ビット列として抽出する。この場合は、“011110111111”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図27に示したように、無節点ハフマン木H2の根の構造体セルC(1,1)には、葉L1〜L1295へのポインタが格納されている。したがって、無節点ハフマン木H2の根の構造体セルC(1,1)の中から、抽出された対象ビット列“011110111111”と一致する葉L♯へのポインタ(枝番号)を探索する。この場合、対象ビット列“011110111111”が葉L2000へのポインタと一致するため、葉L2000へのポインタを読み出して、葉L2000の構造体にアクセスする。
葉L2000の構造体には、文字コード“0x6F30”が格納されているため、当該文字コード“0x6F30”を抽出して伸長バッファ5120に格納する。また、葉L2000の構造体には、文字コード“0x6F30”の圧縮符号長leg(=8ビット)も格納されているため、文字コード“0x6F30”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=44+8=52となる。
また、図51において、照合部5110は、検索キーワードの文字コード列と伸長バッファ5120に格納された伸長コード列とを照合する機能を有する。照合部5110は、伸長コード格納部5109により伸長コードが順次伸長バッファ5120に格納される都度、当該伸長コードに対し照合をおこなう。これにより、伸長処理と同時に検索キーワードとの照合を実行することができ、高速処理を実現することができる。
照合部5110では、具体的には、たとえば、伸長バッファ5120に順次格納される伸長コードのうち、照合フラグがONである伸長コードについて照合をおこなう。照合対象となる文字コードは、検索キーワード内の文字コードである。伸長コードとの照合対象は、伸長コードの伸長コード長により決定する。たとえば、伸長コードの伸長コード長が16ビットである場合、同じように、16ビットの文字コードが照合対象となる。一方、伸長コード長が8ビットである場合、同じように、8ビットの文字コード(分割文字コード)が照合対象となる。なお、照合対象の開始位置は、検索キーワードの先頭である。
照合部5110は、照合一致する都度、照合対象となる文字コードを、後続の文字コードにシフトする。途中で、照合不一致の伸長コードが出現したり、照合フラグOFFの伸長コードが出現したりすると、検索キーワードの先頭から照合をやり直す。
文字列置換部5111は、照合部5110により検索キーワードと一致する文字列が照合された場合、照合された文字列を強調表示するように文字列置換する機能を有する。具体的には、たとえば、照合一致された伸長コード列を、強調表示するためのタグで挟み込む。これにより、検索結果を表示する際に、照合一致された伸長コード列に相当する文字列が強調表示されることとなる。
出力部5112は、伸長バッファ5120に格納されている伸長コード列をファイル化して、伸長後の対象ファイル(伸長ファイル)として出力する。出力された伸長ファイルは、記憶装置に記憶されたり、ディスプレイに表示される。ディスプレイに表示される場合、検索キーワードに一致する伸長コード列は、文字列置換部5111により、強調表示するタグに挟まれているため、ディスプレイ表示時に強調表示される。
図54−1〜図54−3は、照合処理の具体例を示す説明図である。入力バッファ5400には検索キーワード『次の兎』の文字コード列である“216B6E30514E”が格納されているものとする。
図54−1の(A)において、伸長バッファ5120に文字『次』の文字コード“0x216B”が伸長コードとして格納された場合、伸長コード“0x216B”を格納する葉L♯の構造体の照合フラグのON/OFFを判断する。この場合はONであるため、伸長コード“0x216B”について照合をおこなう。
また、伸長コード“0x216B”は16ビット文字コードであるため、照合対象となる文字コードは、先頭から16ビット分の文字コードとなる。本例の場合、文字『次』の文字コード“0x216B”である。この場合、伸長コードと照合対象の文字コードは一致するため、次に伸長バッファ5120に格納される伸長コードについて同様の照合処理をおこなう。
(B)において、伸長バッファ5120に文字『の』の文字コード“0x6E30”が伸長コードとして格納された場合、伸長コード“0x6E30”を格納する葉L♯の構造体の照合フラグのON/OFFを判断する。この場合はONであるため、伸長コード“0x6E30”について照合をおこなう。
また、伸長コード“0x6E30”は16ビット文字コードであるため、照合対象となる文字コードは、文字コード“0x216B”から16ビット分シフトした文字コードとなる。本例の場合、文字『の』の文字コード“0x6E30”である。この場合、伸長コードと照合対象の文字コードは一致するため、次に伸長バッファ5120に格納される伸長コードについて同様の照合処理をおこなう。
(C)において、伸長バッファ5120に文字『兎』の分割文字コード“0x51”が伸長コードとして格納された場合、伸長コード“0x51”を格納する葉L♯の構造体の照合フラグのON/OFFを判断する。この場合はONであるため、伸長コード“0x51”について照合をおこなう。
また、伸長コード“0x51”は8ビット文字コードであるため、照合対象となる文字コードは、文字コード“0x6E30”から8ビット分シフトした文字コードとなる。本例の場合、分割文字コード“0x51”である。この場合、伸長コードと照合対象の文字コードは一致するため、次に伸長バッファ5120に格納される伸長コードについて同様の照合処理をおこなう。
(D)において、伸長バッファ5120に文字『兎』の分割文字コード“0x4E”が伸長コードとして格納された場合、伸長コード“0x4E”を格納する葉L♯の構造体の照合フラグのON/OFFを判断する。この場合はONであるため、伸長コード“0x4E”について照合をおこなう。
また、伸長コード“0x4E”は8ビット文字コードであるため、照合対象となる文字コードは、文字コード“0x51”から8ビット分シフトした文字コードとなる。本例の場合、分割文字コード“0x4E”である。この場合、伸長コードと照合対象の文字コードは一致する。そして、検索キーワード内の文字コード列をすべて照合し、一致したため、伸長バッファ5120内の伸長コード列“216B6E30514E”を強調表示用のタグで挟み込む。これにより、検索結果を表示する際に、検索キーワードに一致する文字列として強調表示することができる。
図54−2では、照合一致の途中で不一致となる文字コードの出現例1を示している。(E)では、図54−1の(A),(B)のように、伸長コード“216B”、“6E30”が照合一致しているものとする。
(E)において、伸長バッファ5120に文字『者』の文字コード“0x0580”が伸長コードとして格納された場合、伸長コード“0x0580”を格納する葉L♯の構造体の照合フラグのON/OFFを判断する。この場合はOFFであるため、伸長コード“0x0580”について照合をおこなわない。また、照合フラグがOFFのため、照合対象となる文字コードは先頭に戻される。
(F)において、伸長バッファ5120に文字『は』の文字コード“0x6F30”が伸長コードとして格納された場合、伸長コード“0x6F30”を格納する葉L♯の構造体の照合フラグのON/OFFを判断する。この場合はOFFであるため、伸長コード“0x6F30”について照合をおこなわない。また、照合フラグがOFFのため、照合対象となる文字コードは先頭に戻される。このように、照合フラグがOFFである伸長コードについては照合がおこなわれないため、無駄な照合処理を防止することができ、照合処理の高速化を実現することができる。
図54−3では、照合一致の途中で不一致となる文字コードの出現例2を示している。(G)では、図54−1の(A),(B)のように、伸長コード“216B”、“6E30”が照合一致しているものとする。
(G)において、伸長バッファ5120に2回目の文字『次』の文字コード“0x216B”が伸長コードとして格納された場合、伸長コード“0x216B”を格納する葉L♯の構造体の照合フラグのON/OFFを判断する。この場合はONであるため、伸長コード“0x216B”について照合をおこなう。
また、伸長コード“0x216B”(2回目)は16ビット文字コードであるため、照合対象となる文字コードは、文字コード“0x6E30”から16ビット分シフトした文字コードとなる。本例の場合、文字『の』の文字コード“0x514E”である。この場合、伸長コードと照合対象の文字コードは不一致であるが、伸長コード“0x216B”(2回目)についての照合フラグはONであり、また、16ビット文字コードである。
したがって、(H)において、照合対象を検索キーワードの先頭から16ビットの文字コード“0x216B”と照合する。この場合、一致するため、次に伸長バッファ5120に格納される伸長コードについて照合処理をおこなうことになる。
(検索キーワード圧縮処理手順)
図55は、検索キーワード圧縮処理手順を示すフローチャートである。まず、入力部5101が、検索キーワードが入力されるのを待ち受ける(ステップS5501:No)。そして、検索キーワードが入力された場合(ステップS5501:Yes)、入力部5101が、検索キーワードを単字分解して(ステップS5502)、検索キーワード圧縮部5102が、無節点ハフマン木H2により検索キーワードを構成する各文字をハフマン圧縮する圧縮処理を実行する(ステップS5503)。圧縮処理(ステップS5503)は、図34および図36〜図38に示した処理と同一であるため、説明を省略する。これにより、検索キーワード圧縮処理を終了する。
(ファイル絞込み処理手順)
図56は、ファイル絞込み処理手順を示すフローチャートである。まず、図55に示した圧縮処理(ステップS5503)において、葉L♯の構造体へのアクセスがあったか否かを判断する(ステップS5601)。葉L♯への構造体へのアクセスがあった場合(ステップS5601:Yes)、葉L♯の構造体の照合フラグをONにする(ステップS5602)。そして、葉L♯の構造体から圧縮符号マップへのポインタと出現率領域を取得する(ステップS5603)。
つぎに、取得した圧縮符号マップへのポインタにより圧縮符号マップにアクセスし(ステップS5604)、アクセス先の圧縮符号マップ伸長処理を実行して(ステップS5605)、ステップS5601に戻る。アクセス先の圧縮符号マップ伸長処理(ステップS5605)については後述する。ステップS5601において、葉L♯の構造体へのアクセスがない場合(ステップS5601:No)、図55に示した検索キーワード圧縮処理が終了したか否かを判断する(ステップS5606)。
終了していない場合(ステップS5606:No)、ステップS5601に戻る。一方、終了した場合(ステップS5606:Yes)、図52に示したように、AND演算による圧縮ファイルの特定を実行する(ステップS5607)。このように特定された圧縮ファイルを「特定圧縮ファイル」と称す。これにより、ファイル絞込み処理を終了する。
(アクセス先の圧縮符号マップ伸長処理手順)
図57は、図56に示したアクセス先の圧縮符号マップ伸長処理(ステップS5605)の詳細な処理手順を示すフローチャートである。まず、図41に示した圧縮パターンテーブルを参照して、ステップS5603で取得した出現率領域が非圧縮領域であるか否かを判断する(ステップS5701)。非圧縮領域である場合(ステップS5701:Yes)、伸長処理を実行せずに、ステップS5601に戻る。
一方、非圧縮領域でない場合(ステップS5701:No)、出現率領域に該当する圧縮符号マップ用ハフマン木を選択する(ステップS5702)。そして、ステップS5603で取得した圧縮符号マップへのポインタによるアクセス先の圧縮符号マップMを、選択された圧縮符号マップ用ハフマン木によりハフマン伸長する(ステップS5703)。そして、出現率が50%以上であるかを判断する(ステップS5704)。
具体的には、出現率領域は、出現率に応じて決められているため(図40を参照)、出現率領域がA〜Eである場合、取得文字コードの出現率が50%以上でないと判断する。一方、出現率領域がA’〜E’である場合、取得文字コードの出現率が50%以上であると判断する。
そして、出現率が50%以上である場合(ステップS5704:Yes)、ステップS4709にて反転させられているため、ステップS5703で伸長されたビット列を反転する(ステップS5705)。これにより、元のビット列に戻ることとなる。
一方、ステップS5704において、出現率が50%以上でない場合(ステップS5704:No)、ビット列反転(ステップS5705)をおこなうことなく、ステップS5601に戻る。
このようなアクセス先の圧縮符号マップ伸長処理(ステップS5605)により、検索キーワードを構成する文字についての圧縮符号マップ内の圧縮符号列のみ伸長することができるため、検索に必要な圧縮符号列の伸長のみでよく、伸長効率の向上を図ることができる。
(伸長処理手順)
図58は、特定圧縮ファイル伸長処理手順を示すフローチャートである。まず、未処理の特定圧縮ファイルがあるか否かを判断する(ステップS5801)。未処理の特定圧縮ファイルがある場合(ステップS5801:Yes)、未処理の特定圧縮ファイルftを1つ選択し(ステップS5802)、選択された特定圧縮ファイルftをオープンする(ステップS5803)。そして、伸長処理を実行する(ステップS5804)。伸長処理(ステップS5804)の詳細については後述する。そして、選択された特定圧縮ファイルftをクローズする(ステップS5805)。
つぎに、選択された特定圧縮ファイルftにおいて、ヒットしたか否かを判断する(ステップS5806)。具体的には、検索キーワードと一致する文字コード列があったか否かを判断する。ヒットした場合(ステップS5806:Yes)、特定圧縮ファイルを伸長した対象ファイル内に検索キーワードと一致する文字コード列が存在することとなり、伸長バッファ5120内のデータをファイル出力する(ステップS5807)。ヒットしなかった場合(ステップS5806:No)、ステップS5808に移行する。
これにより、特定圧縮ファイルから伸長された対象ファイルを得ることができる。このあと、伸長バッファ5120をクリアして(ステップS5808)、ステップS5801に戻る。一方、ステップS5801において、未処理の特定圧縮ファイルがない場合(ステップS5801:No)、特定圧縮ファイル伸長処理を終了する。
(伸長処理手順)
図59および図60は、無節点ハフマン木H2を用いた伸長処理手順を示すフローチャートである。図59において、まず、ビットアドレスabiをabi=0とし(ステップS5901)、バイトオフセットbyosを算出し(ステップS5902)、ビットオフセットbiosを算出する(ステップS5903)。そして、バイトオフセットbyosの位置からの圧縮符号列をレジスタにセットする(ステップS5904)。
つぎに、マスクパターン“0xFFF00000”をビットオフセットbios分、末尾方向にシフトして(ステップS5905)、レジスタにセットされた圧縮符号列とのAND演算をおこなう(ステップS5906)。このあと、レジスタシフト数rsを算出して(ステップS5907)、AND演算後のレジスタをレジスタシフト数rs分、末尾にシフトする(ステップS5908)。
ステップS5908のあと、図60において、シフト後のレジスタから末尾m(m=12)ビットを対象ビット列として抽出する(ステップS6001)。つぎに、無節点ハフマン木H2の根の構造体セルC(1,1)から枝番号となる葉L♯へのポインタを特定し(ステップS6002)、ポイント先となる葉L♯の構造体に1パスでアクセスする(ステップS6003)。そして、アクセス先の葉L♯の構造体から文字コードを抽出し(ステップS6004)、抽出された文字コードを伸長バッファ5120に書き込む(ステップS6005)。
また、葉L♯の構造体から圧縮符号長legを抽出し(ステップS6006)、ビットアドレスabiを更新する(ステップS6007)。このあと、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する(ステップS6008)。たとえば、バイトオフセットbyosに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合(ステップS6008:Yes)、図59のステップS5902に戻る。一方、圧縮符号列がない場合(ステップS6008:No)、一連の伸長処理を終了する。
このような伸長処理により、圧縮符号列からmビット単位で圧縮符号を抽出することができ、さらに、無節点ハフマン木H2の根の構造体セルC(1,1)にアクセスすることで、該当する枝番号となる葉L♯へのポインタを特定することができる。そして、アクセス先となる葉L♯の構造体から文字コードを抽出することで、圧縮符号を伸長する。このように、無節点ハフマン木H2は、内部節点を有していないため、葉L♯へのポインタが特定されれば、1パスで葉L♯の構造体にアクセスすることができ、伸長速度の高速化を図ることができる。
(照合処理手順)
図61および図62は、照合処理手順を示すフローチャートである。まず、図61において、図58のステップS5803における特定圧縮ファイルのオープンが検出されるまで待ち受け(ステップS6101:No)、特定圧縮ファイルのオープンが検出された場合(ステップS6101:Yes)、C=0、S=0に設定する(ステップS6102)。Cは、伸長バッファ5120内の現在位置であり、Sは、検索キーワードを保持している入力バッファ5400内の現在位置である。
そして、図60のステップS6003におけるポイント先となる葉L♯の構造体へのアクセスがあったか否かを判断する(ステップS6103)。アクセスがない場合(ステップS6103:No)、図58のステップS5805において特定圧縮ファイルがクローズしたか否かを判断する(ステップS6104)。クローズしていない場合(ステップS6104:No)、ステップS6103に戻る。クローズした場合(ステップS6104:Yes)、照合処理を終了する。
一方、葉L♯の構造体にアクセスがあった場合(ステップS6103:Yes)、アクセス先の葉L♯の構造体内の照合フラグがONであるか否かを判断する(ステップS6105)。ONでない場合(ステップS6105:No)、今回伸長バッファ5120に格納された伸長コード(アクセス先の葉L♯の構造体内の文字コードに一致)とは照合をおこなわないため、伸長バッファ5120内の現在位置Cに、今回伸長バッファ5120に格納された伸長コードの伸長コード長Lcを加算することで、現在位置Cを更新する(ステップS6106)。これにより、再度、現在位置Cから照合をおこなうことができる。
このあと、入力バッファ5400内の現在位置SをS=0、開始フラグFsをFs=0、開始フラグFs=1になったときの伸長バッファ5120の現在位置CsをCs=0にして(ステップS6107)、ステップS6103に戻る。なお、開始フラグFsとは、検索キーワードの先頭文字の文字コードが一致したときに立てる(Fs=1にする)フラグである。Csはそのときの現在位置Cである。これにより、図54−2に示したような照合処理をおこなうことができる。一方、ステップS6105において、照合フラグがONである場合(ステップS6105:Yes)、図62のステップS6201に移行する。
図62において、照合対象を設定する(ステップS6201)。具体的には、検索キーワードの文字コード列のうち、現在位置Cから今回格納された伸長コードの文字コード長分の文字コードを、伸長コードとの照合対象に設定する。
そして、位置Sからの伸長コードと位置Cからの照合対象の文字コードとを照合(一致判定)する(ステップS6202)。一致する場合(ステップS6202:Yes)、開始フラグFsがFs=1であるか否かを判断する(ステップS6203)。Fs=1である場合(ステップS6203:Yes)、ステップS6206に移行する。一方、Fs=1でない場合(ステップS6203:No)、開始フラグFsをFs=1にし(ステップS6204)、Cs=Cに設定する(ステップS6205)。これにより、検索キーワードの先頭の文字コードと一致した伸長コードの位置を記憶することができる。
ステップS6206において、入力バッファ5400内の現在位置Sに今回伸長バッファ5120に格納された伸長コードの伸長コード長Lcを加算することで、現在位置Sを更新する(ステップS6206)。そして、S=Lsであるか否かを判断する(ステップS6207)。Lsは検索キーワードの文字コード長である。すなわち、現在位置Sが検索キーワードの末尾であるか否かを判断する。S=Lsである場合(ステップS6207:Yes)、検索キーワードと一致する文字列が伸長バッファ5120から得られたため、当該伸長コード列を文字列置換する(ステップS6208)。
このあと、入力バッファ5400内の現在位置SをS=0、開始フラグFsをFs=0、開始フラグFs=1になったときの伸長バッファ5120の現在位置CsをCs=0にする(ステップS6209)。そして、伸長バッファ5120内の現在位置Cを文字列置換後の最後尾に設定する(ステップS6210)。これにより、図54−1に示したような照合処理をおこなうことができる。このあと、ステップS6103に戻る。
また、ステップS6207において、S=Lsでない場合(ステップS6207:No)、伸長コード列の長さが検索キーワードの文字コード長に到達していないため、ステップS6208〜S6210を実行せずに、ステップS6103に戻る。
また、ステップS6202において、位置Sからの伸長コードと位置Cからの照合対象の文字コードとが不一致である場合(ステップS6202:No)、伸長バッファ5120での現在位置CをC=Csとし、入力バッファ5400での現在位置SをS=0にする(ステップS6211)。そして、ステップS6202と同様、照合対象を設定する(ステップS6212)。具体的には、検索キーワードの文字コード列のうち、現在位置C(C=Cs)から今回格納された伸長コードの文字コード長分の文字コードを、伸長コードとの照合対象に設定する。これにより、図54−3に示したような照合処理をおこなうことができる。
このあと、ステップS6202と同様、位置Sからの伸長コードと位置Cからの照合対象の文字コードとを照合(一致判定)する(ステップS6213)。一致する場合(ステップS6213:Yes)、ステップS6203に移行する。
一方、一致しない場合(ステップS6213:No)、入力バッファ5400内の現在位置S(S=0)に今回伸長バッファ5120に格納された伸長コードの伸長コード長Lcを加算することで、現在位置Sを更新する(ステップS6214)。このあと、開始フラグFsをFs=0、CsをCs=0にして(ステップS6215)、ステップS6103に移行する。
このような照合処理により、伸長処理が終了してから照合するのではなく、伸長処理をしながら検索キーワードとの照合をおこなうことができ、照合処理の高速化を実現することができる。
なお、上述の例では、伸長処理をしながら検索キーワードとの照合をおこなうこととしたが、たとえば、国際公開2008/142800号パンフレットのように、検索キーワードを圧縮した圧縮符号群(圧縮キーワード)のまま、照合をおこなって、照合した圧縮符号列を伸長することとしてもよい。このようにしても、照合処理の高速化を実現することができる。
以上説明したように、本実施の形態によれば、文字種を約1300に削減することで省メモリ化を図ることができる。また、文字種の削減により、無節点ハフマン木H2を生成することができる。この無節点ハフマン木H2を用いて圧縮伸長をおこなうことにより、12ビット(つまり、1文字)をまとめて1回で判定することができ、圧縮処理や伸長処理の高速化を実現することができる。
また、圧縮処理と圧縮符号マップ生成処理とをハフマン木探索で共通化することで、圧縮処理と連動して、圧縮符号マップ群Msの生成を並列実行することができる。したがって、プログラムステップと走行ステップの短縮化を図ることができ、対象ファイルFsの圧縮処理と圧縮符号マップ群Msの生成処理との高速化を図ることができる。また、出現頻度が低い低位文字コードは8ビットの分割文字コードに分割して圧縮処理が実行されるため、分割文字コードについても圧縮処理と連動して圧縮符号マップ群Msを生成することができる。
また、圧縮符号マップ群Msの圧縮領域となるビット列を、該当する文字の出現率に応じた圧縮率で圧縮することで、圧縮効率の向上を図るとともに、省メモリ化を図ることができる。また、圧縮符号マップ用ハフマン木4200において、出現率領域に応じて、文字コードが存在しないことを意味する“0”の連続数を多くしている。したがって、文字コードの出現率に応じて圧縮符号マップMsの圧縮効率の向上を図ることができる。
また、圧縮領域となるビット列の配列を先頭からファイル番号pの降順にすることで、対象ファイルが追加されても、ファイル番号の連続性を保持したまま、圧縮領域となるビット列を圧縮することができる。これにより、対象ファイルFの追加機能と圧縮符号マップ群Msの圧縮機能のいずれかを選ぶことなく、両機能を実装することができる。したがって、対象ファイルの追加という自由度の向上と圧縮符号マップ群Msの圧縮という省メモリ化を実現することができる。
また、対象ファイルFの削除の有無をあらわす削除マップMdを用いることで、圧縮符号マップ群を用いた圧縮ファイルの絞込み時において、削除された対象ファイルを絞り込みから除外することができる。これにより、圧縮ファイルの絞込み精度の向上を図るとともに、伸長処理の高速化を実現することができる。
また、伸長処理に連動して、検索キーワードとの照合を並列実行することにより、検索キーワードとの一致判定の高速化を実現することができる。すなわち、圧縮ファイルfの伸長中に検索キーワードの一致判定をおこなっているため、圧縮ファイルが伸長された時点で、検索キーワードに一致する伸長コード列があるか否かがわかることとなる。
また、照合に先立って、検索キーワードを構成する文字コードを格納する葉L♯の構造体の照合フラグをONに設定することで、照合処理の際、照合フラグがONである葉L♯の構造体から得られた伸長コードとの照合を回避することができる。したがって、一致しないと分かっている伸長コードとの照合を実行する必要がないため、照合処理の高速化を実現することができる。
なお、本実施の形態で説明した情報処理方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。このプログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。またこのプログラムは、インターネット等のネットワークを介して配布することが可能な媒体であってもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータを、
文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コードに対応する葉に当該文字コードの圧縮符号マップへのポインタが格納されており前記文字コードを当該文字コードの圧縮符号に変換するハフマン木とを記憶する記憶手段、
前記対象ファイル群の中から選ばれた対象ファイルに記述されている圧縮対象文字コードを前記ハフマン木に従って順次圧縮する圧縮手段、
前記圧縮手段による前記ハフマン木の葉へのアクセスを検出する検出手段、
前記検出手段によって検出された葉に格納されているポインタにより、前記圧縮符号マップ群のうち、前記圧縮対象文字コードの圧縮符号マップを特定する圧縮符号マップ特定手段、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップでの前記圧縮対象文字コードの存否をあらわすビットを更新する更新手段、
として機能させることを特徴とする情報処理プログラム。
(付記2)前記記憶手段は、
前記文字コード、当該文字コードの圧縮符号、および前記文字コードの前記圧縮符号マップへのポインタを格納する葉と前記葉の数に応じた長さとなる葉へのポインタが前記各葉に対する枝として前記文字コードの出現率に応じた個数分割り当てられている根とを有する無節点ハフマン木と、前記文字コードごとに当該文字コードを格納する葉の構造体へのポインタを有する文字構造体と、を記憶しており、
前記圧縮手段は、
前記圧縮対象文字コードを前記文字構造体から探索して、前記圧縮対象文字コードを格納する葉へのポインタを前記文字構造体から抽出する圧縮対象文字コード探索手段と、
前記圧縮対象文字コード探索手段によって抽出された前記圧縮対象文字コードを格納する葉へのポインタを取得して、前記無節点ハフマン木のうち前記圧縮対象文字コードを格納する葉を指定し、当該指定された葉から前記圧縮対象文字コードの圧縮符号を抽出するハフマン木探索手段と、
前記ハフマン木探索手段によって抽出された圧縮符号を所定の記憶領域に格納する圧縮符号格納手段と、を備え、
前記検出手段は、
前記ハフマン木探索手段による前記葉への指定を検出し、
前記圧縮符号マップ特定手段は、
前記検出手段によって前記葉への指定が検出された場合、当該指定された葉に格納されている圧縮符号マップへのポインタを取得して、ポイント先となる圧縮符号マップを前記圧縮符号マップ群から特定することを特徴とする付記1に記載の情報処理プログラム。
(付記3)前記記憶手段は、
節点の階層数がk階層(kはk≧2の自然数)、節点からその下位節点への枝数が2n本(nはn≧2の自然数)、第i階層(iは1≦i≦kの自然数)の節点数が2n(i−1)であり、前記各節点が上位節点へのポインタを格納しており、かつ、葉または下位節点への2n個のポインタを格納可能な節点集合を記憶しており、
前記コンピュータを、
前記対象ファイルに記述されている文字コードの出現頻度の集計結果を取得する取得手段、
前記取得手段によって取得された集計結果に基づいて、前記文字コードを出現確率P(Pは1/2ni≦P<1/2n(i−1)。ただし、i=1のときは1/2ni≦P<1、i=nのときはP<1/2n(i−1))に応じて階層別に分類する分類手段、
前記分類手段によって分類された前記第i階層の文字コード数に基づいて、前記第i階層の葉へのポインタ数を算出するとともに、当該第i階層の葉へのポインタ数に基づいて、(i+1)階層の節点をリンク先とする前記第i階層の下位節点へのポインタ数と前記第i階層の節点の使用数とを算出する算出手段、
前記算出手段によって算出された算出結果に基づいて、2n分枝ハフマン木を生成する2n分枝ハフマン木生成手段、
前記2n分枝ハフマン木生成手段によって生成された2n分枝ハフマン木を、2m分枝(ただし、m=n×k)の無節点ハフマン木に変換して、前記記憶手段に記憶する変換手段、
として機能させることを特徴とする付記2に記載の情報処理プログラム。
(付記4)前記2n分枝ハフマン木生成手段は、
前記算出手段によって算出された算出結果に基づいて、前記第i階層の葉へのポインタと前記第i階層の下位節点へのポインタを生成するポインタ生成手段、
前記第i階層の使用数分の節点に、前記ポインタ生成手段によって生成された前記第i階層の葉へのポインタと前記第i階層の下位節点へのポインタとを格納するポインタ格納手段、
前記分類手段によって分類された前記第i階層の文字ごとに、前記ポインタ格納手段によって前記第i階層の節点に格納された葉へのポインタにより前記第i階層の節点のリンク先となる葉を、前記文字コードごとに生成する葉生成手段、
前記葉生成手段によって生成された葉に、当該葉の番号に対応付けられた文字コードを格納することにより、2n分枝ハフマン木を生成する文字コード格納手段を備えることを特徴とする付記3に記載の情報処理プログラム。
(付記5)前記コンピュータを、
前記2n分枝ハフマン木において前記第i階層の葉へのポインタ数と第(i−1)階層の空き節点内の空きポインタ数とを検出する検出手段、
前記検出手段によって検出された前記第i階層の葉へのポインタ数と第(i−1)階層の空き節点内の空きポインタ数とに基づいて、前記第i階層から前記第(i−1)階層の空き節点への移動対象となる前記第i階層の葉へのポインタ(以下、「移動対象ポインタ」という)を特定する特定手段、
前記特定手段によって特定された移動対象ポインタを格納する節点へのポインタを前記第(i−1)階層の節点から削除し、前記移動対象ポインタを前記第(i−1)階層の節点に移動させる最適化手段として機能させ、
前記変換手段は、
前記最適化手段によって最適化された2n分枝ハフマン木を、前記2m分枝の無節点ハフマン木に変換して、前記記憶手段に記憶することを特徴とする付記4に記載の情報処理プログラム。
(付記6)前記変換手段は、
前記2n分枝ハフマン木の階層数と前記第i階層の葉の数に基づいて、前記第i階層の葉ごとに葉へのポインタの種類数を決定する決定手段と、
前記2n分枝ハフマン木の葉を複製する複製手段と、
2m個の葉へのポインタを格納可能な根を生成して、前記記憶手段に格納する根生成手段と、
前記決定手段によって決定された種類数に基づいて、前記複製手段によって複製された葉ごとに当該葉へのポインタを生成して、前記根生成手段によって生成された根に格納する第1の構築手段と、
前記葉に対する当該葉へのポインタ群に共通のビット列からなる圧縮符号を抽出し、当該圧縮符号およびその圧縮符号長を前記葉に格納して前記葉を再構築することにより、前記根および前記葉からなる無節点ハフマン木を生成する第2の構築手段と、
を備えることを特徴とする付記3〜5のいずれか一つに記載の情報処理プログラム。
(付記7)前記コンピュータを、
前記文字コードを出現頻度の降順にソートするソート手段、
前記ソート手段によってソートされた結果、前記文字コードのうち前記出現頻度の高位の文字コードと低位の文字コードとに分け、前記低位の文字コードを上位ビットコードと下位ビットコードに分割する分割手段、
前記分割手段によって分割された上位ビットコードおよび下位ビットコードの出現頻度を集計する集計手段として機能させ、
前記分類手段は、
前記高位の文字コードの集計結果と前記集計手段によって集計された集計結果とに基づいて、前記文字コードを出現確率Pに応じて階層別に分類することを特徴とする付記3〜6のいずれか一つに記載の情報処理プログラム。
(付記8)前記コンピュータを、
前記圧縮対象文字コードをビット数が同数となるように2つに分割する分割手段として機能させ、
前記圧縮符号マップ群は、
出現頻度が所定頻度以上の高位文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップと、出現頻度が前記所定頻度未満の低位文字コードを分割した分割文字コードの前記対象ファイル群での存否をあらわすビット列を有する圧縮符号マップとを有し、
前記無節点ハフマン木は、
前記高位文字コード、当該高位文字コードの圧縮符号、および前記高位文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と、前記分割文字コード、当該分割文字コードの圧縮符号、および前記分割文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と、前記葉へのポインタを格納する根とを有し、
前記文字構造体は、
前記高位文字コードごとに当該高位文字コードを格納する葉の構造体へのポインタを有する高位文字コード構造体と、前記分割文字コードごとに当該分割文字コードを格納する葉へのポインタを有する分割文字コード構造体とを有し、
前記分割手段は、
前記圧縮対象文字コード探索手段により、前記圧縮対象文字コードが前記高位文字コード構造体になかった場合、前記圧縮対象文字コードを分割して、上位の圧縮対象分割文字コードと下位の圧縮対象分割文字コードを生成し、
前記圧縮対象文字コード探索手段は、
前記分割手段によって分割された圧縮対象分割文字コードごとに当該圧縮対象文字コードを前記分割文字コード構造体から探索して、前記圧縮対象分割文字コードを格納する葉へのポインタを前記分割文字コード構造体から抽出し、
前記ハフマン木探索手段は、
前記圧縮対象文字コード探索手段によって抽出された前記圧縮対象分割文字コードを格納する葉へのポインタを取得して、前記圧縮対象分割文字コードを格納する葉を指定し、当該指定された葉から前記圧縮対象分割文字コードの圧縮符号を抽出し、
前記圧縮符号格納手段は、
前記ハフマン木探索手段によって抽出された前記分割文字コードの圧縮符号を前記所定の記憶領域に格納することを特徴とする付記2〜7のいずれか1つに記載の情報処理プログラム。
(付記9)前記圧縮符号マップ群のビット列は、
先頭位置から末尾位置にかけて前記対象ファイルのファイル番号の降順に配列された圧縮領域であり、
前記記憶手段は、
所定ビット数により表現されるパターンをすべて網羅した複数種類の記号列と前記所定ビット数よりもビット数が多い特殊記号列とをリーフとする圧縮符号マップ用ハフマン木を記憶しており、
前記コンピュータを、
前記対象ファイルの追加が検出された場合、前記ファイル番号が連続するように採番し、前記文字コードごとに当該文字コードの前記追加された対象ファイルでの存否をあらわすビット列を、前記対象ファイルのファイル番号と連続するように配列した非圧縮領域を設定する非圧縮領域設定手段、
前記圧縮領域のビット列群の中から選ばれた任意のビット列を、前記圧縮符号マップ用ハフマン木を用いて圧縮するビット列圧縮手段、
として機能させることを特徴とする付記8に記載の情報処理プログラム。
(付記10)前記記憶手段は、
前記対象ファイル群での前記文字コードの出現率に応じた圧縮率となる複数種類の圧縮符号マップ用ハフマン木と、前記出現率と前記複数種類の圧縮符号マップ用ハフマン木との対応付けるテーブルとを記憶しており、
前記ビット列圧縮手段は、
前記圧縮符号マップごとに、前記テーブルを参照して、前記複数種類の圧縮符号マップ用ハフマン木の中から、前記圧縮符号マップに対応する文字コードの出現率に応じた圧縮率となる圧縮符号マップ用ハフマン木を抽出し、当該抽出された圧縮符号マップ用ハフマン木を用いて、前記圧縮符号マップの圧縮領域のビット列を圧縮することを特徴とする付記9に記載の情報処理プログラム。
(付記11)前記特殊記号列は、前記文字コードが出現しないことを意味する記号が連続する記号列であることを特徴とする付記9または10に記載の情報処理プログラム。
(付記12)前記複数種類の圧縮符号マップ用ハフマン木は、
50%未満の出現率に応じた圧縮率となるハフマン木の集合であり、
前記ビット列圧縮手段は、
前記文字コードの出現率Qが50%以上である場合、当該文字コードに対応する圧縮符号マップの圧縮領域のビット列を反転し、前記テーブルを参照して、前記複数種類の圧縮符号マップ用ハフマン木の中から、(100−Q)%の出現率に応じた圧縮率となる圧縮符号マップ用ハフマン木を抽出し、当該抽出された圧縮符号マップ用ハフマン木を用いて、前記反転されたビット列を圧縮することを特徴とする付記9〜11のいずれか1つに記載の情報処理プログラム。
(付記13)コンピュータを、
文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コード、当該文字コードの圧縮符号、および前記文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と前記葉の数に応じた長さとなる葉へのポインタが前記各葉に対する枝として前記文字コードの出現率に応じた個数分割り当てられている根とを有する無節点ハフマン木と、前記文字コードごとに当該文字コードを格納する葉の構造体へのポインタを有する文字構造体と、前記無節点ハフマン木を用いて前記対象ファイル群から圧縮された圧縮ファイル群と、を記憶する記憶手段、
検索キーワードの入力を受け付ける入力手段、
前記文字構造体を参照して、前記入力手段によって入力された検索キーワードを構成する文字コードごとに葉へのポインタを取得して、当該葉へのポインタにより葉にアクセスして、当該アクセス先の葉に格納されている圧縮符号を抽出する検索キーワード圧縮手段、
前記アクセス先の葉に格納されている圧縮符号マップへのポインタを取得して、前記検索キーワードを構成する文字コードごとに圧縮符号マップを特定する圧縮符号マップ特定手段、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップを参照することにより、前記検索キーワードを構成する文字コードごとに、前記圧縮ファイル群の中から、前記検索キーワードを構成する文字コードが存在する対象ファイルの圧縮ファイルを特定する圧縮ファイル特定手段、
前記圧縮ファイル特定手段によって特定された圧縮ファイルの中から前記葉へのポインタと同じ長さとなる圧縮符号列を抽出する抽出手段、
前記抽出手段によって抽出された圧縮符号列と一致する葉へのポインタを前記無節点ハフマン木の根から特定し、前記抽出された圧縮符号列と一致する葉へのポインタのポイント先となる葉を特定する葉特定手段、
前記葉特定手段によって特定された葉の中の文字コードを伸長コードとして抽出して、前記所定の記憶領域に格納する伸長コード格納手段、
として機能させることを特徴とする情報検索プログラム。
(付記14)前記記憶手段は、
前記圧縮ファイルの存否をあらわすビット列を有する削除マップを記憶しており、
前記圧縮ファイル特定手段は、
前記圧縮符号マップ群を参照することにより、前記入力手段によって入力された検索キーワードを構成する文字コードごとに、前記圧縮ファイル群の中から、前記検索キーワードを構成する文字コードが存在し、かつ、削除されていない対象ファイルの圧縮ファイルを特定することを特徴とする付記13に記載の情報検索プログラム。
(付記15)前記記憶手段は、
所定ビット数により表現されるパターンをすべて網羅した複数種類の記号列と前記所定ビット数よりもビット数が多い特殊記号列とをリーフとする圧縮符号マップ用ハフマン木を記憶しており、
前記圧縮符号マップ群は、
前記圧縮符号マップ用ハフマン木を用いて前記ビット列が圧縮された圧縮領域を有し、
前記コンピュータを、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップの圧縮領域を、前記圧縮符号マップ用ハフマン木を用いて伸長する圧縮符号マップ伸長手段として機能させ、
前記圧縮ファイル特定手段は、
前記圧縮符号マップ伸長手段によって伸長された圧縮符号マップを参照することにより、前記検索キーワードを構成する文字コードごとに、前記圧縮ファイル群の中から、前記検索キーワードを構成する文字コードが存在する対象ファイルの圧縮ファイルを特定することを特徴とする付記13または14に記載の情報検索プログラム。
(付記16)前記コンピュータを、
順次格納される伸長コードと照合する照合対象文字コードを、前記伸長コードとの一致回数に基づいて前記検索キーワードの中から設定し、前記順次格納される伸長コードと前記照合文字コードとを逐次照合し、順次格納された伸長コード列と前記検索キーワードとが一致するか否かを判定する照合手段、
前記照合手段によって照合された照合結果を出力する出力手段、
として機能させることを特徴とする付記13〜15のいずれか1つに記載の情報検索プログラム。
(付記17)前記葉は、前記照合手段による照合の可否をあらわす照合フラグを有し、
前記コンピュータを、
前記圧縮符号マップ特定手段により、前記検索キーワード圧縮手段によって圧縮された圧縮符号ごとに前記葉へのポインタを特定したときに、特定先の葉の照合フラグを照合許可をあらわす値に設定する照合フラグ設定手段として機能させ、
前記照合手段は、
前記葉特定手段によって特定された葉の照合フラグに基づいて、照合許可をあらわす葉から順次格納される伸長コードと前記照合フラグ設定手段によって設定された文字コードとを逐次照合し、順次格納された伸長コード列と前記検索キーワードとが一致するか否かを判定することを特徴とする付記16に記載の情報検索プログラム。
(付記18)文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コードに対応する葉に当該文字コードの圧縮符号マップへのポインタが格納されており前記文字コードを当該文字コードの圧縮符号に変換するハフマン木とを記憶する記憶手段と、
前記対象ファイル群の中から選ばれた対象ファイルに記述されている圧縮対象文字コードを前記ハフマン木に従って順次圧縮する圧縮手段と、
前記圧縮手段による前記ハフマン木の葉へのアクセスを検出する検出手段と、
前記検出手段によって検出された葉に格納されているポインタにより、前記圧縮符号マップ群のうち、前記圧縮対象文字コードの圧縮符号マップを特定する圧縮符号マップ特定手段と、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップでの前記圧縮対象文字コードの存否をあらわすビットを更新する更新手段と、
を備えることを特徴とする情報処理装置。
(付記19)文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コード、当該文字コードの圧縮符号、および前記文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と前記葉の数に応じた長さとなる葉へのポインタが前記各葉に対する枝として前記文字コードの出現率に応じた個数分割り当てられている根とを有する無節点ハフマン木と、前記文字コードごとに当該文字コードを格納する葉の構造体へのポインタを有する文字構造体と、前記無節点ハフマン木を用いて前記対象ファイル群から圧縮された圧縮ファイル群と、を記憶する記憶手段と、
検索キーワードの入力を受け付ける入力手段と、
前記文字構造体を参照して、前記入力手段によって入力された検索キーワードを構成する文字コードごとに葉へのポインタを取得して、当該葉へのポインタにより葉にアクセスして、当該アクセス先の葉に格納されている圧縮符号を抽出する検索キーワード圧縮手段と、
前記アクセス先の葉に格納されている圧縮符号マップへのポインタを取得して、前記検索キーワードを構成する文字コードごとに圧縮符号マップを特定する圧縮符号マップ特定手段と、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップを参照することにより、前記検索キーワードを構成する文字コードごとに、前記圧縮ファイル群の中から、前記検索キーワードを構成する文字コードが存在する対象ファイルの圧縮ファイルを特定する圧縮ファイル特定手段と、
前記圧縮ファイル特定手段によって特定された圧縮ファイルの中から前記葉へのポインタと同じ長さとなる圧縮符号列を抽出する抽出手段と、
前記抽出手段によって抽出された圧縮符号列と一致する葉へのポインタを前記無節点ハフマン木の根から特定し、前記抽出された圧縮符号列と一致する葉へのポインタのポイント先となる葉を特定する葉特定手段と、
前記葉特定手段によって特定された葉の中の文字コードを伸長コードとして抽出して、前記所定の記憶領域に格納する伸長コード格納手段と、
を備えることを特徴とする情報検索装置。