JP5062131B2 - 情報処理プログラム、情報処理装置、および情報処理方法 - Google Patents

情報処理プログラム、情報処理装置、および情報処理方法 Download PDF

Info

Publication number
JP5062131B2
JP5062131B2 JP2008259507A JP2008259507A JP5062131B2 JP 5062131 B2 JP5062131 B2 JP 5062131B2 JP 2008259507 A JP2008259507 A JP 2008259507A JP 2008259507 A JP2008259507 A JP 2008259507A JP 5062131 B2 JP5062131 B2 JP 5062131B2
Authority
JP
Japan
Prior art keywords
leaf
layer
node
pointer
huffman tree
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2008259507A
Other languages
English (en)
Other versions
JP2010093414A (ja
Inventor
正弘 片岡
秀人 東
孝 坪倉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2008259507A priority Critical patent/JP5062131B2/ja
Priority to US12/543,243 priority patent/US7880648B2/en
Publication of JP2010093414A publication Critical patent/JP2010093414A/ja
Application granted granted Critical
Publication of JP5062131B2 publication Critical patent/JP5062131B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/40Conversion to or from variable length codes, e.g. Shannon-Fano code, Huffman code, Morse code

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Compression, Expansion, Code Conversion, And Decoders (AREA)

Description

この発明は、ハフマン木の生成、生成されたハフマン木の変換、ハフマン木を用いた圧縮、伸長をおこなう情報処理プログラム、情報処理装置、および情報処理方法に関する。
英文テキストの圧縮データを圧縮形式のままで有限オートマトンにより検索する技術が開示されている(たとえば、下記非特許文献1を参照。)。また、データの符号化や経路制御テーブルに木構造を適用した技術が開示されている(たとえば、下記特許文献1、2を参照。)。
深町修一、篠原武、竹田正幸著 「可変長符号圧縮データのための文字列パターン照合−ゲノム情報の高速検索技法−」1992 情報学シンポジウム 講演論文集 1992年1月8日 p.95−103 特開平10−271012号公報 特開2000−188608号公報
しかしながら、上述した非特許文献1では、オートマトンで文字認識を行うための遷移テーブルが増加するため、日本語化については実用化されていない。また、8ビットコードの256種に比べ16ビットコードの64K種の文字コードでは、遷移テーブルの生成時間とサイズが相乗的に拡大するという問題がある。したがって、日本語化については実用化が困難である。
また、上述した特許文献1、2では、16ビットコードを対象にハフマン圧縮を行うと出現頻度が低い文字の圧縮符号が20ビット以上になるため、無節点の線形探索のテーブルが2の20乗に肥大化するという問題がある。
この発明は、上述した従来技術による問題点を解消するため、文字コードの圧縮効率の向上と圧縮処理や伸長処理の高速化を図ることができる情報処理プログラム、情報処理装置、および情報処理方法を提供することを目的とする。
上述した課題を解決し、目的を達成するため、この情報処理プログラム、情報処理装置、および情報処理方法は、節点の階層数が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分枝ハフマン木を、2m分枝(ただし、m=n×k)の無節点ハフマン木に変換して記憶することを要件とする。
この情報処理プログラム、情報処理装置、および情報処理方法によれば、文字コードの圧縮効率の向上と圧縮処理や伸長処理の高速化を図ることができるという効果を奏する。
以下に添付図面を参照して、この情報処理プログラム、情報処理装置、および情報処理方法の好適な実施の形態を詳細に説明する。まず、本実施の形態にかかる2n分枝ハフマン木について説明する。2n分枝ハフマン木とは、節点からその下位節点への枝数が2n本のハフマン木である。nはn≧2の自然数である。節点の階層数はk(kはk≧2の自然数)である。また、第i階層(iは1≦i≦kの自然数)の節点数は2n(i-1)である。各節点が上位節点へのポインタを格納している。
また、各節点は、2n個の葉または下位節点への2n個のポインタを格納可能である。2n分枝ハフマン木は2nビットの文字コードの圧縮に用いられる。本実施の形態では、16ビットの文字コードを圧縮/伸長の対象とする場合はn=4とし、8ビットの文字コードを圧縮/伸長の対象とする場合はn=2とする。日本語の漢字等は16ビットコードで表現されるため、以下、n=4、k=4として説明する。
<2n分枝ハフマン木>
図1は、2n(n=4により2n=16)分枝ハフマン木の生成元となる節点集合体を示す説明図である。この節点集合体100において、第1階層では1個の節点の構造体セル、第2階層では16個の節点の構造体セル、第3階層では256個の節点の構造体セル、第4階層では4096個の節点の構造体セルを有する。各構造体セルC(i,j)は、リンク元となる上位節点のポインタを格納している。最上位となる第1階層の節点の構造体C(1,1)は、根の構造体であるため、上位節点のポインタはない。
図2は、2n分枝ハフマン木を示す説明図である。図2では、n=4、すなわち、16分枝ハフマン木である。2n分枝ハフマン木H1において、根は図1の第1階層の節点の構造体セルC(1,1)に相当する。また、(A)〜(C)は節点または葉を示している。図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は、圧縮前処理を示す説明図である。対象ファイル300には数千〜数万種の文字が記述されており、本プログラムでは、対象ファイル300内の文字コードについて出現頻度を集計して降順にソートする。そして、高位(たとえば、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において、情報処理装置500は、入力部501と、取得部502と、分類部506と、算出部507と、2n分枝ハフマン木生成部(ポインタ生成部508、ポインタ格納部509、葉生成部510、文字コード格納部511)と、検出部512と、特定部513と、最適化部514と、文字構造体生成部515と、を備えている。
入力部501〜文字構造体生成部515は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されたプログラムをCPU401に実行させることにより、または、I/F409により、その機能を実現する。
入力部501は、対象ファイル300から文字コードを入力する機能を有する。具体的には、たとえば、CPU401が対象ファイル300を走査して2nビットの文字コードを順次対象ファイル300から読み出す。読み出された文字コードはCPU401内のレジスタに保持される。
取得部502は、対象ファイル300に記述されている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がアクセス可能である。
分割部505は、ソート部504によってソートされた結果、文字コードのうち出現頻度の高位の文字コードと低位の文字コードとに分け、低位の文字コードを上位ビットコードと下位ビットコードに分割する機能を有する。具体的には、たとえば、文字出現頻度集計テーブル600の文字(コード)を計数値の降順にソートした結果、たとえば、1位〜1024位までの文字コードを高位文字コードとし、1025位以降の文字コードを低位文字コードとする。CPU401は、この低位文字コードを、図3の例1)や例2)に示したように、上位8ビットコードと下位8ビットコードに分割する。
上位8ビットコードや下位8ビットコードといった分割文字コードは、最大256種となる。16ビットコードでは最大6万種以上の文字が割り当てられ、同数の葉が必要となるが、出現順位の低い低位文字コードを分割することで、1025位以降の最大約6万種の文字コードを、たかだか256種の分割文字コードで表現できる。したがって、文字コードに割り当てる葉の数を大幅に削減(1024+256+予約語数十種)することができる。この場合、集計部503は、分割文字コードの出現頻度を再集計する。
図9は、分割文字コード出現頻度集計テーブルを示す説明図である。分割文字コード出現頻度集計テーブル900も、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されており、CPU401がアクセス可能である。そして、ソート部504では、16ビットである高位文字コード、予約語、分割文字コード(以下、「文字コード等」という)を統合して、図8に示した集計結果テーブル800を更新する。
分類部506は、取得部502によって取得された集計結果に基づいて、文字コード等を出現確率Pに応じて階層別に分類する機能を有する。具体的には、たとえば、集計結果テーブル800を参照して、文字コード等を出現確率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階層の葉へのポインタ数と下位節点へのポインタ数を取得する。
n分枝ハフマン木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階層の節点(根)の構造体、16個の第2階層の節点の構造体、256個の第3階層の節点の構造体、4096個の第4階層の節点の構造体、および1295個の葉L#の構造体で構成される。
節点の構造体は、上位節点のポインタ1110と下位第1節点へのポインタ1111〜第16節点へのポインタ1126の17種のポインタで構成される。葉L♯の構造体は、第1領域1130〜第3領域1132を有する。第1領域1130には、上位節点へのポインタが格納される。具体的には、たとえば、第i階層のj番目の節点の構造体の下位第12節点へのポインタがl番目の葉L♯の構造体をポイントしていた場合、第1領域1130には、第i階層のj番目の節点の構造体への先頭アドレス(ポインタ)が格納される。
また、第2領域1131には、葉の標識および伸長種別などが格納される。葉の標識とは、圧縮や伸長の際に参照されるフラグであり、「0」(OFFを示す)の場合は一般の節点を、「1」(ONを示す)の場合は葉を意味する。伸長種別は、伸長対象の出現頻度が高位の16ビットの文字コードか、低位の分割8ビット文字コードか、または予約語かをしめすものである。第3領域1132には、伸長種別に対応して、高位の1ビット文字コード、低位の分割8ビット文字コード、または予約語へのポインタが格納される。
文字コード格納部511は、葉生成部510によって生成された葉に、当該葉の番号に対応付けられた文字コードを格納することにより、2n分枝ハフマン木H1を生成する機能を有する。具体的には、たとえば、文字コードの出現頻度の順位(図8を参照)と一致する葉L♯の番号♯を格納する葉L♯の構造体の第3領域1132にその文字コードを格納する。予約語の場合は、予約語へのポインタを格納する。なお、第3領域1132の大きさによっては予約語の文字コード列を格納してもよい。
このように、葉生成部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♯の構造体が格納する情報に相当する。なお、葉L♯の構造体では圧縮符号は格納しないが、図15では圧縮符号と文字コードとの対応関係を明確にするために圧縮符号も記載している。なお、圧縮符号は2n分枝ハフマン木H1の根から該当する葉L♯までの枝番号となる下位節点へのポインタ〜葉へのポインタのコード列である。図15に示した内容は、図2に示した最適化後の2n分枝ハフマン木H1に対応する。
図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により対象ファイル300を読み込む(ステップ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)、葉へのポインタ数の累計値ΣNl
p(i)、第i階層における先頭からの空きセル数Ncst(i)、第i階層における末尾までの空きポインタ数Npse(i)、第i階層における末尾までの空きセル数Ncse(i)を算出する(ステップS2103〜S2109)。
そして、階層番号iを1ポイントインクリメントし(ステップS2110)、ステップS2102に戻る。ステップS2102において、i>kである場合(ステップS2002: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であってもよい。
<無節点ハフマン木>
つぎに、無節点ハフマン木について説明する。無節点ハフマン木とは、根と葉のみからなる内部節点のないハフマン木である。無節点ハフマン木は、枝の本数が多くなるが、根から1パスで葉にアクセスすることができる。
図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〜第3領域2803を有する。第1領域2801には、圧縮符号およびその圧縮符号長が格納される。第2領域2802には、葉の標識と伸長種別が格納される。第3領域2803には、伸長種別に応じて高位16ビット文字コード、低位の分割8ビット文字コード、または予約語へのポインタが格納される。
図29は、葉L♯の構造体に格納される情報を示す説明図である。各レコードが葉l♯の構造体に相当する。各葉L♯の構造体は、圧縮符号およびその圧縮符号長、葉の標識、伸長種別、文字コード(16/8ビット)または予約語へのポインタの情報を含む。
<2n分枝ハフマン木H1→無節点ハフマン木H2への変換>
無節点ハフマン木H2は、2n分枝ハフマン木H1からの変換により生成することができる。具体的には、たとえば、2n分枝ハフマン木H1から2m分枝(m=n×k)の無節点ハフマン木H2を生成することができる。以下、2m分枝の無節点ハフマン木H2へ変換するための機能的構成について説明する。
<情報処理装置500の機能的構成2>
図30は、実施の形態にかかる情報処理装置500の機能的構成2を示すブロック図である。なお、図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個の葉へのポインタを格納可能な根を生成して、記憶部2610に格納する機能を有する。具体的には、たとえば、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の構造体に格納される。
また、葉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の構造体に格納される。
また、葉L135については、1種の葉L135へのポインタL135P(1)が生成されているとした場合、以下のようなビット列となる。
ポインタL135P(1):101000100000
ポインタL135P(1)は1種だけであるため、この12ビット“101000100000”が葉L135の構造体の圧縮符号として特定される。また、この圧縮符号長は12ビットであるため、圧縮符号“101000100000”とともに葉L135の構造体に格納される。このように構築することで、無節点ハフマン木H2が生成されることとなる。
また、文字構造体生成部515は、あらたに構築された無節点ハフマン木H2を参照して文字構造体530を再度生成(更新)することとなる。すなわち、予約語の構造体1600や上位文字コードの構造体1700、分割文字コードの構造体1800中、葉へのポインタは、あらたに生成された葉へのポインタが格納されることとなる。
<2n分枝ハフマン木H1→2m分枝無節点ハフマン木変換処理>
図31は、情報処理装置500が自動実行する2n分枝ハフマン木H1→2m分枝無節点ハフマン木変換処理手順を示すフローチャートである。図31において、まず、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)。そして、種類数分の葉へのポインタから圧縮符号および圧縮符号長を特定して、葉の構造体に格納する(ステップS3109)。このあと、ステップS3105に戻る。
一方、ステップS3106において、未選択の葉L♯の構造体がない場合(ステップS3106:No)、階層番号iを1ポイントインクリメントして(ステップS3110)、2n分枝ハフマン木H1の階層数kに対してi>kであるか否かを判断する(ステップS3111)。i>kでない場合(ステップS3111:No)、ステップS3105に戻る。一方、i>kである場合(ステップS3111:Yes)、一連の変換処理を終了する。
このように、2n分枝ハフマン木H1から2m分枝の無節点ハフマン木H2に変換することにより、無節点ハフマン木H2が圧縮や伸長に用いられることとなる。無節点ハフマン木H2を圧縮や伸長に用いることにより、2n分枝ハフマン木H1にくらべて圧縮率および検索速度の向上を図ることができる。
<無節点ハフマン木を用いた圧縮伸長>
つぎに、2m分枝の無節点ハフマン木H2を用いた圧縮伸長について説明する。2m分枝の無節点ハフマン木H2では1パスで葉にアクセスできるため、検索速度の高速化を図ることができる。以下、そのための機能的構成について説明する。
<情報処理装置500の機能的構成3>
図32は、実施の形態にかかる情報処理装置500の機能的構成3を示すブロック図である。なお、図5に示した構成と同一構成には同一符号を付し、その説明を省略する。図32において、情報処理装置500は、分割部505と、設定部3201と、圧縮対象文字コード探索部3202と、ハフマン木探索部3204と、圧縮符号格納部3205と、抽出部3206と、伸長コード格納部3207と、記憶部3210と、を備えている。
設定部3201〜伸長コード格納部3207は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体に記憶されたプログラムをCPU401に実行させることにより、または、I/F409により、その機能を実現する。また、記憶部3210は、図4に示したRAM403、磁気ディスク405、光ディスク407などの記憶媒体によりその機能を実現する。
設定部3201は、圧縮処理をおこなう場合、圧縮対象文字コードを設定する機能を有する。また、伸長処理をおこなう場合、圧縮符号列を設定する機能を有する。具体的には、たとえば、入力されてくる圧縮対象文字コードや圧縮符号列を、CPU401が内部のレジスタや外部のバッファに書き込む。
図33は、圧縮対象文字コード列の一例を示す説明図である。ここでは、「次の兎は」という文字列を圧縮対象文字列とし、その文字コード列を示している。なお、「兎」は低位文字コードであるため、上位8ビットと下位8ビットに分割される。
図34は、圧縮符号列の一例を示す説明図である。ここでも、「次の兎は」という文字列の圧縮符号列を示している。「兎」は上位8ビットと下位8ビットに分割されているため、圧縮符号も分割文字コードごとに割り当てられる。
圧縮対象文字コード探索部3202は、高位の文字コード群の中から設定部3201によって設定された圧縮対象文字コードを探索する機能を有する。具体的には、たとえば、CPU401が、レジスタにセットされた圧縮対象文字コードを、文字構造体530、すなわち、予約語の構造体1600、高位文字コードの構造体1700を走査することで探索する。
予約語の構造体1600、高位文字コードの構造体1700により一致する文字コードが探索されなかった場合は、CPU401は、分割部505により、圧縮対象文字コードを上位ビットと下位ビットに分割し、分割文字コードごとに、分割文字コードの構造体1800を走査して探索する。
ハフマン木探索部3204は、探索された文字コード等に対応付けられた葉L♯へのポインタを用いて、探索された文字コード等の圧縮符号を探索する機能を有する。具体的には、たとえば、CPU401は、文字構造体530から、一致した文字コード等に対応付けられている葉L♯へのポインタを読み出して、当該葉L♯の構造体を特定する。そして、ポイントされた葉L♯の構造体に格納されている文字コードの圧縮符号を抽出する。
たとえば、図26を用いて説明すると、葉L256に対応する文字コードが上位文字コードとして探索された場合、葉L256へのポインタを上位文字コードの構造体1700から読み出して、葉L256にアクセスする。この葉L256の構造体に格納されている文字コードの圧縮符号を葉L256の構造体から抽出する。
圧縮符号格納部3205は、ハフマン木探索部3204によって探索された圧縮符号を所定の記憶領域に格納する機能を有する。具体的には、たとえば、CPU401が、探索された圧縮符号を圧縮バッファ3211に書き込む。
抽出部3206は、設定部3201によって設定された圧縮符号列のうち圧縮符号間の境界を検出して、当該境界からの伸長対象コードを圧縮符号列から抽出する機能を有する。具体的な抽出手法については後述するが、この抽出部3206では、圧縮符号長が異なる圧縮符号列でも圧縮符号ごとに抽出することができる。
伸長コード格納部3207は、ハフマン木探索部3204によって探索された伸長コードを所定の記憶領域に格納する機能を有する。具体的には、たとえば、CPU401が、伸長コードを伸長バッファ3212に書き込む。伸長バッファ3212に書き込まれた伸長コードは、既存技術により文字として描画される。
<2m分枝の無節点ハフマン木H2を用いた圧縮処理>
つぎに、2m分枝の無節点ハフマン木H2を用いた圧縮処理について説明する。2m分枝の無節点ハフマン木H2を用いた圧縮処理では、ハフマン木探索において、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉L♯の構造体に格納されている文字コードを抽出して、圧縮バッファ3211に書き込む。これにより、圧縮処理の高速化を図ることができる。
<圧縮処理の具体例>
図35は、2m分枝の無節点ハフマン木H2を用いた圧縮処理の具体例を示す説明図である。まず、対象ファイル300から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に格納する。
<圧縮処理手順>
図36は、情報処理装置500が自動実行する2m分枝の無節点ハフマン木H2を用いた圧縮処理手順を示すフローチャート(その1)である。図36において、まず、対象ファイル300に圧縮対象文字コードがあるか否かを判断する(ステップS3601)。ある場合(ステップS3601:Yes)、圧縮対象文字コードを取得してレジスタにセットする(ステップS3602)。そして、先頭の圧縮対象文字コードか否かを判断する(ステップS3603)。
ここで、先頭の圧縮対象文字コードとは、未圧縮の1文字目の文字コードをいう。先頭である場合(ステップS3603:Yes)、その圧縮対象文字コードの対象ファイル300上の位置(先頭位置)となるポインタを取得し(ステップ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)、一連の処理を終了する。このループが予約語の圧縮処理の流れとなる。一方、ステップS3606において不一致となった場合(ステップS3606:No)、16ビットの文字コードの圧縮処理のループに入る。
図37は、情報処理装置500が自動実行する2m分枝の無節点ハフマン木H2を用いた圧縮処理手順を示すフローチャート(その2)である。図37において、ステップS3604で取得された先頭位置のポインタを参照して、対象ファイル300から圧縮対象文字コードを取得してレジスタにセットする(ステップS3701)。
つぎに、圧縮対象文字コードについて、高位文字コードの構造体1700に対して2分木探索をおこなう(ステップS3702)。一致した場合(ステップS3703:Yes)、該当する文字の葉L♯へのポインタにより葉L♯の構造体にアクセスする(ステップS3704)。そして、ポイントされた葉L♯の構造体に格納されている圧縮対象文字コードの圧縮符号を抽出する(ステップS3705)。
この後、探索された圧縮符号を圧縮バッファ3211に格納して(ステップS3706)、ステップS3601に戻る。このループが16ビットの文字コードの圧縮処理の流れとなる。一方、ステップS3703において一致する文字コードが存在しなかった場合(ステップS3703:No)、分割文字コードの圧縮処理のループに入る。
図38は、情報処理装置500が自動実行する2m分枝の無節点ハフマン木H2を用いた圧縮処理手順を示すフローチャート(その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種の分割文字コードの圧縮符号に圧縮することができる。したがって、圧縮率の向上を図ることができる。
<伸長処理の具体例>
図39−1〜図39−5は、2m分枝の無節点ハフマン木H2を用いた伸長処理の具体例を示す説明図である。図39−1〜図39−5では、図34に示した圧縮符号列を伸長する例を示している。伸長処理では、レジスタに圧縮符号列をセットし、マスクパターンにより圧縮符号を抽出する。抽出した圧縮符号を、1パス(1枝分のアクセス)で2m分枝の無節点ハフマン木H2の根から探索する。そして、アクセスした葉L♯の構造体に格納されている文字コードを読み出して伸長バッファ3212に格納する。
圧縮符号を抽出するため、マスクパターンのマスク位置をオフセットする。また、マスクパターンの初期値を“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ビットのビット列を対象ビット列として抽出する。対象ビット列の抽出後はレジスタをクリアする。
なお、図39−1〜図39−5において、メモリには図34に示した圧縮符号列が保持されているものとする。また、図39−1〜図39−5のメモリ内のブロックは1バイトのビット列を示しており、内部の数字は、バイト境界となるバイト位置を示している。
図39−1は、初期状態((A)の状態)を示している。(A)では、ビットアドレスabi=0により、バイトオフセットbyos=0、ビットオフセットbios=0となる。バイトオフセットbyos=0により、メモリに保持されている圧縮符号列のうち先頭から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=0により、マスクパターンは、“0xFFF00000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン “0xFFF00000”を論理積(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”を抽出して伸長バッファ3212に格納する。また、葉L3421の構造体には、文字コード“0x216B”の圧縮符号長leg(=12ビット)も格納されているため、文字コード“0x216B”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=0+12=12となる。
図39−2は、図39−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”を抽出して伸長バッファ3212に格納する。また、葉L24の構造体には、文字コード“0x6E30”の圧縮符号長leg(=8ビット)も格納されているため、文字コード“0x6E30”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=12+8=20となる。
図39−3は、図39−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へのポインタを読み出して、葉L24の構造体にアクセスする。
葉L167の構造体には、分割文字コード“0x51”が格納されているため、当該文字コード“0x51”を抽出して伸長バッファ3212に格納する。また、葉L167の構造体には、文字コード“0x51”の圧縮符号長leg(=12ビット)も格納されているため、文字コード“0x51”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=20+12=32となる。
図39−4は、図39−3に示した(C)の状態からレジスタをバイトオフセットbios分シフトした場合の伸長処理((D)の状態)を示している。前回である(C)のビットアドレスabiはabi=20、圧縮符号長legは12ビットであるため、(C)のビットアドレス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”を抽出して伸長バッファ3212に格納する。また、葉L156の構造体には、文字コード“0x4E”の圧縮符号長leg(=12ビット)も格納されているため、文字コード“0x4E”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=32+12=44となる。
図39−5は、図39−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”を抽出して伸長バッファ3212に格納する。また、葉L2000の構造体には、文字コード“0x6F30”の圧縮符号長leg(=8ビット)も格納されているため、文字コード“0x6F30”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=44+8=52となる。
<伸長処理手順>
図40および図41は、情報処理装置500が自動実行する無節点ハフマン木を用いた伸長処理手順を示すフローチャートである。図40において、まず、ビットアドレスabiをabi=0とし(ステップS4001)、バイトオフセットbyosを算出し(ステップS4002)、ビットオフセットbiosを算出する(ステップS4003)。そして、バイトオフセットbyosの位置からの圧縮符号列をレジスタにセットする(ステップS4004)。
つぎに、マスクパターン“0xFFF00000”をビットオフセットbios分、末尾方向にシフトして(ステップS4005)、レジスタにセットされた圧縮符号列とのAND演算をおこなう(ステップS4006)。このあと、レジスタシフト数rsを算出して(ステップS4007)、AND演算後のレジスタをレジスタシフト数rs分、末尾にシフトする(ステップS4008)。
ステップS4008のあと、図41において、シフト後のレジスタから末尾m(m=12)ビットを対象ビット列として抽出する(ステップS4101)。つぎに、無節点ハフマン木H2の根の構造体セルC(1,1)から枝番号となる葉L♯へのポインタを特定し(ステップS4102)、ポイント先となる葉L♯の構造体に1パスでアクセスする(ステップS4103)。そして、アクセス先の葉L♯の構造体から文字コードを抽出し(ステップS4104)、抽出された文字コードを伸長バッファ3212に書き込む(ステップS4105)。
また、葉L♯の構造体から圧縮符号長legを抽出し(ステップS4106)、ビットアドレスabiを更新する(ステップS4107)。このあと、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する(ステップS4108)。たとえば、バイトオフセットbyosに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合(ステップS4108:Yes)、図40のステップS4002に戻る。一方、圧縮符号列がない場合(ステップS4108:No)、一連の伸長処理を終了する。
このような伸長処理により、圧縮符号列からmビット単位で圧縮符号を抽出することができ、さらに、無節点ハフマン木H2の根の構造体セルC(1,1)にアクセスすることで、該当する枝番号となる葉L♯へのポインタを特定することができる。そして、アクセス先となる葉L♯の構造体から文字コードを抽出することで、圧縮符号を伸長する。このように、無節点ハフマン木H2は、内部節点を有していないため、葉L♯へのポインタが特定されれば、1パスで葉L♯の構造体にアクセスすることができ、伸長速度の高速化を図ることができる。
以上説明したように、本実施の形態によれば、文字種を約1300に削減することで省メモリ化を図ることができる。また、文字種の削減により、無節点ハフマン木H2を生成することができる。この無節点ハフマン木H2を用いて圧縮伸長をおこなうことにより、12ビット(つまり、1文字)をまとめて1回で判定することができ、伸長の高速化を実現することができる。
なお、本実施の形態で説明した情報処理方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。このプログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。またこのプログラムは、インターネット等のネットワークを介して配布することが可能な媒体であってもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータを、
節点の階層数が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)前記2n分枝ハフマン木生成手段は、
前記算出手段によって算出された算出結果に基づいて、前記第i階層の葉へのポインタと前記第i階層の下位節点へのポインタを生成するポインタ生成手段、
前記第i階層の使用数分の節点に、前記ポインタ生成手段によって生成された前記第i階層の葉へのポインタと前記第i階層の下位節点へのポインタとを格納するポインタ格納手段、
前記分類手段によって分類された前記第i階層の文字ごとに、前記ポインタ格納手段によって前記第i階層の節点に格納された葉へのポインタにより前記第i階層の節点のリンク先となる葉を、前記文字コードごとに生成する葉生成手段、
前記葉生成手段によって生成された葉に、当該葉の番号に対応付けられた文字コードを格納することにより、2n分枝ハフマン木を生成する文字コード格納手段を備えることを特徴とする付記1に記載の情報処理プログラム。
(付記3)前記コンピュータを、
前記2n分枝ハフマン木において前記第i階層の葉へのポインタ数と第(i−1)階層の空き節点内の空きポインタ数とを検出する検出手段、
前記検出手段によって検出された前記第i階層の葉へのポインタ数と第(i−1)階層の空き節点内の空きポインタ数とに基づいて、前記第i階層から前記第(i−1)階層の空き節点への移動対象となる前記第i階層の葉へのポインタ(以下、「移動対象ポインタ」という)を特定する特定手段、
前記特定手段によって特定された移動対象ポインタを格納する節点へのポインタを前記第(i−1)階層の節点から削除し、前記移動対象ポインタを前記第(i−1)階層の節点に移動させる最適化手段として機能させ、
前記変換手段は、
前記最適化手段によって最適化された2n分枝ハフマン木を、前記2m分枝の無節点ハフマン木に変換して、前記記憶手段に記憶することを特徴とする付記2に記載の情報処理プログラム。
(付記4)前記変換手段は、
前記2n分枝ハフマン木の階層数と前記第i階層の葉の数に基づいて、前記第i階層の葉ごとに葉へのポインタの種類数を決定する決定手段と、
前記2n分枝ハフマン木の葉を複製する複製手段と、
m個の葉へのポインタを格納可能な根を生成して、前記記憶手段に格納する根生成手段と、
前記決定手段によって決定された種類数に基づいて、前記複製手段によって複製された葉ごとに当該葉へのポインタを生成して、前記根生成手段によって生成された根に格納する第1の構築手段と、
前記葉に対する当該葉へのポインタ群に共通のビット列からなる圧縮符号を抽出し、当該圧縮符号およびその圧縮符号長を前記葉に格納して前記葉を再構築することにより、前記根および前記葉からなる無節点ハフマン木を生成する第2の構築手段と、
を備えることを特徴とする付記1〜3のいずれか一つに記載の情報処理プログラム。
(付記5)前記コンピュータを、
前記文字コードを出現頻度の降順にソートするソート手段、
前記ソート手段によってソートされた結果、前記文字コードのうち前記出現頻度の高位の文字コードと低位の文字コードとに分け、前記低位の文字コードを上位ビットコードと下位ビットコードに分割する分割手段、
前記分割手段によって分割された上位ビットコードおよび下位ビットコードの出現頻度を集計する集計手段として機能させ、
前記分類手段は、
前記高位の文字コードの集計結果と前記集計手段によって集計された集計結果とに基づいて、前記文字コードを出現確率Pに応じて階層別に分類することを特徴とする付記1〜4のいずれか一つに記載の情報処理プログラム。
(付記6)前記コンピュータを、
圧縮対象文字コード列を設定する文字コード設定手段、
前記文字コード設定手段によって設定された圧縮対象文字コード列の中から圧縮対象文字コードを取り出して、前記無節点ハフマン木の葉の中から前記圧縮対象文字コードを含む葉を特定し、特定された葉の中から圧縮符号を抽出するハフマン木探索手段、
前記ハフマン木探索手段によって抽出された圧縮符号を所定の記憶領域に格納する圧縮符号格納手段、
として機能させることを特徴とする付記1〜4のいずれか一つに記載の情報処理プログラム。
(付記7)前記コンピュータを、
前記文字コードごとに、前記文字コードと当該文字コードを格納する葉へのポインタとからなる文字構造体を生成して、前記記憶手段に記憶する文字構造体生成手段、
前記文字構造体生成手段によって生成された文字構造体を探索することにより、前記圧縮対象文字コードを格納する葉へのポインタを抽出する圧縮対象文字コード探索手段として機能させ、
前記ハフマン木探索手段は、
前記圧縮対象文字コード探索手段によって抽出された葉へのポインタにより前記無節点ハフマン木の該当する葉にアクセスし、アクセス先の葉の中から圧縮符号を抽出することを特徴とする付記6に記載の情報処理プログラム。
(付記8)前記コンピュータを、
前記高位の文字コードごとに、前記文字コードと当該文字コードを格納する葉へのポインタとからなる第1の文字構造体を生成するとともに、前記上位ビットコードおよび前記下位ビットコードごとに、前記ビットコードと当該ビットコードを格納する葉へのポインタとからなる第2の文字構造体を生成して、前記記憶手段に記憶する文字構造体生成手段、
圧縮対象文字コード列を設定する文字コード設定手段、
前記文字構造体生成手段によって生成された第1の文字構造体を探索することにより、前記圧縮対象文字コードを格納する葉へのポインタを抽出する圧縮対象文字コード探索手段、
前記圧縮対象文字コード探索手段によって抽出された葉へのポインタにより前記無節点ハフマン木の該当する葉にアクセスし、アクセス先の葉の中から圧縮符号を抽出するハフマン木探索手段、
前記ハフマン木探索手段によって抽出された圧縮符号を所定の記憶領域に格納する圧縮符号格納手段、
として機能させることを特徴とする付記5に記載の情報処理プログラム。
(付記9)前記分割手段は、
前記ハフマン木探索手段によって前記第1の文字構造体の中から前記圧縮対象文字コードに該当する文字コードが探索されなかった場合、前記圧縮対象文字コードを圧縮対象上位ビットコードと圧縮対象下位ビットコードに分割し、
前記圧縮対象文字コード探索手段は、
前記分割手段によって前記圧縮対象文字コードが前記圧縮対象上位ビットコードと前記圧縮対象下位ビットコードに分割された場合、前記文字構造体生成手段によって生成された第2の文字構造体を探索することにより、前記圧縮対象上位ビットコードを格納する葉へのポインタを抽出するとともに、前記圧縮対象下位ビットコードを格納する葉へのポインタを抽出し、
前記ハフマン木探索手段は、
前記圧縮対象文字コード探索手段によって抽出された前記圧縮対象上位ビットコードを格納する葉へのポインタを読み出して前記無節点ハフマン木の該当する葉にアクセスし、アクセス先の葉の中から前記圧縮対象上位ビットコードの圧縮符号を抽出するとともに、前記圧縮対象下位ビットコードを格納する葉へのポインタを読み出して前記無節点ハフマン木の該当する葉にアクセスし、アクセス先の葉の中から前記圧縮対象下位ビットコードの圧縮符号を抽出し、
前記圧縮符号格納手段は、
前記ハフマン木探索手段によって抽出された前記圧縮対象上位ビットコードの圧縮符号を前記所定の記憶領域に格納するとともに、前記ハフマン木探索手段によって抽出された前記圧縮対象下位ビットコードの圧縮符号を前記所定の記憶領域に格納することを特徴とする付記8に記載の情報処理プログラム。
(付記10)前記コンピュータを、
圧縮符号列を設定する圧縮符号列設定手段、
前記圧縮符号列設定手段によって設定された圧縮符号列の中からmビットの圧縮符号を順次抽出する抽出手段、
前記抽出手段によって抽出された圧縮符号を用いて、前記無節点ハフマン木の根から探索するハフマン木探索手段、
前記ハフマン木探索手段によって探索された葉に格納されている文字コードを抽出して、前記所定の記憶領域に格納する伸長コード格納手段、
として機能させることを特徴とする付記6〜9のいずれか一つに記載の情報処理プログラム。
(付記11)節点の階層数がk階層(kはk≧2の自然数)、節点からその下位節点への枝数が2n本(nはn≧2の自然数)、第i階層(iは1≦i≦kの自然数)の節点数が2n(i-1)であり、前記各節点が上位節点へのポインタを格納しており、かつ、葉または下位節点への2n個のポインタを格納可能な節点集合を記憶する記憶手段と、
対象ファイルに記述されている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)の無節点ハフマン木に変換して、前記記憶手段に記憶する変換手段と、
を備えることを特徴とする情報処理装置。
(付記12)節点の階層数が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)の無節点ハフマン木に変換して、前記記憶手段に記憶する変換工程と、
を実行することを特徴とする情報処理方法。
n(16)分枝ハフマン木の生成元となる節点集合体を示す説明図である。 n(16)分枝ハフマン木を示す説明図である。 圧縮前処理を示す説明図である。 実施の形態にかかる情報処理装置のハードウェア構成を示すブロック図である。 実施の形態にかかる情報処理装置の機能的構成1を示すブロック図である。 文字出現頻度集計テーブルを示す説明図である。 予約語出現頻度集計テーブルを示す説明図である。 文字コードおよび予約語の出現頻度を統合した集計結果テーブルを示す説明図である。 分割文字コード出現頻度集計テーブルを示す説明図である。 算出部による算出結果テーブルを示す説明図である。 n(16)分枝ハフマン木の構造体を示す説明図である。 n分枝ハフマン木の構造体を示す説明図である。 第4階層から第3階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。 第3階層から第2階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。 第2階層から第1階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。 最適化後の2n分枝ハフマン木の構造体を示す説明図である。 最適化後の2n分枝ハフマン木における葉の構造体が格納する情報を示す説明図である。 予約語の構造体を示す説明図である。 高位文字コードの構造体を示す説明図である。 分割文字コードの構造体を示す説明図である。 情報処理装置が自動実行する2n分枝ハフマン木生成処理手順を示すフローチャートである。 図20は、図19に示した葉数削減処理(ステップS1903)の詳細な処理手順を示すフローチャートである。 図19に示したパラメータ算出処理(ステップS1905)の詳細な処理手順を示すフローチャートである。 図19に示した構造体セル構築処理(ステップS1906)の詳細な処理手順を示すフローチャートである。 図22に示した第i階層の構造体セルC(i,j)の構築処理(ステップS2204)の詳細な処理手順を示すフローチャート(前半)である。 図22に示した第i階層の構造体セルC(i,j)の構築処理(ステップS2204)の詳細な処理手順を示すフローチャート(後半)である。 図19に示した最適化処理(ステップS1907)の詳細な処理手順を示すフローチャートである。 m(4096)分枝の無節点ハフマン木を示す説明図である。 無節点ハフマン木の節点(根)の構造体を示す説明図である。 無節点ハフマン木の葉の構造体を示す説明図である。 葉の構造体に格納される情報を示す説明図である。 実施の形態にかかる情報処理装置の機能的構成2を示すブロック図である。 情報処理装置が自動実行する2n分枝ハフマン木→2m分枝無節点ハフマン木変換処理手順を示すフローチャートである。 実施の形態にかかる情報処理装置の機能的構成3を示すブロック図である。 圧縮対象文字コード列の一例を示す説明図である。 圧縮符号列の一例を示す説明図である。 圧縮処理の具体例を示す説明図である。 情報処理装置が自動実行する無節点ハフマン木を用いた圧縮処理手順を示すフローチャート(その1)である。 情報処理装置が自動実行する無節点ハフマン木を用いた圧縮処理手順を示すフローチャート(その2)である。 情報処理装置が自動実行する無節点ハフマン木を用いた圧縮処理手順を示すフローチャート(その3)である。 無節点ハフマン木を用いた伸長処理の具体例(その1)を示す説明図である。 無節点ハフマン木を用いた伸長処理の具体例(その2)を示す説明図である。 無節点ハフマン木を用いた伸長処理の具体例(その3)を示す説明図である。 無節点ハフマン木を用いた伸長処理の具体例(その4)を示す説明図である。 無節点ハフマン木を用いた伸長処理の具体例(その5)を示す説明図である。 情報処理装置が自動実行する無節点ハフマン木を用いた伸長処理手順を示すフローチャート(前半)である。 情報処理装置が自動実行する無節点ハフマン木を用いた伸長処理手順を示すフローチャート(後半)である。
符号の説明
100 節点集合体
300 対象ファイル
500 情報処理装置
501 入力部
502 取得部
503 集計部
504 ソート部
505 分割部
506 分類部
507 算出部
508 ポインタ生成部
509 ポインタ格納部
510 葉生成部
511 文字コード格納部
512 検出部
513 特定部
514 最適化部
515 文字構造体生成部
520 算出結果テーブル
530 文字構造体
3001 決定部
3002 複製部
3003 根生成部
3004 第1の構築部
3005 第2の構築部
3201 設定部
3202 圧縮対象文字コード探索部
3204 ハフマン木探索部
3205 圧縮符号格納部
3206 抽出部
3207 伸長コード格納部
3210 記憶部
3211 圧縮バッファ
3212 伸長バッファ

Claims (7)

  1. コンピュータを、
    節点の階層数が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/2n≦P<1、i=nのときはP<1/2n(n-1))に応じて階層別に分類する分類手段、
    前記分類手段によって分類された前記第i階層の文字コード数に基づいて、前記第i階層の葉へのポインタ数を算出するとともに、当該第i階層の葉へのポインタ数に基づいて、(i+1)階層の節点をリンク先とする前記第i階層の下位節点へのポインタ数と前記第i階層の節点の使用数とを算出する算出手段、
    前記算出手段によって算出された算出結果に基づいて、2n分枝ハフマン木を生成する2n分枝ハフマン木生成手段、
    前記2n分枝ハフマン木生成手段によって生成された2n分枝ハフマン木を、2m分枝(ただし、m=n×k)の無節点ハフマン木に変換して、前記記憶手段に記憶する変換手段、
    として機能させることを特徴とする情報処理プログラム。
  2. 前記2n分枝ハフマン木生成手段は、
    前記算出手段によって算出された算出結果に基づいて、前記第i階層の葉へのポインタと前記第i階層の下位節点へのポインタを生成するポインタ生成手段、
    前記第i階層の使用数分の節点に、前記ポインタ生成手段によって生成された前記第i階層の葉へのポインタと前記第i階層の下位節点へのポインタとを格納するポインタ格納手段、
    前記分類手段によって分類された前記第i階層の文字ごとに、前記ポインタ格納手段によって前記第i階層の節点に格納された葉へのポインタにより前記第i階層の節点のリンク先となる葉を、前記文字コードごとに生成する葉生成手段、
    前記葉生成手段によって生成された葉に、当該葉の番号に対応付けられた文字コードを格納することにより、2n分枝ハフマン木を生成する文字コード格納手段を備えることを特徴とする請求項1に記載の情報処理プログラム。
  3. 前記コンピュータを、
    前記2n分枝ハフマン木において前記第i階層の葉へのポインタ数と第(i−1)階層
    の空き節点内の空きポインタ数とを検出する検出手段、
    前記検出手段によって検出された前記第i階層の葉へのポインタ数と第(i−1)階層の空き節点内の空きポインタ数とに基づいて、前記第i階層から前記第(i−1)階層の空き節点への移動対象となる前記第i階層の葉へのポインタ(以下、「移動対象ポインタ」という)を特定する特定手段、
    前記特定手段によって特定された移動対象ポインタを格納する節点へのポインタを前記第(i−1)階層の節点から削除し、前記移動対象ポインタを前記第(i−1)階層の節点に移動させる最適化手段として機能させ、
    前記変換手段は、
    前記最適化手段によって最適化された2n分枝ハフマン木を、前記2m分枝の無節点ハフマン木に変換して、前記記憶手段に記憶することを特徴とする請求項2に記載の情報処理プログラム。
  4. 前記変換手段は、
    前記2n分枝ハフマン木の階層数と前記第i階層の葉の数に基づいて、前記第i階層の葉ごとに葉へのポインタの種類数を決定する決定手段と、
    前記2n分枝ハフマン木の葉を複製する複製手段と、
    葉へのポインタを格納可能な根を生成して、前記記憶手段に格納する根生成手段と、
    前記決定手段によって決定された種類数に基づいて、前記複製手段によって複製された葉ごとに当該葉へのポインタを生成して、前記根生成手段によって生成された根に格納する第1の構築手段と、
    前記葉に対する当該葉へのポインタ群に共通のビット列からなる圧縮符号を抽出し、当該圧縮符号およびその圧縮符号長を前記葉に格納して前記葉を再構築することにより、前記根および前記葉からなる無節点ハフマン木を生成する第2の構築手段と、
    を備えることを特徴とする請求項1〜3のいずれか一つに記載の情報処理プログラム。
  5. 前記コンピュータを、
    前記文字コードを出現頻度の降順にソートするソート手段、
    前記ソート手段によってソートされた結果、前記文字コードのうち前記出現頻度の高位の文字コードと低位の文字コードとに分け、前記低位の文字コードを上位ビットコードと下位ビットコードに分割する分割手段、
    前記分割手段によって分割された上位ビットコードおよび下位ビットコードの出現頻度を集計する集計手段として機能させ、
    前記分類手段は、
    前記高位の文字コードの集計結果と前記集計手段によって集計された集計結果とに基づいて、前記文字コードを出現確率Pに応じて階層別に分類することを特徴とする請求項1〜4のいずれか一つに記載の情報処理プログラム。
  6. 節点の階層数が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/2n≦P<1、i=nのときはP<1/2n(n-1))に応じて階層別に分類する分類手段と、
    前記分類手段によって分類された前記第i階層の文字コード数に基づいて、前記第i階層の葉へのポインタ数を算出するとともに、当該第i階層の葉へのポインタ数に基づいて、(i+1)階層の節点をリンク先とする前記第i階層の下位節点へのポインタ数と前記第i階層の節点の使用数とを算出する算出手段と、
    前記算出手段によって算出された算出結果に基づいて、2n分枝ハフマン木を生成する2n分枝ハフマン木生成手段と、
    前記2n分枝ハフマン木生成手段によって生成された2n分枝ハフマン木を、2m分枝(ただし、m=n×k)の無節点ハフマン木に変換して、前記記憶手段に記憶する変換手段と、
    を備えることを特徴とする情報処理装置。
  7. 節点の階層数が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/2n≦P<1、i=nのときはP<1/2n(n-1))に応じて階層別に分類する分類工程と、
    前記分類工程によって分類された前記第i階層の文字コード数に基づいて、前記第i階層の葉へのポインタ数を算出するとともに、当該第i階層の葉へのポインタ数に基づいて、(i+1)階層の節点をリンク先とする前記第i階層の下位節点へのポインタ数と前記第i階層の節点の使用数とを算出する算出工程と、
    前記算出工程によって算出された算出結果に基づいて、2n分枝ハフマン木を生成する2n分枝ハフマン木生成工程と、
    前記2n分枝ハフマン木生成工程によって生成された2n分枝ハフマン木を、2m分枝(ただし、m=n×k)の無節点ハフマン木に変換して、前記記憶手段に記憶する変換工程と、
    を実行することを特徴とする情報処理方法。
JP2008259507A 2008-10-06 2008-10-06 情報処理プログラム、情報処理装置、および情報処理方法 Active JP5062131B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2008259507A JP5062131B2 (ja) 2008-10-06 2008-10-06 情報処理プログラム、情報処理装置、および情報処理方法
US12/543,243 US7880648B2 (en) 2008-10-06 2009-08-18 Information processing apparatus, information processing method, and computer product

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008259507A JP5062131B2 (ja) 2008-10-06 2008-10-06 情報処理プログラム、情報処理装置、および情報処理方法

Publications (2)

Publication Number Publication Date
JP2010093414A JP2010093414A (ja) 2010-04-22
JP5062131B2 true JP5062131B2 (ja) 2012-10-31

Family

ID=42075373

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008259507A Active JP5062131B2 (ja) 2008-10-06 2008-10-06 情報処理プログラム、情報処理装置、および情報処理方法

Country Status (2)

Country Link
US (1) US7880648B2 (ja)
JP (1) JP5062131B2 (ja)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9031216B1 (en) * 2009-03-05 2015-05-12 Google Inc. In-conversation search
WO2012111078A1 (ja) 2011-02-14 2012-08-23 富士通株式会社 生成プログラム、生成装置、および生成方法
JP5605288B2 (ja) * 2011-03-31 2014-10-15 富士通株式会社 出現マップ生成方法、ファイル抽出方法、出現マップ生成プログラム、ファイル抽出プログラム、出現マップ生成装置、およびファイル抽出装置
JP5845824B2 (ja) 2011-11-04 2016-01-20 富士通株式会社 暗号化プログラム、復号化プログラム、暗号化方法、復号化方法、システム、コンテンツの生成方法およびコンテンツの復号化方法
JP5766588B2 (ja) * 2011-11-16 2015-08-19 クラリオン株式会社 検索端末装置、検索サーバ装置、及びセンタ連携型検索システム
JP5895545B2 (ja) * 2012-01-17 2016-03-30 富士通株式会社 プログラム、圧縮ファイル生成方法、圧縮符号伸張方法、情報処理装置、および記録媒体
JPWO2014030180A1 (ja) * 2012-08-20 2016-07-28 富士通株式会社 符号化情報生成プログラム、符号化情報生成方法、符号化情報生成装置、復号化情報生成プログラム、復号化情報生成方法及び復号化情報生成装置
WO2014045320A1 (ja) 2012-09-21 2014-03-27 富士通株式会社 制御プログラム、制御方法および制御装置
AU2013382910B2 (en) 2013-03-22 2017-01-05 Fujitsu Limited Compression device, compression method, decompression device, decompression method, and information processing system
KR20150119403A (ko) 2013-03-22 2015-10-23 후지쯔 가부시끼가이샤 압축 장치, 압축 방법, 사전 생성 장치, 사전 생성 방법, 신장 장치, 신장 방법, 신장 프로그램 및 정보 처리 시스템
JP6447161B2 (ja) 2015-01-20 2019-01-09 富士通株式会社 意味構造検索プログラム、意味構造検索装置、及び意味構造検索方法
JP2016171589A (ja) * 2016-05-23 2016-09-23 富士通株式会社 符号化プログラム、符号化方法、符号化装置、復号化プログラム、復号化方法及び復号化装置
JP6737025B2 (ja) 2016-07-19 2020-08-05 富士通株式会社 符号化プログラム、検索プログラム、符号化装置、検索装置、符号化方法、及び検索方法
JP6680126B2 (ja) * 2016-07-25 2020-04-15 富士通株式会社 符号化プログラム、符号化装置、符号化方法、及び検索方法
JP2017195628A (ja) * 2017-06-26 2017-10-26 富士通株式会社 符号化プログラム、符号化方法、符号化装置、復号化プログラム、復号化方法及び復号化装置

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05110450A (ja) * 1991-10-18 1993-04-30 Canon Inc 符号生成装置
JPH06131151A (ja) * 1992-10-15 1994-05-13 Sony Corp データ伝送装置及びデータ伝送方法
JPH0936748A (ja) * 1995-07-19 1997-02-07 Toshiba Corp ハフマン符号化方法及びその装置並びにハフマン復号化方法及びその装置
JP3305190B2 (ja) * 1996-03-11 2002-07-22 富士通株式会社 データ圧縮装置及びデータ復元装置
JP3421563B2 (ja) 1997-01-21 2003-06-30 富士通株式会社 データ符号化方法及びデータ符号化装置、並びに、データ復号化方法及びデータ復号化装置、並びに、それらをコンピュータで実現するためのプログラムが記憶された記録媒体
JP3421700B2 (ja) * 1998-01-22 2003-06-30 富士通株式会社 データ圧縮装置及び復元装置並びにその方法
US6040790A (en) * 1998-05-29 2000-03-21 Xerox Corporation Method of building an adaptive huffman codeword tree
JP3970448B2 (ja) * 1998-12-21 2007-09-05 株式会社日立製作所 情報中継方法および装置
JP2001136075A (ja) * 1999-11-05 2001-05-18 Fujitsu Ltd データ圧縮/復元装置及びデータ圧縮/復元プログラムを記録した記憶媒体
JP2002330076A (ja) * 2001-04-27 2002-11-15 Sanyo Electric Co Ltd ハフマン復号装置及び復号方法
JP3425143B2 (ja) * 2001-12-28 2003-07-07 富士通株式会社 データ圧縮方法及びデータ復元方法並びにデータ圧縮装置及びデータ復元装置
AU2003271995A1 (en) * 2003-09-02 2005-03-16 Nokia Corporation Huffman coding and decoding

Also Published As

Publication number Publication date
JP2010093414A (ja) 2010-04-22
US7880648B2 (en) 2011-02-01
US20100085222A1 (en) 2010-04-08

Similar Documents

Publication Publication Date Title
JP5062131B2 (ja) 情報処理プログラム、情報処理装置、および情報処理方法
JP4893805B2 (ja) 情報処理プログラム、情報検索プログラム、および情報処理装置
JP5418218B2 (ja) 情報処理プログラム、情報検索プログラム、情報処理装置、および情報検索装置
JP4805315B2 (ja) データ構造によるコンピュータ表現及びそれに関連する符号化/復号化方法
US8037035B2 (en) Apparatus for searching and managing compressed files
JP5741699B2 (ja) 抽出方法、抽出プログラム、抽出装置、および抽出システム
US20160321282A1 (en) Extracting method, information processing method, computer product, extracting apparatus, and information processing apparatus
JP6447161B2 (ja) 意味構造検索プログラム、意味構造検索装置、及び意味構造検索方法
Mäkinen et al. Linear time construction of indexable founder block graphs
JP2012216088A (ja) 抽出方法、抽出プログラム、抽出システム、情報生成方法、情報生成プログラム、および情報コンテンツ
US9542427B2 (en) Computer product, generating apparatus, and generating method for generating Huffman tree, and computer product for file compression using Huffman tree
Pibiri et al. Dynamic elias-fano representation
CN101944086A (zh) 全字索引词典
Nishimoto et al. An optimal-time RLBWT construction in BWT-runs bounded space
KR102006283B1 (ko) 패스트맵을 이용한 데이터셋의 m-트리 적재방법
WO2012117544A1 (ja) 検索プログラム、検索装置、および検索方法
Ristov et al. Ziv Lempel compression of huge natural language data tries using suffix arrays
JP2006073035A (ja) 電子化文書検索システム、検索装置、および記録媒体
Haapasalmi Optimized Compressed Data Structures for Infinite-order Lan-guage Models
JP7077387B1 (ja) 情報処理装置、情報処理方法、及び情報処理プログラム
JP2022083920A (ja) 情報処理装置、情報処理方法、及び情報処理プログラム
JP2023013868A (ja) 情報処理装置、情報処理方法、及び情報処理プログラム
CN113420570A (zh) 一种用于提升翻译准确性的方法、***及装置
Külekci et al. Range selection and predecessor queries in data aware space and time
JP2023013869A (ja) 情報処理装置、情報処理方法、及び情報処理プログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110708

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20120224

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120306

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120330

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120417

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120618

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20120710

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20120723

R150 Certificate of patent or registration of utility model

Ref document number: 5062131

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20150817

Year of fee payment: 3