JP5505524B2 - 生成プログラム、生成装置、および生成方法 - Google Patents

生成プログラム、生成装置、および生成方法 Download PDF

Info

Publication number
JP5505524B2
JP5505524B2 JP2012557687A JP2012557687A JP5505524B2 JP 5505524 B2 JP5505524 B2 JP 5505524B2 JP 2012557687 A JP2012557687 A JP 2012557687A JP 2012557687 A JP2012557687 A JP 2012557687A JP 5505524 B2 JP5505524 B2 JP 5505524B2
Authority
JP
Japan
Prior art keywords
compression code
code length
character information
length
leaf
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
JP2012557687A
Other languages
English (en)
Other versions
JPWO2012111078A1 (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
Application granted granted Critical
Publication of JP5505524B2 publication Critical patent/JP5505524B2/ja
Publication of JPWO2012111078A1 publication Critical patent/JPWO2012111078A1/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2246Trees, e.g. B+trees
    • 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
    • H03M7/4031Fixed length to variable length coding
    • H03M7/4037Prefix coding
    • H03M7/4043Adaptive prefix coding
    • H03M7/405Tree adaptation
    • 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/70Type of the data to be coded, other than image and sound
    • H03M7/707Structured documents, e.g. XML

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Compression, Expansion, Code Conversion, And Decoders (AREA)

Description

本発明は、ハフマン木を生成する生成プログラム、生成装置、および生成方法に関する。
従来、4,8、および16分枝ハフマン木の生成元となる節点集合体から展開することにより、圧縮符号長が2,3,4の整数倍で規定された2N分枝無節点ハフマン木が生成されている(たとえば、下記特許文献1を参照。)。
特開2010−093414号公報
しかしながら、2N分枝無節点ハフマン木では、圧縮符号長が2,3,4の整数倍でしか規定できなかったため、必然的に最大枝数2Nのべき数Nが2,3,4の整数倍でしか規定できなかった。このため、最大枝数2Nは4(=22)、8(=23)、16(=24)、64(=26)、256(=28)、512(=29)、1024(=210)、4096(=212)、16384(=214)となる。このため、最大枝数2Nとして、2048(=211)や8192(=213)といった2,3,4の整数倍以外は規定できない。
一方、テキストデータを構成する、単一文字、基礎単語、および予約語(以下、文字情報と呼ぶ)の種類数が2m個(ただし、mは2,3,4の整数倍)より大きく2m+1個(ただし、m+1は2,3,4の整数倍ではない)以下である場合、最大枝数2NをN≧m+2としなければならない。たとえば、文字情報の種類数が210個より大きく211個以下である場合、最大枝数2Nを212としなければならない。また、文字情報の種類数が212個より大きく213個以下である場合、最大枝数2Nを214としなければならない。このため、2N分枝無節点ハフマン木のサイズが大きくなり、さらなる改善の余地がある。
本発明は、上述した従来技術による問題点を解消するため、文字情報の総種類数に最適なサイズで2N分枝無節点ハフマン木を構築することができる生成プログラム、生成装置、および生成方法を提供することを目的とする。
上述した課題を解決し、目的を達成するため、本発明の一観点として、対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計し、前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Nを決定し、集計された圧縮符号長ごとの前記文字情報の種類数のうち、決定された上限長Nを圧縮符号長とする前記文字情報の種類数を、前記上限長N以上の圧縮符号長での前記文字情報の種類数の総和に補正し、補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、決定された上限長Nを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする2N分枝無節点ハフマン木を構築する生成プログラム、生成装置、および生成方法が提案される。
本発明にかかる生成プログラム、生成装置、および生成方法によれば、文字情報の総種類数に最適なサイズで2N分枝無節点ハフマン木を構築することができるという効果を奏する。
N分枝無節点ハフマン木のサイズ決定方法の一例を示す説明図である。 N分枝無節点ハフマン木の生成までの流れを示す説明図である。 図2の(1)出現回数の集計の詳細を示す説明図である。 図2の(2)圧縮符号長算出の詳細(N=11)を示す説明図である。 図2の(3)葉数特定〜(5)葉の構造体生成の詳細(N=11)を示す説明図である。 文字情報ごとの補正結果を示す説明図である。 葉へのポインタ生成の詳細(N=11)を示す説明図(その1)である。 葉へのポインタ生成の詳細(N=11)を示す説明図(その2)である。 葉へのポインタ生成の詳細(N=11)を示す説明図(その3)である。 葉へのポインタ生成の詳細(N=11)を示す説明図(その4)である。 葉へのポインタ生成の詳細(N=11)を示す説明図(その5)である。 葉へのポインタ生成の詳細(N=11)を示す説明図(その6)である。 図2の(7)2N分枝無節点ハフマン木の構築の詳細(N=11)を示す説明図である。 図2の(3)葉数特定〜(5)葉の構造体生成の詳細(N=12)を示す説明図である。 葉へのポインタ生成の詳細(N=12)を示す説明図(その1)である。 葉へのポインタ生成の詳細(N=12)を示す説明図(その2)である。 葉へのポインタ生成の詳細(N=12)を示す説明図(その3)である。 葉へのポインタ生成の詳細(N=12)を示す説明図(その4)である。 葉へのポインタ生成の詳細(N=12)を示す説明図(その5)である。 葉へのポインタ生成の詳細(N=12)を示す説明図(その6)である。 葉へのポインタ生成の詳細(N=12)を示す説明図(その7)である。 (7)2N分枝無節点ハフマン木の構築の詳細(N=12)を示す説明図である。 図1の(3)葉数特定〜(5)葉の構造体生成の詳細(N=13)を示す説明図である。 葉へのポインタ生成の詳細(N=13)を示す説明図(その1)である。 葉へのポインタ生成の詳細(N=13)を示す説明図(その2)である。 葉へのポインタ生成の詳細(N=13)を示す説明図(その3)である。 葉へのポインタ生成の詳細(N=13)を示す説明図(その4)である。 葉へのポインタ生成の詳細(N=13)を示す説明図(その5)である。 葉へのポインタ生成の詳細(N=13)を示す説明図(その6)である。 葉へのポインタ生成の詳細(N=13)を示す説明図(その7)である。 葉へのポインタ生成の詳細(N=13)を示す説明図(その8)である。 図2の(7)2N分枝無節点ハフマン木の構築の詳細(N=13)を示す説明図である。 葉の構造体を示す説明図である。 高位文字コードの構造体を示す説明図である。 分割文字コードの構造体を示す説明図である。 特殊単語の構造体を示す説明図(その1)である。 特殊単語の構造体を示す説明図(その2)である。 実施の形態にかかる生成装置のハードウェア構成例を示すブロック図である。 生成装置の機能的構成例を示すブロック図である。 UTF16での文字情報の分類例を示す説明図である。 ASCIIコードでの文字情報の分類例を示す説明図である。 シフトJISコードでの文字情報の分類例を示す説明図である。 N分枝無節点ハフマン木の生成処理手順(前半)を示すフローチャートである。 N分枝無節点ハフマン木の生成処理手順(後半)を示すフローチャートである。 図43に示した第1集計処理(ステップS4301)の詳細な処理手順を示すフローチャートである。 図45に示した対象ファイルFiの集計処理(ステップS4503)の詳細な処理手順を示すフローチャートである。 図46に示した特殊単語集計処理(ステップS4602)の詳細な処理手順を示すフローチャートである。 図47に示した最長一致検索処理(ステップS4701)の詳細な処理手順を示すフローチャートである。 図43に示した第2集計処理(ステップS4302)の詳細な処理手順を示すフローチャートである。 図44に示した補正B+処理(ステップS4403)の詳細な処理手順を示すフローチャートである。 図44に示した補正B-処理(ステップS4404)の詳細な処理手順を示すフローチャートである。 図50および図51に示した更新処理(ステップS5001)の詳細な処理手順を示すフローチャートである。 図44に示した枝数特定処理(ステップS4406)の詳細な処理手順を示すフローチャートである。 図44に示した構築処理(ステップS4407)の詳細な処理手順を示すフローチャートである。 図54に示した葉へのポインタ生成処理(ステップS5403)の詳細な処理手順を示すフローチャートである。 補正B+処理(ステップS4403)の他の例の詳細な処理手順を示すフローチャートである。 補正B-処理(ステップS4404)の他の例の詳細な処理手順を示すフローチャートである。 図56に示した補正B+処理の他の例を適用した場合における、図2の(3)葉数特定〜(5)葉の構造体生成の詳細(N=12)を示す説明図である。 補正B-処理の他の例を適用した場合における、図2の(3)葉数特定〜(5)葉の構造体生成の詳細(N=11)を示す説明図である。 圧縮対象文字列の一例を示す説明図である。 図60に示した圧縮対象文字列の圧縮符号を示す説明図である。 圧縮対象文字列の他の例を示す説明図である。 図62に示した圧縮対象文字列の圧縮符号を示す説明図である。 N分枝無節点ハフマン木を用いた圧縮処理の具体例を示す説明図である。 コンピュータが自動実行する2N分枝無節点ハフマン木を用いたファイル圧縮処理手順を示すフローチャートである。 図65に示した圧縮処理(ステップS6503)の詳細な処理手順を示すフローチャート(その1)である。 図65に示した圧縮処理(ステップS6503)の詳細な処理手順を示すフローチャート(その2)である。 図65に示した圧縮処理(ステップS6503)の詳細な処理手順を示すフローチャート(その3)である。 図61に示した圧縮符号列の伸長処理例を示す説明図(その1)である。 図61に示した圧縮符号列の伸長処理例を示す説明図(その2)である。 図61に示した圧縮符号列の伸長処理例を示す説明図(その3)である。 図61に示した圧縮符号列の伸長処理例を示す説明図(その4)である。 図61に示した圧縮符号列の伸長処理例を示す説明図(その5)である。 図63に示した圧縮符号列の伸長処理例を示す説明図(その1)である。 図63に示した圧縮符号列の伸長処理例を示す説明図(その2)である。 図63に示した圧縮符号列の伸長処理例を示す説明図(その3)である。 図63に示した圧縮符号列の伸長処理例を示す説明図(その4)である。 図63に示した圧縮符号列の伸長処理例を示す説明図(その5)である。 N分枝無節点ハフマン木を用いた伸長処理手順を示すフローチャート(その1)である。 N分枝無節点ハフマン木を用いた伸長処理手順を示すフローチャート(その2)である。
以下に添付図面を参照して、本発明にかかる生成プログラム、生成装置、および生成方法の実施の形態を詳細に説明する。なお、本明細書において、「文字情報」とは、テキストデータを構成する単一文字、基礎単語、予約語などの情報である。単一文字とは1つの文字コードで表現される文字である。単一文字の文字コード長は、文字コード種により異なる。
たとえば、UTF(Unicode Transformation Format)16の場合は16ビットコード、ASCII(American Standard Code for Information Interchange)コードの場合は8ビットコード、シフトJIS(Japanese Industrial Standard)コードの場合は8ビットコードである。シフトJISコードで日本語の文字を表現する場合は、2個の8ビットコードを組み合わせることとなる。
また、単一文字以外に、たとえば、特定の文字列で表現される単語や予約語が挙げられる。単語としては、たとえば、児童や生徒が学校教育で学習すべき数百〜数千の基礎単語が挙げられる。基礎単語は出現頻度が高い文字列である。予約語とは、予め決められた文字列であり、たとえば、HTMLのタグ(たとえば、<br>)が挙げられる。基礎単語および予約語を「特殊単語」と称す。なお、本実施の形態では、文字コードとしてUTF16を例に挙げて説明する。
<2N分枝無節点ハフマン木のサイズ決定方法>
図1は、2N分枝無節点ハフマン木のサイズ決定方法の一例を示す説明図である。2N分枝無節点ハフマン木とは、根から分岐する枝が2N本あり、1または複数本の枝で葉を直接ポイントするハフマン木である。節点(内部節点)はない。節点がなく直接葉にヒットするため、節点を有する通常のハフマン木に比べて、伸長速度の高速化を図ることができる。葉は、該当する文字情報とその圧縮符号を含む構造体である。葉の構造体とも呼ぶ。葉に割り当てられる枝数は、割当先の葉に存在する圧縮符号の圧縮符号長に依存する。これらの詳細については、後述する。
文字情報群の総種類数Xが、どの範囲にあるかで、適用される2N分枝無節点ハフマン木のサイズが決定される。2N分枝無節点ハフマン木のサイズとは、最大枝数2Nである。べき数Nは、圧縮符号長の上限となる。したがって、2N分枝無節点ハフマン木のサイズを決定する場合は、べき数Nを文字情報群の総種類数Xに応じて決定すればよい。
具体的には、文字情報群の総種類数Xが2x-2<X≦2x-1である場合、少なくとも最大枝数2Nが2x-1本あればハフマン木が構築できる。サイズを最小限にするには、N=x−1とすればよい。また、文字情報群の総種類数Xが2x-1<X≦2xである場合、少なくとも最大枝数2Nが2x本あればハフマン木が構築できる。サイズを最小限にするには、N=xとすればよい。また、文字情報群の総種類数Xが2x<X≦2x+1である場合、少なくとも最大枝数2Nが2x+1本あればハフマン木が構築できる。サイズを最小限にするには、N=x+1とすればよい。
たとえば、文字情報群の総種類数X=1305個である場合、210<X≦211となるため、最大枝数2Nのべき数Nは、N=11となる。したがって、211分枝無節点ハフマン木が生成され、最大でも11ビットの圧縮符号長の圧縮符号で文字情報を圧縮することができる。
また、文字情報群の総種類数X=3048個である場合、211<X≦212となるため、最大枝数2Nのべき数Nは、N=12となる。したがって、212分枝無節点ハフマン木が生成され、最大でも12ビットの圧縮符号長の圧縮符号で文字情報を圧縮することができる。
さらに、文字情報群の総種類数X=5401個である場合、212<X≦213となるため、最大枝数2Nのべき数Nは、N=13となる。したがって、213分枝無節点ハフマン木が生成され、最大でも13ビットの圧縮符号長の圧縮符号で文字情報を圧縮することができる。
<2N分枝無節点ハフマン木の生成までの流れ>
図2は、2N分枝無節点ハフマン木の生成までの流れを示す説明図である。
(1)出現回数の集計
まず、生成装置は、対象ファイル群に存在する文字情報の出現回数を計数する。計数対象となる対象ファイル群は、たとえば、文書ファイル、Webページなどの電子データであり、たとえば、テキスト形式、HTML(HyperText Markup Language)形式、XML(Extensible Markup Language)形式の電子データである。また、単一の対象ファイルを計数対象としてもよい。集計結果は、出現回数の降順にソートされ、出現回数の大きい方から昇順の順位がつけられる。なお、ここでは、文字情報の総種類数は、例として1305個(<2048(=211))とする。
(2)圧縮符号長算出
つぎに、(1)で得られた集計結果を基にして、生成装置は、文字情報ごとの圧縮符号長を算出する。具体的には、生成装置は、文字情報ごとに、出現率を算出する。出現率は、文字情報の出現回数を全文字情報の総出現回数で割ることで得られる。そして、生成装置は、出現率に対応する生起確率を求め、生起確率から圧縮符号長を導き出す。
生起確率は、1/2xで表現される。xはべき数である。圧縮符号長は、生起確率のべき数xとなる。具体的には、出現率が生起確率の以下のどの範囲であるかで圧縮符号長が決定される。ARは出現率である。
1/20>AR≧1/21・・・圧縮符号長は1ビット。
1/21>AR≧1/22・・・圧縮符号長は2ビット。
1/22>AR≧1/23・・・圧縮符号長は3ビット。
1/23>AR≧1/24・・・圧縮符号長は4ビット。



1/2N-1>AR≧1/2N・・・圧縮符号長はNビット。
(3)葉数特定
つぎに、生成装置は、圧縮符号長ごとに葉数を集計することで圧縮符号長ごとの葉数を特定する。図2では、最大圧縮符号長が17ビットとする。また、葉数とは、文字情報の種類数である。したがって、圧縮符号長5ビットの葉数が2である場合、5ビットの圧縮符号が割り当てられる文字情報が2つ存在することを示している。
(4)葉数補正
つぎに、生成装置は、葉数を補正する。具体的には、生成装置は、枝数の上限2Nのべき数Nが最大圧縮符号長となるように補正する。たとえば、べき数N=11の場合、圧縮符号長11ビット〜17ビットまでの葉数の総和を、補正後の圧縮符号長11ビットの葉数にする。そして、生成装置は、圧縮符号長ごとに葉当たりの枝数を割り当てる。具体的には、補正後の圧縮符号長に対し、その降順に、20、21、22、23、24、25、26、27として葉当たりの枝数を決定する。
たとえば、図2では、圧縮符号長11ビットの圧縮符号が割り当てられる文字情報の総数(葉数)は1215個であるが、その葉当たりの枝数は1である。圧縮符号長11ビットの圧縮符号が割り当てられる文字情報については、それぞれ1本の枝しか割り当てられないこととなる。一方、圧縮符号長6ビットの圧縮符号が割り当てられる文字情報の総数(葉数)は6個であるが、その葉当たりの枝数は32である。圧縮符号長6ビットの圧縮符号が割り当てられる文字情報については、それぞれ32本の枝が割り当てられることとなる。
(5)葉の構造体生成
つぎに、生成装置は、葉の構造体を生成する。葉の構造体とは、文字情報とその圧縮符号長とその圧縮符号長での圧縮符号が対応付けられたデータ構造体である。たとえば、出現順位が1位である文字「0」の圧縮符号長は6ビットであり、圧縮符号は「000000」となる。図2の例では、文字情報の種類数(葉数)は1305個であるため、葉L1の構造体〜葉L1305の構造体が生成されることとなる。
(6)葉へのポインタ生成
つぎに、生成装置は、葉の構造体ごとに葉へのポインタを生成する。葉へのポインタは、そのポイント先となる葉の構造体内の圧縮符号に、その葉当たりの枝数分の番号に相当するビット列を連結したビット列である。たとえば、葉L1である文字「0」に割り当てられた圧縮符号「000000」の圧縮符号長は6ビットであるため、葉L1当たりの枝数は32本である。
したがって、葉L1へのポインタの先頭6ビットは、圧縮符号「000000」となる。後続ビット列は、葉L1当たりの枝数で表現される32(=25)種のビット列となる。すなわち、32種の5ビットのビット列が圧縮符号「000000」の後続ビット列となる。したがって、葉L1へのポインタは、先頭6ビットが「000000」で固定された32種の11ビットのビット列となる。なお、葉当たりの枝数が1本の場合は、葉へのポインタは1個であり、圧縮符号とその葉へのポインタは同一ビット列となる。
(7)2N分枝無節点ハフマン木の構築
最後に、生成装置は、2N分枝無節点ハフマン木を構築する。具体的には、葉のポインタを根とすることで、葉の構造体を直接指定する2N分枝無節点ハフマン木が構築される。圧縮符号列が、先頭6ビットが「000000」の11ビットのビット列である場合、後続の3ビットが32種のいずれのビット列であっても、2N分枝無節点ハフマン木により文字「0」の葉L1の構造体をポイントすることができる。
<(1)出現回数の集計の詳細>
図3は、図2の(1)出現回数の集計の詳細を示す説明図である。生成装置は、対象ファイル群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/>といったタグなどを予約語とする。予約語は数十種(例として25種)決めておく。また、必要に応じて基礎単語も決めておく。基礎単語は例として4096種としておく。そして、高位文字コード群、分割文字コード群および予約語群、基礎単語群を混在させて出現頻度を再集計し、出現頻度の降順に再ソートする。再ソート結果が図1の集計結果となる。
基礎単語群を集計しない場合、出現頻度の降順にソートされた1305種の文字情報が得られる。文字情報の種類数をこの程度の数に抑えることで、16ビットの文字コードを12ビット以下の圧縮符号に圧縮し、圧縮符号を16ビットの文字コードに伸長することが可能となる。
また、基礎単語群を集計する場合、出現頻度の降順にソートされた5401種の文字情報が得られる。4096種の基礎単語を集計すると、16ビットの文字コードを13ビット以下の圧縮符号に圧縮することができ、圧縮符号を16ビットの文字コードに伸長することが可能となる。また、基礎単語は16ビットコードが複数連結された文字列であるため、文字数がn個である場合、n×16ビットコードを13ビット以下の圧縮符号に圧縮でき、圧縮率の向上を図ることができる。また、その圧縮符号をn×16ビットコードの基礎単語に伸長でき、伸長速度を高速化することができる。
<(2)圧縮符号長算出の詳細(N=11)>
図4は、図2の(2)圧縮符号長算出の詳細(N=11)を示す説明図である。図4の文字情報テーブルは、図3の集計結果を反映したテーブルであり、文字情報ごとに順位項目、伸長種別項目、コード項目、文字項目、出現回数項目、総回数項目、出現率項目、補正前での生起確率項目および圧縮符号長項目が設定されている。このうち、順位項目〜総回数項目までが図3の再ソート結果で得られた情報である。
ここで、順位項目には、文字情報の出現回数の降順に順位(昇順)が書き込まれている。文字情報項目のうち伸長種別項目には、文字情報の種別が書き込まれる。「16」は16ビットコード(の単一文字)を示している。「8」は8ビットの分割文字コードを示している。「特」は特殊単語(基礎単語または予約語)を示している。
文字情報項目のうちコード項目には、文字コードまたは分割文字コードが書き込まれている。特殊単語の場合は空欄とする。文字情報項目のうち文字項目には、文字や特殊単語が書き込まれている。分割文字コードの場合は空欄とする。出現回数項目には、対象ファイル群での文字情報の出現回数が書き込まれている。総回数項目には、全文字情報の総出現回数が書き込まれている。
出現率項目には、出現回数を総回数で割り算した値が出現率として書き込まれている。補正前項目の生起確率項目には、出現率に対応する生起確率が書き込まれている。圧縮符号長項目には、生起確率に応じた圧縮符号長、すなわち、生起確率1/2yのべき数yが圧縮符号長として書き込まれている。
<(3)葉数特定〜(5)葉の構造体生成の詳細(N=11)>
図5は、図2の(3)葉数特定〜(5)葉の構造体生成の詳細(N=11)を示す説明図である。図4の文字情報テーブルを圧縮符号長単位で葉数(文字情報の総種類数)を集計した結果が、図5における補正前の葉数となる。ここで、補正Aとは、圧縮符号長の上限長N(すなわち、2N分枝無節点ハフマン木の最大枝数2Nのべき数N)以上の圧縮符号長に割り当てられた葉数を、圧縮符号長の上限長Nに集約する補正である。この場合、補正前での最大圧縮符号長は17ビットであるが、文字情報の総種類数が1305種であるため、圧縮符号長の上限長Nは、N=11となる。したがって、補正Aでは、圧縮符号長11ビットの葉数が、圧縮符号長が11ビット〜17ビットの葉数の総和(1190個)となる。
そして、生成装置は、生起確率総和を求める。圧縮符号長ごとの生起確率は決められているため(5ビットなら1/25)、圧縮符号長ごとに生起確率を葉数で乗じることで、圧縮符号長ごとの乗算結果が得られる。たとえば、補正Aにおける圧縮符号長5ビットの葉数は2である。圧縮符号長5ビットの生起確率は、1/25である。したがって、補正Aにおける圧縮符号長5ビットの生起確率は、2×(1/25)=1/24となる。圧縮符号長6ビット以降も同様に補正Aにおける圧縮符号長生起確率を求める。そして、補正A後における各圧縮符号長の生起確率を合計することで、補正Aでの生起確率総和が得られる。
そして、生成装置は、生起確率総和が1以下であるか否かを判断する。しきい値tは0<t≦1である。しきい値tを設けたくない場合は、t=1とすればよい。しきい値t未満であれば、補正Bに移行する。しきい値t以上1以下である場合は、補正Bに移行せず、この時点での圧縮符号長ごとの葉数で確定する。
補正Bは、補正Aでの圧縮符号長群(5ビット〜12ビット)は変えずに、葉数を更新する補正である。具体的には、補正Aでの生起確率総和が、しきい値t以上1以下でない場合におこなわれる補正である。より具体的には、補正Bは2種類ある。
1つ目は、生起確率総和がしきい値t未満である場合、生起確率総和が1以下の最大値が得られるまで、たとえば、最大漸近値に収束するまで、生起確率総和を増加させる補正(以下、補正B+)である。もう1つは、生起確率総和が1より大きい場合、生起確率総和が1以下に割り込んでから1以下の最大値が得られるまで、たとえば、最大漸近値に収束するまで、生起確率総和を減少させる補正(以下、補正B-)である。
図5に示した例では、補正Aでの生起確率総和が「1.146」であるため、補正B-をおこなうこととなる。なお、補正B+および補正B-のいずれの補正Bであっても、葉数を生起確率総和で割るという同じ補正をおこなう。
まず、補正B-の1回目(補正B-1)では、圧縮符号長ごとの補正Aでの葉数を、前回の補正(この場合は補正A)の生起確率の総和(1.146)で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Aでの圧縮符号長の上限長N(N=11ビット)については、前回の補正(この場合は補正A)の生起確率総和(1.146)で割ることはせず、葉の総数(1305個)から、補正B-1での圧縮符号長ごとの葉の総数(圧縮符号長の上限長Nの葉数除く)を引くことで、圧縮符号長の上限長Nの葉数を求める。この場合は、1208個である。
このあと、生成装置は、補正Aの場合と同様の計算処理により、補正B-1での生起確率総和を求める。そして、生成装置は、補正B-1での生起確率総和が1以下の最大漸近値に収束したか否かを判断する。補正B-1での生起確率総和が1以下の最大漸近値に収束していなければ、補正B-の2回目(補正B-2)に移行する。最大漸近値に収束した場合は、補正B-2に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正B-1で更新された生起確率総和「1.042」は1より大きいため、最大漸近値に収束しておらず、補正B-2に移行する。
補正B-2では、圧縮符号長ごとの補正B-1での葉数を、前回の補正(この場合は補正B-1)の生起確率総和(1.042)で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正B-1での圧縮符号長の上限長N(N=11ビット)については、前回の補正(この場合は補正B-1)の生起確率総和(1.042)で割ることはせず、葉の総数(1305個)から、補正B-2での圧縮符号長ごとの葉の総数(圧縮符号長の上限長Nの葉数除く)を引くことで、圧縮符号長の上限長Nの葉数を求める。この場合は、1215個である。
このあと、生成装置は、補正B-1の場合と同様の計算処理により、補正B-2での生起確率総和を求める。そして、生成装置は、補正B-2での生起確率総和が1以下の最大漸近値に収束したか否かを判断する。補正B-2での生起確率総和が1以下の最大漸近値に収束していなければ、補正B-の3回目(補正B-3)に移行する。最大漸近値に収束した場合は、補正B-3に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正B-2で更新された生起確率総和「0.982」は1以下であるが、最大漸近値に収束しているかが不明であるため、補正B-3に移行する。
補正B-3では、圧縮符号長ごとの補正B-2での葉数を、前回の補正(この場合は補正B-2)の生起確率総和(0.982)で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正B-2での圧縮符号長の上限長N(N=11ビット)については、前回の補正(この場合は補正B-2)の生起確率総和(0.982)で割ることはせず、葉の総数(1305個)から、補正B-3での圧縮符号長ごとの葉の総数(圧縮符号長の上限長Nの葉数除く)を引くことで、圧縮符号長の上限長Nの葉数を求める。この場合は、1215個である。
このあと、生成装置は、補正B-2の場合と同様の計算処理により、補正B-3での生起確率総和を求める。そして、生成装置は、補正B-3での生起確率総和が1以下の最大漸近値に収束したか否かを判断する。補正B-3での生起確率総和が1以下の最大漸近値に収束していなければ、補正B-の4回目(補正B-4)に移行する。最大漸近値に収束した場合は、補正B-4に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正B-3で更新された生起確率総和「0.982」は、補正B-2で更新された生起確率総和「0.982」と同じ値である。すなわち、補正B-3での各圧縮符号長の葉数と補正B-2での各圧縮符号長の葉数とは同じである。この場合、生成装置は、生起確率総和が最大漸近値に収束したと判断し、葉数が確定する。
このようにして、葉数が確定するまで補正B-を継続することとなる。図5の例では、補正B-3で圧縮符号長ごとの葉数が確定したこととなる。このあと、生成装置は、圧縮符号長ごとに、葉当たりの枝数を算出することとなる。葉当たりの枝数の算出は、上述したように、圧縮符号長の上限長N(この場合はN=11ビット)から降順に、20、21、22、23、24、25、26として葉当たりの枝数を割り当てることとなる。なお、枝数の小計は、圧縮符号長ごとに、葉当たりの枝数に確定した葉数を乗じた乗算結果である。
図6は、文字情報ごとの補正結果を示す説明図である。図6において、文字情報テーブルには、補正A、補正B-1〜補正B-2までの補正結果が追加されている。図5に示したように、補正により圧縮符号長別の葉数が更新されるため、順位項目の1位の文字情報から短い圧縮符号長が割り当てられることとなる。
たとえば、補正B-2で確定した場合、圧縮符号長6ビットでは葉数が6、圧縮符号長7ビットでは葉数が18、…、圧縮符号長11ビットでは葉数が1215となっている。したがって、順位が1位から6位までの文字情報(葉数6個分)については6ビットの圧縮符号長、順位が7位から24位までの文字情報(葉数18個分)については7ビットの圧縮符号長、…、順位が91位から1305位までの文字情報(葉数1215個分)については11ビットの圧縮符号長が割り当てられる。
そして、生成装置は、文字情報と文字情報に割り当てられた圧縮符号長と圧縮符号長ごとの葉数とに基づいて、文字情報ごとに圧縮符号を割り当て、葉の構造体を生成することとなる。たとえば、出現率1位の高位文字「0」は5ビットの圧縮符号長が割り当てられているため、圧縮符号が「000000」となる。したがって、圧縮符号「000000」、圧縮符号長「6」、文字情報「0」を含む葉L1の構造体が生成されることとなる。
<(6)葉へのポインタ生成の詳細(N=11)>
図7〜図12は、葉へのポインタ生成の詳細(N=11)を示す説明図である。図7〜図12は、圧縮符号長の上限Nが11ビットの場合の葉へのポインタを示している。図7において、圧縮符号長が6ビットの葉数は6個であるため、圧縮符号は「000000」〜「00101」が割り当てられる。また、圧縮符号長が6ビットの葉当たりの枝数は、32本である。したがって、圧縮符号長が6ビットの圧縮符号についての葉へのポインタは、32(=25)個生成される。具体的には、葉へのポインタの先頭6ビットが圧縮符号で後続5ビットが32種のビット列となる。したがって、圧縮符号長が6ビットの圧縮符号の各々について、32種の葉へのポインタが生成されることとなる。
図8において、圧縮符号長が7ビットの葉数は18個であるため、圧縮符号「0001100」〜「0011111」が割り当てられる。また、圧縮符号長が7ビットの葉当たりの枝数は、16本である。したがって、圧縮符号長が7ビットの圧縮符号についての葉へのポインタは、16(=24)個生成される。具体的には、葉へのポインタの先頭7ビットが圧縮符号で後続4ビットが16種のビット列となる。したがって、圧縮符号長が7ビットの圧縮符号の各々について、16種の葉へのポインタが生成されることとなる。
以下同様、図9において、圧縮符号長が8ビットの圧縮符号の各々について、8種の葉へのポインタが生成されることとなる。図10において、圧縮符号長が9ビットの圧縮符号の各々について、4種の葉へのポインタが生成されることとなる。図11において、したがって、圧縮符号長が10ビットの圧縮符号の各々について、2種の葉へのポインタが生成されることとなる。図12において、圧縮符号長が11ビットの圧縮符号の各々について、1種の葉へのポインタが生成されることとなる。
<(7)2N分枝無節点ハフマン木の構築の詳細(N=11)>
図13は、図2の(7)2N分枝無節点ハフマン木の構築の詳細(N=11)を示す説明図である。図13では、N=11とした場合の2048(=211)分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
具体的には、圧縮符号長が6ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図7に示したように32個生成される。したがって、葉L1の構造体については、根の構造体に32個の葉L1へのポインタL1P(1)〜L1P(32)が格納される。葉L2の構造体〜葉L6の構造体についても同様である。
また、圧縮符号長が7ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図8に示したように16個生成される。したがって、葉L7の構造体については、根の構造体に16個の葉L7へのポインタL7P(1)〜L7P(16)が格納される。葉L8の構造体〜葉L24の構造体についても同様である。
また、圧縮符号長が8ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図9に示したように8個生成される。したがって、葉L25の構造体については、根の構造体に8個の葉L25へのポインタL25P(1)〜L25P(8)が格納される。葉L26の構造体〜葉L46の構造体についても同様である。
また、圧縮符号長が9ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図10に示したように4個生成される。したがって、葉L47の構造体については、根の構造体に4個の葉L47へのポインタL47P(1)〜L47P(4)が格納される。葉L48の構造体〜葉L69の構造体についても同様である。
また、圧縮符号長が10ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図11に示したように2個生成される。したがって、葉L70の構造体については、根の構造体に2個の葉L70へのポインタL70P(1)〜L70P(2)が格納される。葉L71の構造体〜葉L89の構造体についても同様である。
また、圧縮符号長が11ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図12に示したように1個生成される。したがって、葉L90の構造体については、根の構造体に1個の葉L90へのポインタL90Pが格納される。葉L91の構造体〜葉L1305の構造体についても同様である。
<(3)葉数特定〜(5)葉の構造体生成の詳細(N=12)>
図14は、図2の(3)葉数特定〜(5)葉の構造体生成の詳細(N=12)を示す説明図である。なお、N=12の場合は、図3の文字情報テーブルには、たとえば1024種の基礎単語のレコードも追加されることとなる。基礎単語は、1305種の文字コード、分割文字コード、予約語よりも、出現回数が低いこととする。したがって、1305種に1024種を追加した2329種の文字情報についての文字情報テーブルが生成されているものとする。また、基礎単語の追加により、図4の総回数がかわるため、2329種の文字情報の生起確率も図4に示した値とは異なることとなる。
そして、生成装置は、図5の場合と同様に、生起確率総和を求める。そして、生成装置は、生起確率総和がしきい値t以上1以下であるか否かを判断する。しきい値t未満であれば、補正Bに移行する。しきい値t以上1以下である場合は、補正Bに移行せず、この時点での圧縮符号長ごとの葉数で確定する。
図14の例では、補正Aでの生起確率総和「0.823」はしきい値t未満であるとして、補正B-をおこなうこととする。
まず、補正B+の1回目(補正B+1)では、圧縮符号長ごとの補正Aの葉数を、前回の補正(この場合は補正A)の生起確率総和(0.823)で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Aでの圧縮符号長の上限長N(N=12ビット)については、前回の補正(この場合は補正A)の生起確率総和(0.823)で割ることはせず、葉の総数(2329個)から、補正B+1での圧縮符号長ごとの葉の総数(圧縮符号長の上限長Nの葉数除く)を引くことで、圧縮符号長の上限長Nの葉数を求める。この場合は、2192個である。
このあと、生成装置は、補正Aの場合と同様の計算処理により、補正B+1での生起確率総和を求める。そして、生成装置は、補正B+1での生起確率総和が1以下の最大漸近値に収束したか否かを判断する。補正B+1での生起確率総和が1以下の最大漸近値に収束していなければ、補正B+の2回目(補正B+2)に移行する。1以下の最大漸近値に収束した場合は、補正B+2に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正B+1で更新された生起確率総和「0.861」は1以下であるが、最大漸近値に収束しているかが不明であるため、補正B+2に移行する。
補正B+2では、圧縮符号長ごとの補正B+1での葉数を、前回の補正(この場合は補正B+1)の生起確率総和(0.861)で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正B+2での圧縮符号長の上限長N(N=12ビット)については、前回の補正(この場合は補正B+1)の生起確率総和(0.861)で割ることはせず、葉の総数(2329個)から、補正B+2での圧縮符号長ごとの葉の総数(圧縮符号長の上限長Nの葉数除く)を引くことで、圧縮符号長の上限長Nの葉数を求める。この場合は、2173個である。
このあと、生成装置は、補正B+1の場合と同様の計算処理により、補正B+2での生起確率総和を求める。そして、生成装置は、補正B+2での生起確率総和が1以下の最大漸近値に収束したか否かを判断する。補正B+2での生起確率総和が1以下の最大漸近値に収束していなければ、補正B+の3回目(補正B+3)に移行する。1以下の最大漸近値に収束した場合は、補正B+3に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正B+2で更新された生起確率総和「0.897」は1以下であるが、補正B+1で更新された生起確率総和「0.861」よりも大きい。すなわち、補正B-1での生起確率総和は最大漸近値ではなく、補正B+2での生起確率総和は最大漸近値に収束しているかが不明であるため、補正B+3に移行する。
このようにして、葉数が確定するまで補正B+を継続することとなる。図14の例では、補正B+10で更新された生起確率総和「0.984」は、補正B+11で更新された生起確率総和「0.984」と同じ値である。すなわち、補正B+10での各圧縮符号長の葉数と補正B+11での各圧縮符号長の葉数とは同じである。この場合、生成装置は、補正B+10において、生起確率総和が最大漸近値に収束したと判断し、葉数が確定する。
このあと、生成装置は、圧縮符号長ごとに、葉当たりの枝数を算出することとなる。葉当たりの枝数の算出は、上述したように、圧縮符号長の上限長N(この場合はN=12ビット)から降順に、20、21、22、23、24、25、26として葉当たりの枝数を割り当てることとなる。なお、枝数の小計は、圧縮符号長ごとに、葉当たりの枝数に確定した葉数を乗じた乗算結果である。
<(6)葉へのポインタ生成の詳細(N=12)>
図15〜図21は、葉へのポインタ生成の詳細(N=12)を示す説明図である。図15〜図21は、圧縮符号長の上限Nが12ビットの場合の葉へのポインタを示している。図15において、圧縮符号長が6ビットの葉数は2個であるため、圧縮符号「000000」,「000001」が割り当てられる。また、圧縮符号長が6ビットの葉当たりの枝数は、64本である。したがって、圧縮符号長が6ビットの圧縮符号についての葉へのポインタは、64(=26)個生成される。具体的には、葉へのポインタの先頭6ビットが圧縮符号で後続6ビットが64種のビット列となる。したがって、圧縮符号長が6ビットの圧縮符号の各々について、64種の葉へのポインタが生成されることとなる。
図16において、圧縮符号長が7ビットの葉数は12個であるため、圧縮符号「0000100」〜「0001111」が割り当てられる。また、圧縮符号長が7ビットの葉当たりの枝数は、32本である。したがって、圧縮符号長が7ビットの圧縮符号についての葉へのポインタは、32(=25)個生成される。具体的には、葉へのポインタの先頭7ビットが圧縮符号で後続5ビットが32種のビット列となる。したがって、圧縮符号長が6ビットの圧縮符号の各々について、32種の葉へのポインタが生成されることとなる。
以下同様、図17において、圧縮符号長が8ビットの圧縮符号の各々について、16種の葉へのポインタが生成されることとなる。図18において、圧縮符号長が9ビットの圧縮符号の各々について、8種の葉へのポインタが生成されることとなる。図19において、圧縮符号長が10ビットの圧縮符号の各々について、4種の葉へのポインタが生成されることとなる。図20において、圧縮符号長が11ビットの圧縮符号の各々について、2種の葉へのポインタが生成されることとなる。図21において、圧縮符号長が12ビットの圧縮符号の各々について、1種の葉へのポインタが生成されることとなる。
<(7)2N分枝無節点ハフマン木の構築の詳細(N=12)>
図22は、(7)2N分枝無節点ハフマン木の構築の詳細(N=12)を示す説明図である。図22では、N=12とした場合の4096(=212)分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
具体的には、圧縮符号長が6ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図15に示したように64個生成される。したがって、葉L1の構造体については、根の構造体に64個の葉L1へのポインタL1P(1)〜L1P(64)が格納される。葉L2の構造体についても同様である。
また、圧縮符号長が7ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図16に示したように32個生成される。したがって、葉L3の構造体については、根の構造体に32個の葉L3へのポインタL3P(1)〜L3P(32)が格納される。葉L4の構造体〜葉L14の構造体についても同様である。
また、圧縮符号長が8ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図17に示したように16個生成される。したがって、葉L15の構造体については、根の構造体に16個の葉L15へのポインタL15P(1)〜L15P(16)が格納される。葉L16の構造体〜葉L55の構造体についても同様である。
また、圧縮符号長が9ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図18に示したように8個生成される。したがって、葉L56の構造体については、根の構造体に8個の葉L56へのポインタL56P(1)〜L56P(8)が格納される。葉L57の構造体〜葉L107の構造体についても同様である。
また、圧縮符号長が10ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図19に示したように4個生成される。したがって、葉L108の構造体については、根の構造体に4個の葉L108へのポインタL108P(1)〜L108P(4)が格納される。葉L109の構造体〜葉L165の構造体についても同様である。
また、圧縮符号長が11ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図20に示したように2個生成される。したがって、葉L166の構造体については、根の構造体に2個の葉L166へのポインタL166P(1)〜L166P(2)が格納される。葉L167の構造体〜葉L213の構造体についても同様である。
また、圧縮符号長が12ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図21に示したように1個生成される。したがって、葉L214の構造体については、根の構造体に1個の葉L214へのポインタL214Pが格納される。葉L215の構造体〜葉L2329の構造体についても同様である。
<(3)葉数特定〜(5)葉の構造体生成の詳細(N=13)>
図23は、図1の(3)葉数特定〜(5)葉の構造体生成の詳細(N=13)を示す説明図である。なお、N=13の場合は、図3の文字情報テーブルには、たとえば4096種の基礎単語のレコードも追加されることとなる。基礎単語は、1305種の文字コード、分割文字コード、予約語よりも、出現回数が低いこととする。したがって、1305種に4096種を追加した5401種の文字情報についての文字情報テーブルが生成されているものとする。また、基礎単語の追加により、図4の総回数がかわるため、5401種の文字情報の生起確率も図4に示した値とは異なることとなる。図23に示した例では、補正Aでの生起確率総和が「0.877」であるため、補正B+が行われることとなる。
<(6)葉へのポインタ生成の詳細(N=13)>
図24〜図31は、葉へのポインタ生成の詳細(N=13)を示す説明図である。図24〜図31は、圧縮符号長の上限NがN=13ビットの場合の葉へのポインタを示している。図24において、圧縮符号長が6ビットの葉数は2個であるため、圧縮符号「000000」,「000001」が割り当てられる。また、圧縮符号長が6ビットの葉当たりの枝数は、128本である。したがって、圧縮符号長が6ビットの圧縮符号についての葉へのポインタは、128(=27)個生成される。具体的には、葉へのポインタの先頭6ビットが圧縮符号で後続7ビットが128種のビット列となる。したがって、圧縮符号長が6ビットの圧縮符号の各々について、128種の葉へのポインタが生成されることとなる。
図25において、圧縮符号長が7ビットの葉数は11個であるため、圧縮符号「0000100」〜「0001110」が割り当てられる。また、圧縮符号長が7ビットの葉当たりの枝数は、64本である。したがって、圧縮符号長が7ビットの圧縮符号についての葉へのポインタは、64(=26)個生成される。具体的には、葉へのポインタの先頭7ビットが圧縮符号で後続6ビットが64種のビット列となる。したがって、圧縮符号長が7ビットの圧縮符号の各々について、64種の葉へのポインタが生成されることとなる。
以下同様、図26において、圧縮符号長が8ビットの圧縮符号の各々について、32種の葉へのポインタが生成されることとなる。図27において、圧縮符号長が9ビットの圧縮符号の各々について、16種の葉へのポインタが生成されることとなる。図28において、圧縮符号長が10ビットの圧縮符号の各々について、8種の葉へのポインタが生成されることとなる。図29において、圧縮符号長が11ビットの圧縮符号の各々について、4種の葉へのポインタが生成されることとなる。図30において、圧縮符号長が12ビットの圧縮符号の各々について、2種の葉へのポインタが生成されることとなる。図31において、圧縮符号長が13ビットの圧縮符号の各々について、1種の葉へのポインタが生成されることとなる。
<(7)2N分枝無節点ハフマン木の構築の詳細(N=13)>
図32は、図2の(7)2N分枝無節点ハフマン木の構築の詳細(N=13)を示す説明図である。図32では、N=13とした場合の8192(=213)分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
具体的には、圧縮符号長が6ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図24に示したように128個生成される。したがって、葉L1の構造体については、根の構造体に128個の葉L1へのポインタL1P(1)〜L1P(128)が格納される。葉L2の構造体についても同様である。
また、圧縮符号長が7ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図25に示したように64個生成される。したがって、葉L3の構造体については、根の構造体に64個の葉L3へのポインタL3P(1)〜L3P(64)が格納される。葉L4の構造体〜葉L13の構造体についても同様である。
また、圧縮符号長が8ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図26に示したように32個生成される。したがって、葉L14の構造体については、根の構造体に32個の葉L14へのポインタL14P(1)〜L14P(32)が格納される。葉L15の構造体〜葉L40の構造体についても同様である。
また、圧縮符号長が9ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図27に示したように16個生成される。したがって、葉L41の構造体については、根の構造体に16個の葉L41へのポインタL41P(1)〜L41P(16)が格納される。葉L42の構造体〜葉L75の構造体についても同様である。
また、圧縮符号長が10ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図28に示したように8個生成される。したがって、葉L76の構造体については、根の構造体に8個の葉L76へのポインタL76P(1)〜L76P(8)が格納される。葉L77の構造体〜葉L111の構造体についても同様である。
また、圧縮符号長が11ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図29に示したように4個生成される。したがって、葉L112の構造体については、根の構造体に4個の葉L112へのポインタL112P(1)〜L112P(4)が格納される。葉L113の構造体〜葉L142の構造体についても同様である。
また、圧縮符号長が12ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図30に示したように2個生成される。したがって、葉L143の構造体については、根の構造体に2個の葉L143へのポインタL143P(1)〜L143P(2)が格納される。葉L144の構造体〜葉L248の構造体についても同様である。
また、圧縮符号長が13ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図31に示したように1個生成される。したがって、葉L249の構造体については、根の構造体に1個の葉L249へのポインタL249Pが格納される。葉L250の構造体〜葉L5401の構造体についても同様である。
<葉の構造体>
図33は、葉の構造体を示す説明図である。葉の構造体は、第1領域〜第4領域を有するデータ構造体である。葉の構造体は、第1領域には、圧縮符号およびその圧縮符号長が格納される。第2領域には、葉の標識と伸長種別(図3参照)が格納される。第3領域には、伸長種別に応じて高位16ビット文字コード、低位の分割8ビット文字コード、または特殊単語へのポインタが格納される。
第4領域には、符号種別と符号区分が格納される。符号種別とは、文字コードが数字、英字、特殊記号、カタカナ、ひらがな、漢字のいずれに該当するか、または特殊単語へのポインタであるかを識別する情報である。符号区分とは、文字コードが16ビットであるか8ビットであるかを識別する情報である。16ビットの文字コードである場合または予約語である場合、符号区分として“1”を割り当て、8ビットの分割文字コードの場合、符号区分として“0”を割り当てる。
<文字コードの構造体>
図34は、高位文字コードの構造体を示す説明図である。高位文字コードの構造体3400は、高位文字コードe♯とその葉L♯へのポインタを格納するデータ構造体である。具体的には、たとえば、生成装置は、葉の構造体から伸長種別や符号区分を参照して文字コードe♯を抽出し、抽出した文字コードe♯をポイントする葉L♯のポインタを根の構造体から抽出する。葉L♯へのポインタが複数ある場合は、いずれのポインタでもよい。これにより、高位文字コードの構造体3400が生成される。
図35は、分割文字コードの構造体を示す説明図である。分割文字コードの構造体3500は、分割文字コードとその葉L♯へのポインタを格納する。具体的には、たとえば、生成装置は、葉の構造体から伸長種別や符号区分を参照して分割文字コードを抽出し、抽出した分割文字コードをポイントする葉L#のポインタを根の構造体から抽出する。葉L#へのポインタが複数ある場合は、いずれのポインタでもよい。これにより、分割文字コードの構造体3500が生成される。
図36および図37は、特殊単語の構造体を示す説明図である。図36では、特殊単語が予約語のみであり、図37では、特殊単語は予約語および基礎単語である。特殊単語の構造体3600は、特殊単語とその葉L♯へのポインタを格納するデータ構造体である。具体的には、たとえば、生成装置は、葉の構造体から伸長種別や符号区分を参照して特殊単語を抽出し、抽出した特殊単語をポイントする葉L♯のポインタを根の構造体から抽出する。葉L♯へのポインタが複数ある場合は、いずれのポインタでもよい。これにより、特殊単語の構造体3600が生成される。
<生成装置のハードウェア構成>
図38は、実施の形態にかかる生成装置のハードウェア構成例を示すブロック図である。図38において、生成装置は、CPU(Central Processing Unit)3801と、ROM(Read Only Memory)3802と、RAM(Random Access Memory)3803と、磁気ディスクドライブ3804と、磁気ディスク3805と、光ディスクドライブ3806と、光ディスク3807と、ディスプレイ3808と、I/F(Interface)3809と、キーボード3810と、マウス3811と、スキャナ3812と、プリンタ3813と、を備えている。また、各構成部はバス3800によってそれぞれ接続されている。
ここで、CPU3801は、生成装置の全体の制御を司る。ROM3802は、ブートプログラムなどのプログラムを記憶している。RAM3803は、CPU3801のワークエリアとして使用される。磁気ディスクドライブ3804は、CPU3801の制御にしたがって磁気ディスク3805に対するデータのリード/ライトを制御する。磁気ディスク3805は、磁気ディスクドライブ3804の制御で書き込まれたデータを記憶する。
光ディスクドライブ3806は、CPU3801の制御にしたがって光ディスク3807に対するデータのリード/ライトを制御する。光ディスク3807は、光ディスクドライブ3806の制御で書き込まれたデータを記憶したり、光ディスク3807に記憶されたデータをコンピュータに読み取らせたりする。
ディスプレイ3808は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ3808は、たとえば、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
インターフェース(以下、「I/F」と略する。)3809は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク3814に接続され、このネットワーク3814を介して他の装置に接続される。そして、I/F3809は、ネットワーク3814と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F3809には、たとえばモデムやLANアダプタなどを採用することができる。
キーボード3810は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス3811は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
スキャナ3812は、画像を光学的に読み取り、生成装置内に画像データを取り込む。なお、スキャナ3812は、OCR(Optical Character Reader)機能を持たせてもよい。また、プリンタ3813は、画像データや文書データを印刷する。プリンタ3813には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
なお、本実施の形態にかかる生成プログラムや、上述した2N分枝無節点ハフマン木、高位文字コードの構造体3400、分割文字コードの構造体3500、特殊単語の構造体3600は、上述したRAM3803や磁気ディスク3805などの記憶装置に記憶される。
<生成装置の機能的構成例>
図39は、生成装置の機能的構成例を示すブロック図である。生成装置3900は、集計部3901と、決定部3902と、補正部3903と、算出部3904と、判断部3905と、更新部3906と、生成部3907と、特定部3908と、構築部3909と、を備える。集計部3901〜構築部3909は、具体的には、たとえば、図38に示したROM3802、RAM3803、磁気ディスク3805、光ディスク3807などの記憶装置に記憶されたプログラムをCPU3801に実行させることにより、その機能を実現する。
集計部3901は、データを集計する機能を有する。具体的には、対象ファイル群を読み込んで、単一文字の出現回数を集計する。たとえば、図2に示したように、集計部3901は、出現回数を降順にソートして、所定順位(たとえば、1024位)までを高位文字コードとする。所定順位よりも下位の単一文字は、上位8ビットと下位8ビットに分割して、それぞれ8ビットの分割文字コードとして再集計される。
また、集計部3901は、最長一致検索処理をおこなうことにより、特殊単語を特定し、特殊単語についても出現回数を集計する。そして、集計部3901は、高位文字コード、分割文字コード、特殊単語を混在させて出現回数を再ソートする。これにより、図4に示した順位項目、伸長種別項目、コード項目、文字項目、出現回数項目が得られる。
また、集計部3901は、文字情報ごとの出現回数が得られた場合、全文字情報の出現回数の総和を総回数として算出する。そして、集計部3901は、文字情報ごとに、出現回数を総回数で割ることで、出現率を算出する。集計部3901は、算出された出現率に応じた生起確率を、図2の「(2)圧縮符号長算出」の項で説明したように特定し、そのべき数を圧縮符号長とする。これにより、文字情報ごとに圧縮符号長が特定されたこととなる(図3を参照。)。そして、集計部3901は、図3の文字情報テーブルを参照して、圧縮符号長ごとに文字情報の種類数(図4に示した補正前の葉数)を集計する。
決定部3902は、対象ファイルに出現する文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、文字情報に割り当てられる圧縮符号長の上限長Nを決定する機能を有する。具体的には、たとえば、決定部3902は、文字情報の総種類数が2K-1個より大きく2K個以下である場合は、上限長NをKビットに決定する。たとえば、文字情報の総種類数が210個より大きく211個以下である場合は、決定部3902は、上限長Nを11ビットに決定することとなる。
また、文字情報の総種類数が211個より大きく212個以下である場合は、決定部3902は、上限長Nを12ビットに決定することとなる。また、文字情報の総種類数が212個より大きく213個以下である場合は、決定部3902は、上限長Nを13ビットに決定することとなる。ここで、文字コードの種別ごとの文字情報の分類について説明する。
図40は、UTF16での文字情報の分類例を示す説明図である。特殊単語には、25種の予約語と最大4096種の基礎単語が含まれている。基礎単語を入れない場合は、予約語のみの25種となる。UTF16において、基礎単語を含めない場合の文字情報の最大総数は、1305個である。したがって、210<1305≦211となるため、上限長NはN=11ビットに決定される。また、基礎単語を2048個含める場合の文字情報の最大総数は、3353個である。したがって、211<3353≦212となるため、上限長NはN=12ビットに決定される。また、基礎単語を4096個含める場合の文字情報の最大総数は、5401個である。したがって、212<5401≦213となるため、上限長NはN=13ビットに決定される。
図41は、ASCIIコードでの文字情報の分類例を示す説明図である。特殊単語には、25種の予約語と最大2048種の基礎単語が含まれている。基礎単語を1024個含める場合の文字情報の最大総数は、1305個である。したがって、210<1305≦211となるため、上限長NはN=11ビットに決定される。基礎単語を2048個含める場合の文字情報の最大総数は、3353個である。したがって、211<3353≦212となるため、上限長NはN=12ビットに決定される。
図42は、シフトJISコードでの文字情報の分類例を示す説明図である。特殊単語には、25種の予約語と最大4096種の基礎単語が含まれている。また、シフトJISコードの場合、日本語の文字は2つの8ビットコードの組み合わせで表現されるため、偶数個の単語(文字列)とみなされる。基礎単語を2048個含める場合の文字情報の最大総数は、3353個である。したがって、211<3353≦212となるため、上限長NはN=12ビットに決定される。また、基礎単語を4096個含める場合の文字情報の最大総数は、5401個である。したがって、212<5401≦213となるため、上限長NはN=13ビットに決定される。
また、図39において、補正部3903は、集計部3901によって集計された圧縮符号長ごとの文字情報の種類数のうち、決定部3902によって決定された上限長Nを圧縮符号長とする文字情報の種類数を、上限長N以上の圧縮符号長での文字情報の種類数の総和に補正する機能を有する。具体的には、たとえば、補正部3903は、上述した補正Aによる補正処理を実行する。
算出部3904は、補正部3903による補正後の上限長Nまでの各圧縮符号長を規定する各生起確率の総和を算出する機能を有する。具体的には、たとえば、図5、図14、図23に示した生起確率総和を算出する。
判断部3905は、算出部3904によって算出された生起確率総和がしきい値t以上1以下であるか否かを判断する機能を有する。しきい値tは、0<t≦1の値であり、あらかじめ設定される。しきい値tを1としてもよい。しきい値t以上1以下である場合は、補正部3903による補正後の圧縮符号長ごとの文字情報の種類数が、圧縮符号長ごとの葉数として確定させてもよい。
一方、しきい値t未満である場合、まだ、生起確率総和を増加させることが可能であるため、上述した補正B+を実行することが可能となる。また、生起確率総和が1よりも大きくなった場合は、上述した補正B-を実行することが可能となる。
更新部3906は、判断部3905によってしきい値t以上1以下でないと判断された場合、上限長Nまでの各圧縮符号長の文字情報の種類数を、生起確率総和で割ることにより、上限長Nまでの各圧縮符号長の文字情報の種類数を更新する機能を有する。具体的には、たとえば、更新部3906は、しきい値t未満と判断された場合は補正B+を開始し、1より大きいと判断された場合は補正B-を開始する。
この場合、算出部3904は、更新後における上限長Nまでの各圧縮符号長の文字情報の種類数に基づいて、生起確率総和を再算出する。そして、判断部3905は、算出部3904によって再算出された生起確率総和については、1以下の最大値が得られたか、具体的には、たとえば、1以下の最大漸近値に収束したか否かを判断することとなる。
生成部3907は、文字情報に圧縮符号を割り当てた葉の構造体を生成する機能を有する。具体的には、たとえば、生成部3907による生成の条件は、判断部3905によって補正Aによりしきい値t以上1以下であると判断された場合、または、補正Bにより1以下の最大値が得られたと判断された場合である。そして、当該条件を満たした場合、生成部3907は、具体的には、たとえば、上限長Nまでの圧縮符号長と、上限長Nまでの圧縮符号長ごとの文字情報の種類数と、文字情報の出現率と、に基づいて、文字情報ごとに圧縮符号を割り付ける。そして、生成部3907は、割り付けた圧縮符号、その圧縮符号長、文字情報を含む葉の構造体を生成する。
より具体的には、まず、出現率により順位付けされた文字情報群のうち第1位から昇順に文字情報を選択する。そして、生成部3907は、その選択文字情報の圧縮符号長を特定して、その圧縮符号長となる固有の圧縮符号を割り当てる。
たとえば、出現回数第1位の文字情報は、高位文字の「0」である。N=12の場合、圧縮符号長は6ビットであるため、固有の圧縮符号「000000」が割り当てられることとなる。次に、出現回数第2位の文字情報は、高位文字の「>」である。N=12の場合、圧縮符号長は6ビットであるため、固有の圧縮符号「000001」が割り当てられることとなる。
このようにして、出現回数の順位の昇順で圧縮符号を割り当てる。圧縮符号が決まると、生成部3907は、文字情報ごとに、その文字情報や圧縮符号長、伸長種別などをまとめて葉の構造体を生成することとなる。
特定部3908は、上限長Nまでの圧縮符号長に基づいて、生成部3907によって生成された葉の構造体1つ当たりの枝数を、上限長Nまでの圧縮符号長ごとに特定する機能を有する。具体的には、たとえば、特定部3908は、図5、図14、図23に示したように、葉当たりの枝数を、圧縮符号長ごとに特定する。
構築部3909は、2N分枝無節点ハフマン木を構築する機能を有する。具体的には、たとえば、構築部3909は、葉の構造体内の圧縮符号に特定部3908によって特定された枝数分の枝番号をあらわす各ビット列を連結した葉へのポインタ群を、葉の構造体ごとに生成する。たとえば、N=11の場合は、図7〜図12に示したように、葉へのポインタ群を葉の構造体ごとに生成する。また、N=12の場合は、図15〜図21に示したように、葉へのポインタ群を葉の構造体ごとに生成する。また、N=13の場合は、図24〜図31に示したように、葉へのポインタ群を葉の構造体ごとに生成する。
また、構築部3909は、各葉の構造体についての葉へのポインタ群を根とする2N分枝無節点ハフマン木を構築する。具体的には、たとえば、N=11の場合は、図13に示したように、212分枝無節点ハフマン木を構築する。N=12の場合は、図22に示したように、212分枝無節点ハフマン木を構築する。N=13の場合は、図32に示したように、213分枝無節点ハフマン木を構築する。
<2N分枝無節点ハフマン木の生成処理手順>
図43は、2N分枝無節点ハフマン木の生成処理手順(前半)を示すフローチャートである。まず、図43において、生成装置3900は、集計部3901により、第1集計処理(ステップS4301)と第2集計処理(ステップS4302)を実行する。第1集計処理(ステップS4301)では、各文字情報の出現回数を集計する。第2集計処理(ステップS4302)では、圧縮符号長ごとの文字情報の種類数を集計する。第1集計処理(ステップS4301)と第2集計処理(ステップS4302)の詳細については後述する。
つぎに、生成装置3900は、決定部3902により、圧縮符号長の上限長Nを決定する(ステップS4303)。このNが後述する補正Aでの最大圧縮符号長となる。そして、生成装置3900は、全文字情報の圧縮符号長がNビット以内であるか否かを判断する(ステップS4304)。
Nビット以内でない場合(ステップS4304:No)、生成装置3900は、補正部3903により、補正A処理を実行する(ステップS4305)。具体的には、生成装置3900は、上限長Nが最大圧縮符号長となるように、Nビット以上の各圧縮符号長での文字情報の種類数(葉数)の総和を求め、この総和を、圧縮符号長Nビットでの文字情報の種類数に補正する。したがって、(N+1)ビット以上の圧縮符号長での文字情報の種類数は0となり、最大圧縮符号長がNビットとなる。このあと、ステップS4306に移行する。
一方、Nビット以内である場合(ステップS4304:Yes)、生成装置3900は、補正A処理(ステップS4305)を実行せずに、ステップS4306に移行する。ステップS4306では、生成装置3900は、算出部3904により、圧縮符号長ごとの生起確率を算出し(ステップS4306)、算出された圧縮符号長ごとの生起確率の総和(生起確率総和TOP)を算出する(ステップS4307)。そして、図44のステップS4401に移行する。
図44は、2N分枝無節点ハフマン木の生成処理手順(後半)を示すフローチャートである。生成装置3900は、判断部3905により、算出された生起確率総和TOPが、t≦TOP≦1であるか否かを判断する(ステップS4401)。tは上述したしきい値である。t≦TOP≦1でない場合(ステップS4401:No)、生成装置3900は、判断部3905により、t>TOPであるか否かを判断する(ステップS4402)。t>TOPである場合(ステップS4402:Yes)、生成装置3900は、更新部3906により、補正B+処理を実行する(ステップS4403)。補正B+処理(ステップS4403)の詳細については後述する。補正B+処理のあとは、ステップS4405に移行する。
一方、ステップS4402において、t>TOPでない場合(ステップS4402:No)、生成装置3900は、更新部3906により、補正B-処理を実行する(ステップS4404)。補正B-処理(ステップS4404)の詳細については後述する。補正B-処理のあとは、ステップS4405に移行する。また、ステップS4401において、t≦TOP≦1である場合(ステップS4401:Yes)、ステップS4405に移行する。
また、ステップS4405において、生成装置3900は、生成部3907により、文字情報ごとに葉の構造体を生成する(ステップS4405)。そして、生成装置3900は、特定部3908により、枝数特定処理を実行する(ステップS4406)。枝数特定処理(ステップS4406)では、圧縮符号長ごとの葉当たりの枝数を特定する。枝数特定処理(ステップS4406)の詳細については後述する。
そして、生成装置3900は、構築部3909により、構築処理を実行する(ステップS4407)。枝数特定処理(ステップS4406)により葉の構造体ごとの枝数が特定されるため、まず、構築部3909は、葉の構造体ごとに、枝数分の葉へのポインタ群を生成する。そして、生成された各葉の構造体についての葉へのポインタ群を集約して根の構造体とする。これにより、2N分枝無節点ハフマン木が生成されることとなる。なお、生成された2N分枝無節点ハフマン木は、生成装置3900内の記憶装置(RAM3803や磁気ディスク3805など)に格納される。
<第1集計処理(ステップS4301)>
図45は、図43に示した第1集計処理(ステップS4301)の詳細な処理手順を示すフローチャートである。まず、生成装置3900は、ファイル番号iをi=1に設定し(ステップS4501)、対象ファイルFiを読み込む(ステップS4502)。そして、生成装置3900は、対象ファイルFiの集計処理を実行する(ステップS4503)。このあと、生成装置3900は、ファイル番号iがi>n(nは対象ファイルF1〜Fnの総数)であるか否かを判断する(ステップS4504)。
i>nでない場合(ステップS4504:No)、生成装置3900は、iをインクリメントし(ステップS4505)、ステップS4502に戻る。一方、i>nである場合(ステップS4504:Yes)、生成装置3900は、第2集計処理(ステップS4302)に移行して、第1集計処理(ステップS4301)を終了する。この第1集計処理(ステップS4301)によれば、対象ファイルFiごとに対象ファイルFiの集計処理(ステップS4503)を実行することができる。
<対象ファイルFiの集計処理(ステップS4503)>
図46は、図45に示した対象ファイルFiの集計処理(ステップS4503)の詳細な処理手順を示すフローチャートである。まず、生成装置3900は、対象文字を対象ファイルFiの先頭文字とし(ステップS4601)、特殊単語集計処理を実行する(ステップS4602)。このあと、生成装置3900は、対象文字の出現回数を1増加する(ステップS4603)。そして、生成装置3900は、対象文字が対象ファイルFiの末尾文字であるか否かを判断する(ステップS4604)。
対象文字が対象ファイルFiの末尾文字でない場合(ステップS4604:No)、生成装置3900は、対象文字を末尾方向へ1文字シフトし(ステップS4605)、ステップS4602に戻る。一方、対象文字が対象ファイルFiの末尾文字である場合(ステップS4604:Yes)、生成装置3900は、ステップS4504に移行して、対象ファイルFiの集計処理(ステップS4503)を終了する。この対象ファイルFiの集計処理(ステップS4503)によれば、対象ファイル群Fに存在する特殊単語および単一文字の出現頻度を集計することができる。
<特殊単語集計処理(ステップS4602)>
図47は、図46に示した特殊単語集計処理(ステップS4602)の詳細な処理手順を示すフローチャートである。まず、生成装置3900は、最長一致検索処理を実行し(ステップS4701)、最長一致した特殊単語があったか否かを判断する(ステップS4702)。最長一致した特殊単語があった場合(ステップS4702:Yes)、生成装置3900は、特殊単語出現頻度テーブルにおいて最長一致した特殊単語の出現回数を1増加し(ステップS4703)、ステップS4603に移行する。
一方、最長一致した特殊単語がなかった場合(ステップS4702:No)、ステップS4603に移行する。これにより、特殊単語集計処理(ステップS4602)を終了する。この特殊単語集計処理(ステップS4602)によれば、最長一致検索処理(ステップS4701)により特殊単語を計数することができるため、文字列が長い特殊単語を優先的に計数することができる。
<最長一致検索処理(ステップS4701)>
図48は、図47に示した最長一致検索処理(ステップS4701)の詳細な処理手順を示すフローチャートである。まず、生成装置3900は、c=1とする(ステップS4801)。cは対象文字からの文字数(対象文字含む)である。c=1の場合は、対象文字だけである。つぎに、生成装置3900は、対象文字からc文字目までの対象文字列と前方一致する特殊単語を、特殊単語構造体を検索する(ステップS4802)。そして、生成装置3900は、検索により特殊単語があるか否かを判断する(ステップS4803)。2分探索により特殊単語がヒットしなかった場合(ステップS4803:No)、ステップS4806に移行する。
一方、2分探索により特殊単語がヒットした場合(ステップS4803:Yes)、生成装置3900は、ヒットした特殊単語と対象文字列とが完全一致するか否かを判断する(ステップS4804)。そして、完全一致しない場合(ステップS4804:No)、ステップS4806に移行する。一方、完全一致する場合(ステップS4804:Yes)、生成装置3900は、最長一致候補として記憶装置に保持し(ステップS4805)、ステップS4806に移行する。
ステップS4806では、生成装置3900は、対象文字列について2分探索が終了したか否かを判断する(ステップS4806)。具体的には、生成装置3900は、末尾の特殊単語まで2分探索したか否かを判断する。2分探索が終了していない場合(ステップS4806:No)、生成装置3900は、ステップS4802に移行して、2分探索が終了するまで継続する。
一方、対象文字列について2分探索が終了した場合(ステップS4806:Yes)、生成装置3900は、c文字目の文字が対象ファイルFiの末尾文字であるか否かを判断する(ステップS4807)。c文字目の文字が対象ファイルFiの末尾文字である場合(ステップS4807:Yes)、ステップS4810に移行する。一方、c文字目の文字が対象ファイルFiの末尾文字でない場合(ステップS4807:No)、生成装置3900は、c>cmaxであるか否かを判断する(ステップS4808)。cmaxは予め設定された値であり、これにより対象文字列の上限文字数が設定される。
c>cmaxでない場合(ステップS4808:No)、生成装置3900は、cをインクリメントして(ステップS4809)、ステップS4802に戻る。一方、c>cmaxである場合(ステップS4808:Yes)、生成装置3900は、最長一致候補があるか否かを判断する(ステップS4810)。具体的には、生成装置3900は、ステップS4805において1つでも最長一致候補がメモリに保持されているか否かを判断する。
最長一致候補がある場合(ステップS4810:Yes)、生成装置3900は、最長一致候補のうち最長文字列を、最長一致した特殊単語に決定する(ステップS4811)。そして、ステップS4702に移行する。一方、ステップS4810において、最長一致候補が1つもない場合(ステップS4810:No)、ステップS4702に移行する。これにより、最長一致検索処理(ステップS4701)を終了する。この最長一致検索処理(ステップS4701)によれば、特殊単語構造体にある特殊単語の中から、完全一致した文字列の中でかつ最長の文字列を特殊単語として検索することができる。
<第2集計処理(ステップS4302)>
図49は、図43に示した第2集計処理(ステップS4302)の詳細な処理手順を示すフローチャートである。まず、生成装置3900は、文字情報ごとに出現率を算出する(ステップS4901)。つぎに、生成装置3900は、未選択文字情報があるか否かを判断する(ステップS4902)。未選択文字情報がある場合(ステップS4902:Yes)、生成装置3900は、出現率が最上位の未選択文字情報を選択する(ステップS4903)。そして、生成装置3900は、選択文字情報の出現率に応じて生起確率および圧縮符号長を特定し(ステップS4904)、ステップS4902に戻る。
そして、ステップS4902において、未選択文字情報がない場合(ステップS4902:No)、生成装置3900は、圧縮符号長ごとに文字情報の種類数を計数する(ステップS4905)。これにより、圧縮符号長ごとの葉数(文字情報の種類数)が特定されることとなる。
<補正B+処理(ステップS4403)>
図50は、図44に示した補正B+処理(ステップS4403)の詳細な処理手順を示すフローチャートである。まず、生成装置3900は、更新処理を実行する(ステップS5001)。更新処理(ステップS5001)の詳細については後述する。つぎに、生成装置3900は、更新処理(ステップS5001)後において、更新前後で葉数の変動があるか否かを判断する(ステップS5002)。変動がある場合(ステップS5002:Yes)、まだ、生起確率総和TOPが1以下の最大漸近値に収束していないため、更新処理(ステップS5001)に戻る。
一方、変動がない場合(ステップS5002:No)、これ以上更新処理(ステップS5001)をしても葉数が変動しない。すなわち、前回の補正B+で最大漸近値に収束したこととなり、生成装置3900は、今回の更新処理(ステップS5001)での圧縮符号長ごとの葉数で確定させ(ステップS5003)、ステップS4405に移行する。これにより、生起確率総和TOPを増加させて、1に漸近させることができ、圧縮効率の向上を図ることができる。
<補正B-処理(ステップS4404)>
図51は、図44に示した補正B-処理(ステップS4404)の詳細な処理手順を示すフローチャートである。補正B-処理(ステップS4404)は、図50に示した補正B+処理(ステップS4403)と同一内容であるため、同一処理には同一ステップ番号を付す。補正B-処理(ステップS4404)は、補正B+処理(ステップS4403)と同一内容であるが、扱う生起確率総和TOPは1より大きい値であり、更新処理(ステップS5001)を繰り返すことで、ある時点の補正B-で生起確率総和TOPが1を下回ることとなる。
生起確率総和TOPが1未満となると、補正B+の場合と同様、1以下の最大漸近値に収束するまで、更新処理(ステップS5001)を繰り返すこととなる。これにより、1より大きい生起確率総和TOPを減少させて、1に漸近させることができ、圧縮効率の向上を図ることができる。
<更新処理(ステップS5001)>
図52は、図50および図51に示した更新処理(ステップS5001)の詳細な処理手順を示すフローチャートである。まず、生成装置3900は、未選択の圧縮符号長があるか否かを判断する(ステップS5201)。未選択の圧縮符号長がある場合(ステップS5201:Yes)、生成装置3900は、未選択の中で最短の圧縮符号長を1つ選択する(ステップS5202)。生成装置3900は、選択圧縮符号長が上限長N(補正Aでの最長圧縮符号長)であるか否かを判断する(ステップS5203)。
選択圧縮符号長が上限長Nでない場合(ステップS5203:No)、生成装置3900は、選択圧縮符号長の葉数(文字情報の種類数)を、生起確率総和TOPで割る(ステップS5204)。生成部3907は、選択圧縮符号長の葉数をこの割り算結果の値に更新する。割り算結果の値については、小数点以下は切り捨て、四捨五入、切り上げのいずれでもよい。そして、ステップS5201に戻る。
また、ステップS5203において、選択圧縮符号長が上限長Nである場合(ステップS5203:Yes)、生成装置3900は、葉数の総和から、ステップS5205で更新済みの葉数の総和を引くことにより、選択圧縮符号長(この場合は、上限長N)の葉数を引き算結果の値に更新する(ステップS5206)。そして、ステップS5201に戻る。
ステップS5201において、未選択の圧縮符号長(上限長N以下の圧縮符号長)がない場合(ステップS5201:No)、生成装置3900は、葉数の更新後における生起確率総和TOPを算出し(ステップS5207)、図50および図51のステップS5002に移行する。
<枝数特定処理(ステップS4406)>
図53は、図44に示した枝数特定処理(ステップS4406)の詳細な処理手順を示すフローチャートである。まず、生成装置3900は、特定部3908により、最大圧縮符号長CLmax(=N)と最小圧縮符号長CLmin(=M)との差分D(=N−M)を算出する(ステップS5301)。たとえば、N=11の場合、図5を参照すると、M=6である。したがって、D=5である。
つぎに、生成装置3900は、2のべき数の変数jをj=0とし、圧縮符号長の変数CLをCL=Nとする(ステップS5302)。そして、生成装置3900は、j>Dであるか否かを判断する(ステップS5303)。j>Dでない場合(ステップS5303:No)、生成装置3900は、圧縮符号長CLの葉当たりの枝数b(CL)を算出する(ステップS5304)。圧縮符号長CLの葉当たりの枝数b(CL)は、b(CL)=2jで算出される。たとえば、j=0のとき、圧縮符号長CL=N=11であるため、圧縮符号長11ビットでの葉当たりの枝数b(11)は、b(11)=2j=20=1となる。
つぎに、生成装置3900は、圧縮符号長CLの総枝数B(L)を算出する(ステップS5305)。圧縮符号長CLの総枝数B(L)は、B(L)=L(CL)×b(CL)で算出される。L(CL)は、圧縮符号長CLでの葉数(文字情報の種類数)である。たとえば、j=0のとき、圧縮符号長CL=N=11であるため、圧縮符号長11ビットでの総枝数B(L)は、1216×20=1216となる。
このあと、生成装置3900は、jをインクリメントし、圧縮符号長CLをデクリメントして(ステップS5306)、ステップS5303に戻り、インクリメント後のjがj>Dであるか否かが判断される。なお、N=11の場合は、j=Dになるとj=D=5となり、CL=M=6となる。したがって、ステップS5304では、圧縮符号長CL(5ビット)当たりの枝数b(6)は、b(6)=26=64となる。同様に、総枝数B(L)は、B(6)=0×26=0となる。そして、j>Dである場合(ステップS5303:Yes)、構築処理(ステップS4407)に移行する。
<構築処理(ステップS4407)>
図54は、図44に示した構築処理(ステップS4407)の詳細な処理手順を示すフローチャートである。まず、生成装置3900は、圧縮符号長CLをCL=CLmin=Mとする(ステップS5401)。つぎに、生成装置3900は、圧縮符号長CLでの未選択の葉があるか否かを判断する(ステップS5402)。未選択の葉がある場合(ステップS5402:Yes)、生成装置3900は、葉へのポインタ生成処理(ステップS5403)を実行して、ステップS5402に戻る。葉へのポインタ生成処理(ステップS5403)では、葉の構造体ごとに、圧縮符号長CLに応じた枝数分の葉へのポインタ群を生成する。なお、葉へのポインタ生成処理(ステップS5403)の詳細については後述する。
一方、ステップS5402において、未選択の葉がない場合(ステップS5402:No)、生成装置3900は、CL>Nであるか否かを判断する(ステップS5404)。CL>Nでない場合(ステップS5404:No)、生成装置3900は、CLをインクリメントして(ステップS5405)、ステップS5402に戻る。一方、CL>Nである場合(ステップS5404:Yes)、2N分枝無節点ハフマン木が構築されたこととなり、一連処理が終了することとなる。
<葉へのポインタ生成処理(ステップS5403)>
図55は、図54に示した葉へのポインタ生成処理(ステップS5403)の詳細な処理手順を示すフローチャートである。まず、生成装置3900は、未選択の葉Lを選択し(ステップS5501)、選択葉へのポインタ数kをk=1に設定する(ステップS5502)。そして、生成装置3900は、選択葉へのポインタPL(k)の先行ビット列を、選択葉の圧縮符号に設定する(ステップS5503)。たとえば、上限長N=11については、選択葉が、文字情報「0」の葉の構造体である場合、圧縮符号は「000000」である。したがって、選択葉へのポインタPL(k)の先行ビット列も、図7に示したように、「000000」となる。
つぎに、生成装置3900は、選択葉へのポインタPL(k)の後続ビット列のビット長を、最大圧縮符号長Nから選択葉の圧縮符号長CLを引いた差分とし、後続ビット列の初期値をオール0に設定する(ステップS5504)。たとえば、選択葉が、文字情報「0」の葉の構造体である場合、圧縮符号長CLは6ビットであるため、後続ビット列のビット長は5ビット(=11−6)となる。k=1の場合は、後続ビット列はオール0となるため、後続ビット列は、5ビットの「00000」となる。
そして、生成装置3900は、選択葉へのポインタPL(k)を根の構造体に格納する(ステップS5505)。このあと、生成装置3900は、k>b(CL)であるか否かを判断する(ステップS5506)。b(CL)は、選択葉の圧縮符号長CLの葉当たりの枝数である。k>b(CL)でない場合(ステップS5506:No)、選択葉に割り当てられたすべての枝について葉へのポインタが生成されていないため、生成装置3900は、kをインクリメントする(ステップS5507)。
そして、生成装置3900は、現在の後続ビット列をインクリメントし、インクリメント後の後続ビット列を先行ビット列の末端に連結することで、あらたに、選択葉へのポインタPL(k)を生成する(ステップS5508)。そして、生成装置3900は、選択葉へのポインタPL(k)を根の構造体に格納し(ステップS5509)、ステップS5506に戻る。ステップS5506〜ステップS5509を繰り返すことで、葉当たりの枝数分の葉へのポインタ群が生成されることとなる。そして、ステップS5506において、k>b(CL)である場合(ステップS5506:Yes)、ステップS5402に移行する。
このように、本実施の形態によれば、対象ファイル群に出現する文字情報の種類数に応じて、2N分枝無節点ハフマン木の最大枝数2Nを最適な本数に設定することができるため、2N分枝無節点ハフマン木のサイズの適正化を図ることができる。また、本実施の形態によれば、上限長Nが2〜4の整数倍でない場合(たとえば、上限長N=11,13)であっても、圧縮効率のよい2N分枝無節点ハフマン木を生成することができる。
<補正B処理の他の例>
つぎに、補正B処理の他の例について説明する。上述した補正B+処理および補正B-処理では、圧縮符号長の葉数ごとに、各圧縮符号長の葉数を生起確率総和で割ることにより、各圧縮符号長の葉数を更新することとした。これに対し、本例では、最小圧縮符号長CLminから最大圧縮符号長CLmax(すなわち、上限長N)に向かって、小さい圧縮符号長の葉数がそれより大きい圧縮符号長の葉数よりも増減するように、葉数を移動させる。
具体的には、本例の補正B+処理では、小さい圧縮符号長の葉数がそれより大きい圧縮符号長の葉数よりも減少するように、葉数を補正する。一方、本例の補正B-処理では、小さい圧縮符号長の葉数がそれより大きい圧縮符号長の葉数よりも増加するように、葉数を移動させる。その後は、補正後の葉数を生起確率総和で割ることで、各圧縮符号長の葉数を更新する。
なお、以下に説明する例では、ある圧縮符号長CLの葉数L(CL)を、圧縮符号長(CL+1)の葉数L(CL+1)よりも増加/減少するように補正をおこなう例について説明するが、圧縮符号長CLよりも大きい圧縮符号長(CL+2),(CL+3),…であってもよい。また、移動対象葉数の個数は、1個に限らず、2個以上でもよい。たとえば、移動元の圧縮符号長の葉数をすべて移動先に移動させてもよい。
図56は、補正B+処理(ステップS4403)の他の例の詳細な処理手順を示すフローチャートである。補正B+処理(ステップS4403)において、最小圧縮符号長CLminをMとする。また、最大圧縮符号長CLmaxは上限長Nとなる。図56では、葉数を1個ずつ移動させる例を示している。
まず、生成装置3900は、圧縮符号長CLをCL=Mに設定する(ステップS5601)。つぎに、生成装置3900は、圧縮符号長CLがCL=Nであるか否かを判断する(ステップS5602)。CL=Nでない場合(ステップS5602:No)、圧縮符号長CLが最大圧縮符号長CLmaxに到達していないこととなる。この場合、生成装置3900は、葉数L(CL)がL(CL)=0であるか否かを判断する(ステップS5603)。
L(CL)=0の場合(ステップS5603:Yes)、移動させる葉数L(CL)がないため、生成装置3900は、圧縮符号長CLをインクリメントし(ステップS5604)、ステップS5602に戻る。そして、圧縮符号長CLがCL=Nとなった場合(ステップS5602:Yes)、ステップS5613に移行し、生成装置3900は、今回の補正における圧縮符号長ごとの葉数で確定させることとなる。
また、ステップS5603において、葉数L(CL)がL(CL)=0でない場合(ステップS5603:No)、生成装置3900は、現在対象となっている圧縮符号長CLの葉数L(CL)をデクリメントし(ステップS5605)、移動先となる圧縮符号長(CL+1)の葉数L(CL+1)をインクリメントする(ステップS5606)。
そして、圧縮符号長CL,(CL+1)については、ステップS5605,ステップS5606において葉数が増減したため、生成装置3900は、圧縮符号長CLについての生起確率と圧縮符号長(CL+1)についての生起確率とを再計算する(ステップS5607)。このあと、生成装置3900は、各圧縮符号長CLmin〜CLmaxの最新の葉数での生起確率総和TOPを算出する(ステップS5608)。
そして、生成装置3900は、算出されたTOPがt>TOPであるか否かを判断する(ステップS5609)。t>TOPである場合(ステップS5609:Yes)、まだ改善の余地があるため、ステップS5603に戻る。一方、t>TOPでない場合(ステップS5609:No)、生成装置3900は、t≦TOP≦1であるか否かを判断する(ステップS5610)。t≦TOP≦1である場合(ステップS5610:Yes)、これ以上補正する必要がないため、ステップS5613に移行する。
一方、t≦TOP≦1でない場合(ステップS5610:No)、生成装置3900は、現在対象となっている圧縮符号長Lの葉数L(CL)をインクリメントし(ステップS5611)、移動先の圧縮符号長(CL+1)の葉数L(CL+1)をデクリメントする(ステップS5612)。すなわち、t≦TOP≦1でない場合(ステップS5610:No)は、TOP>1であるため、今回の補正自体が失敗となる。
したがって、ステップS5605およびステップS5606での葉数移動を、ステップS5611およびステップS5612で元に戻すこととなる。このあと、ステップS5604に戻る。ステップS5604では、圧縮符号長CLがインクリメントされるため、葉数移動による生起確率の増加がインクリメント前の圧縮符号長CLに比べて1/2に抑えられる。したがって、葉数CLをインクリメントするほど、微調整が可能となり、より微小な補正幅でt≦TOP≦1に収めることができる。
また、ステップS5613になると、生成装置3900は、そのときの圧縮符号長CLmin〜CLmaxごとの葉数L(CLmin)〜葉数L(CLmax)で確定させることとなる(ステップS5613)。その後、ステップS4405に移行することで、補正B+処理(ステップS4403)を終了する。
図57は、補正B-処理(ステップS4404)の他の例の詳細な処理手順を示すフローチャートである。補正B-処理(ステップS4404)は、図56に示した補正B+処理(ステップS4403)とほぼ同一内容であるため、同一処理には同一ステップ番号を付す。異なる点は、ステップS5705,ステップS5706,ステップS5709,ステップS5711,ステップS5712である。
まず、生成装置3900は、圧縮符号長CLをCL=Mに設定する(ステップS5601)。つぎに、生成装置3900は、圧縮符号長CLがCL=Nであるか否かを判断する(ステップS5602)。CL=Nでない場合(ステップS5602:No)、圧縮符号長CLが最大圧縮符号長CLmaxに到達していないこととなる。この場合、生成装置3900は、葉数L(CL)がL(CL)=0であるか否かを判断する(ステップS5603)。
L(CL)=0の場合(ステップS5603:Yes)、移動させる葉数L(CL)がないため、生成装置3900は、圧縮符号長CLをインクリメントし(ステップS5604)、ステップS5602に戻る。そして、圧縮符号長CLがCL=Nとなった場合(ステップS5601:Yes)、ステップS5613に移行し、生成装置3900は、今回の補正における圧縮符号長ごとの葉数で確定させることとなる。
また、ステップS5603において、葉数L(CL)がL(CL)=0でない場合(ステップS5603:No)、生成装置3900は、現在対象となっている圧縮符号長CLの葉数L(CL)をインクリメントし(ステップS5705)、移動先となる圧縮符号長(CL+1)の葉数L(CL+1)をデクリメントする(ステップS5706)。
そして、圧縮符号長CL,(CL+1)については、ステップS5705,ステップS5706において葉数が増減したため、生成装置3900は、圧縮符号長CLについての生起確率と圧縮符号長(CL+1)についての生起確率とを再計算する(ステップS5607)。このあと、生成装置3900は、各圧縮符号長CLmin〜CLmaxの最新の葉数での生起確率総和TOPを算出する(ステップS5608)。
そして、生成装置3900は、算出されたTOPが1<TOPであるか否かを判断する(ステップS5709)。1<TOPである場合(ステップS5709:Yes)、まだ改善の余地があるため、ステップS5603に戻る。一方、1<TOPでない場合(ステップS5709:No)、生成装置3900は、t≦TOP≦1であるか否かを判断する(ステップS5610)。t≦TOP≦1である場合(ステップS5610:Yes)、これ以上補正する必要がないため、ステップS5613に移行する。
一方、t≦TOP≦1でない場合(ステップS5610:No)、生成装置3900は、現在対象となっている圧縮符号長Lの葉数L(CL)をデクリメントし(ステップS5711)、移動先の圧縮符号長(CL+1)の葉数L(CL+1)をインクリメントする(ステップS5712)。すなわち、t≦TOP≦1でない場合(ステップS5610:No)は、t>TOPであるため、今回の補正自体が失敗となる。
したがって、ステップS5705およびステップS5706での葉数移動を、ステップS5711およびステップS5712で元に戻すこととなる。このあと、ステップS5604に戻る。ステップS5604では、圧縮符号長CLがインクリメントされるため、葉数移動による生起確率の減少がインクリメント前の圧縮符号長CLに比べて1/2に抑えられる。したがって、葉数CLをインクリメントするほど、微調整が可能となり、より微小な補正幅でt≦TOP≦1に収めることができる。
また、ステップS5613になると、生成装置3900は、そのときの圧縮符号長CLmin〜CLmaxごとの葉数L(CLmin)〜葉数L(CLmax)で確定させることとなる(ステップS5613)。その後、ステップS4405に移行することで、補正B-処理(ステップS4404)を終了する。
図58は、図56に示した補正B+処理の他の例を適用した場合における、図2の(3)葉数特定〜(5)葉の構造体生成の詳細(N=12)を示す説明図である。図58では、移動元の圧縮符号長の葉数を、1ビット小さい移動先の圧縮符号長の葉数に1個ずつシフトさせた例を示している。図58では、図56におけるしきい値tをt=1とする。図58では、補正Aでの生起確率総和TOPが「0.823」であるため、補正B+処理が適用される。まず、移動先を最小圧縮符号長である6ビットとし、移動元を1ビット大きい7ビットとする。補正B+1では、圧縮符号長7ビットの葉数9を1つずつ、最小圧縮符号長6ビットに移動させる。
生成装置3900は、この移動ごとに、生起確率総和TOPを求めて、1以下の最大漸近値に収束するか否かを判断することとなる。本例において、補正B+1では生起確率総和TOPが1を超えていない。そして、移動元の圧縮符号長7ビットの葉数が0になった場合、移動先の圧縮符号長6ビットの葉数は11(=9+2)となる。このときの補正B-1での生起確率総和TOPは「0.894」であるため、さらに補正B+が必要である。
つぎに、補正B+2では、移動先および移動元の圧縮符号長を1ビット大きくする。すなわち、移動先の圧縮符号長を6ビットから7ビットとし、移動元の圧縮符号長を7ビットから8ビットとする。
そして、移動元の圧縮符号長8ビットの葉数22を1つずつ、補正B+1で葉数が0になった移動先の圧縮符号長7ビットに移動させる。生成装置3900は、この移動ごとに、生起確率総和TOPを求めて、1以下の最大漸近値に収束するか否かを判断することとなる。本例において、補正B+2では生起確率総和TOPが1を超えていない。そして、移動元の圧縮符号長8ビットの葉数が0になった場合、移動先の圧縮符号長7ビットの葉数は22(=0+22)となる。このときの補正B+2での生起確率総和TOPは「0.979」であるため、さらに補正B+が必要である。
つぎに、補正B+3では、移動先および移動元の圧縮符号長を1ビット大きくする。すなわち、移動先の圧縮符号長を7ビットから8ビットとし、移動元の圧縮符号長を8ビットから9ビットとする。
そして、移動元の圧縮符号長9ビットの葉数19を1つずつ、補正B+2で葉数が0になった移動先の圧縮符号長8ビットに移動させる。生成装置3900は、この移動ごとに、生起確率総和TOPを求めて、1以下の最大漸近値に収束するか否かを判断することとなる。本例において、移動元の圧縮符号長9ビットの葉数が28から19になり、移動先の圧縮符号長8ビットの葉数が0から11になると、生起確率総和TOPが1を超える。したがって、それぞれ葉数を1つ戻し、移動元の圧縮符号長9ビットの葉数を18、移動先の圧縮符号長8ビットの葉数を10として、補正B+3を終了する。このときの補正B+3での生起確率総和TOPは「0.999」であるため、さらに補正B+が必要である。
つぎに、補正B+4では、移動先および移動元の圧縮符号長を1ビット大きくする。すなわち、移動先の圧縮符号長を8ビットから9ビットとし、移動元の圧縮符号長を9ビットから10ビットとする。
そして、移動元の圧縮符号長10ビットの葉数29を1つずつ、補正B+3で葉数が18になった移動先の圧縮符号長9ビットに移動させる。生成装置3900は、この移動ごとに、生起確率総和TOPを求めて、1以下の最大漸近値に収束するか否かを判断することとなる。本例において、移動元の圧縮符号長10ビットの葉数が29から27になり、移動先の圧縮符号長9ビットの葉数が18から20になると、生起確率総和TOPが1を超える。したがって、それぞれ葉数を1つ戻し、移動元の圧縮符号長10ビットの葉数を28、移動先の圧縮符号長9ビットの葉数を19として、補正B+4を終了する。このときの補正B+4での生起確率総和TOPは「1.000」であるため、さらに補正B+が可能である。
つぎに、補正B+5では、移動先および移動元の圧縮符号長を1ビット大きくする。すなわち、移動先の圧縮符号長を9ビットから10ビットとし、移動元の圧縮符号長を10ビットから11ビットとする。
そして、移動元の圧縮符号長11ビットの葉数25を1つずつ、補正B+4で葉数が28になった移動先の圧縮符号長10ビットに移動させる。生成装置3900は、この移動ごとに、生起確率総和TOPを求めて、1以下の最大漸近値に収束するか否かを判断することとなる。本例において、移動元の圧縮符号長11ビットの葉数が25から23になり、移動先の圧縮符号長10ビットの葉数が28から30になると、生起確率総和TOPが1を超える。したがって、それぞれ葉数を1つ戻し、移動元の圧縮符号長11ビットの葉数を24、移動先の圧縮符号長10ビットの葉数を29として、補正B+5を終了する。このときの補正B+5での生起確率総和TOPは「1.000」であるため、さらに補正B+が可能である。
つぎに、補正B+6では、移動先および移動元の圧縮符号長を1ビット大きくする。すなわち、移動先の圧縮符号長を10ビットから11ビットとし、移動元の圧縮符号長を11ビットから12ビットとする。
そして、移動元の圧縮符号長12ビットの葉数2214を1つずつ、補正B+5で葉数が24になった移動先の圧縮符号長11ビットに移動させる。生成装置3900は、この移動ごとに、生起確率総和TOPを求めて、1以下の最大漸近値に収束するか否かを判断することとなる。本例において、移動元の圧縮符号長12ビットの葉数が2214から2213になり、移動先の圧縮符号長11ビットの葉数が24から25になると、生起確率総和TOPが1を超える。したがって、それぞれ葉数を1つ戻すこととなる。戻した葉数は、補正B+5終了時点での葉数となる。補正B+5終了時点での生起確率総和TOPは「1.000」である。本例では、これ以上、移動元の圧縮符号長を大きくすることができないため、補正B+5終了時点での葉数が確定することとなる。
図59は、上述した補正B-処理の他の例を適用した場合における、図2の(3)葉数特定〜(5)葉の構造体生成の詳細(N=11)を示す説明図である。図59では、移動元の圧縮符号長の葉数をすべて、1ビット大きい移動先の圧縮符号長の葉数にシフトさせた例を示している。図59では、図57におけるしきい値tをt=1とする。図59では、補正Aでの生起確率総和TOPが「1.146」であるため、補正B-処理が適用される。まず、移動元を最小圧縮符号長である5ビットとし、移動先を1ビット大きい6ビットとする。補正B-1では、移動元の圧縮符号長5ビットの葉数2を1つずつ、圧縮符号長6ビットに移動させる。
生成装置3900は、この移動ごとに、生起確率総和TOPを求めて、1以下の最大漸近値に収束するか否かを判断することとなる。本例において、補正B-1では生起確率総和TOPが1以下にならない。そして、移動元の圧縮符号長5ビットの葉数が0になった場合、移動先の圧縮符号長6ビットの葉数は11(=9+2)となる。このときの補正B-1での生起確率総和TOPは「1.115」であるため、さらに補正B-が必要である。
つぎに、補正B-2では、移動元および移動先の圧縮符号長を1ビット大きくする。すなわち、移動元の圧縮符号長を5ビットから6ビットとし、移動先の圧縮符号長を6ビットから7ビットとする。
そして、移動元の圧縮符号長6ビットの葉数11を1つずつ、移動先の圧縮符号長7ビットの葉数22に移動させる。生成装置3900は、この移動ごとに、生起確率総和TOPを求めて、1以下の最大漸近値に収束するか否かを判断することとなる。本例において、補正B-2では生起確率総和TOPが1以下にならない。そして、移動元の圧縮符号長6ビットの葉数が0になった場合、移動先の圧縮符号長7ビットの葉数は33(=22+11)となる。このときの補正B-2での生起確率総和TOPは「1.029」であるため、さらに補正B-が必要である。
つぎに、補正B-3では、移動元および移動先の圧縮符号長を1ビット大きくする。すなわち、移動元の圧縮符号長を6ビットから7ビットとし、移動先の圧縮符号長を7ビットから8ビットとする。
そして、移動元の圧縮符号長7ビットの葉数33を1つずつ、移動先の圧縮符号長8ビットの葉数28に移動させる。生成装置3900は、この移動ごとに、生起確率総和TOPを求めて、1以下の最大漸近値に収束するか否かを判断することとなる。本例において、補正B-3では、移動元である圧縮符号長7ビットの葉数が25、移動先である圧縮符号長8ビットの葉数が36に到達すると、生起確率総和TOPが1以下の「0.998」となる。これ以上葉数移動をしても、生起確率総和TOPが低下するため、このときの各圧縮符号長の葉数で確定させることとなる。
<圧縮処理>
つぎに、上述した2N分枝無節点ハフマン木を用いた対象ファイル群の圧縮処理について説明する。圧縮処理は、生成装置3900が実行してもよく、また、2N分枝無節点ハフマン木が格納された情報処理装置が実行してもよい。すなわち、少なくとも2N分枝無節点ハフマン木が格納されていればよい。以下、生成装置3900および情報処理装置を総称してコンピュータとする。ここで、まず、圧縮対象文字列とその圧縮符号を例に挙げて説明する。
図60は、圧縮対象文字列の一例を示す説明図である。図60では、「次の兎は」という文字列の16ビットコード(16進と2進)を示している。
図61は、図60に示した圧縮対象文字列の圧縮符号を示す説明図である。図61に示した圧縮符号は、図22に示した2N分枝無節点ハフマン木(N=12)を用いて圧縮した例を示している。図61では、図60と比較すると、高位文字「次」は、16ビットから12ビットに圧縮されている。また、高位文字「の」は、16ビットから7ビットに圧縮されている。
また、「兎」の上位分割文字コード「0x51」は、8ビットから11ビットに圧縮されている。「兎」の下位分割文字コード「0x4E」は、8ビットから11ビットに圧縮されている。高位文字「は」は、16ビットから9ビットに圧縮されている。なお、分割文字コードについては、圧縮後のほうがビット長が長いが、「兎」のような単一文字はそもそも出現回数が少ないために分割されているため、対象ファイル群全体で見れば問題ない。
図62は、圧縮対象文字列の他の例を示す説明図である。図62では、「兎は動物園の」という文字列の16ビットコード(16進と2進)を示している。
図63は、図62に示した圧縮対象文字列の圧縮符号を示す説明図である。図63に示した圧縮符号は、図32に示した2N分枝無節点ハフマン木(N=13)を用いて圧縮した例を示している。図63では、図62と比較すると、「兎」の上位分割文字コード「0x51」は、8ビットから12ビットに圧縮されている。「兎」の下位分割文字コード「0x4E」は、8ビットから12ビットに圧縮されている。高位文字「は」は、16ビットから10ビットに圧縮されている。
「動物園」は基礎単語に該当するため、48ビットから13ビットに圧縮されている。また、高位文字「の」は、16ビットから8ビットに圧縮されている。
なお、分割文字コードについては、圧縮後のほうがビット長が長いが、「兎」のような単一文字はそもそも出現回数が少ないために分割されているため、対象ファイル群全体で見れば問題ない。また、基礎単語は、そのビット列に比べて圧縮符号が非常に短くなるため(最大でも13ビット)、2文字(高位文字)以上であれば十分圧縮効率が向上することとなる。
<圧縮処理の具体例>
図64は、2N分枝無節点ハフマン木を用いた圧縮処理の具体例を示す説明図である。まず、コンピュータは、対象ファイル群Fsから1文字目の圧縮対象文字コードを取得し、対象ファイル上の位置を保持しておく。そして、コンピュータは、特殊単語の構造体3600に対して2分木探索をおこなう。特殊単語は2文字以上の文字コード列であるため、1文字目の圧縮対象文字コードがヒットした場合、2文字目の文字コードを圧縮対象文字コードとして取得する。
そして、2文字目の文字コードは、1文字目の圧縮対象文字コードがヒットした位置から探索する。3文字目以降も、不一致の圧縮対象文字コードが出現するまで繰り返し2分木探索をおこなう。一致する特殊単語ra(aは葉の番号)が探索された場合、特殊単語の構造体3600において対応付けされている葉Laへのポインタにより葉Laの構造体にアクセスする。そして、コンピュータは、アクセス先の葉Laの構造体に格納されている特殊単語raの圧縮符号を探索して、圧縮バッファ6400に格納する。
一方、不一致の圧縮文字コードが出現した場合、特殊単語の構造体3600に対する2分木探索を終了する(EOT(End Of Transmission)まで進む)。そして、コンピュータは、1文字目の圧縮対象文字コードを再度レジスタにセットして、高位文字コードの構造体3400に対する2分木探索をおこなう。
一致する文字コードeb(bは葉の番号)が探索された場合、コンピュータは、その葉Lbへのポインタにより葉Lbの構造体にアクセスする。そして、コンピュータは、アクセス先の葉Lbの構造体に格納されている文字コードebの圧縮符号を探索して、圧縮バッファ6400に格納する。
一方、一致する文字コードが出現せず2分木探索を終了した場合、圧縮対象文字コードは高位文字コードではないため、コンピュータは、上位8ビットと下位8ビットに分割する。そして、コンピュータは、上位8ビットの分割文字コードについて、分割文字コードの構造体3500に対する2分木探索をおこなう。一致する分割文字コードDc1(c1は葉の番号)が探索された場合、コンピュータは、その葉Lc1へのポインタにより葉Lc1の構造体にアクセスする。そして、コンピュータは、アクセス先の葉Lc1の構造体に格納されている分割文字コードDc1の圧縮符号を探索して、圧縮バッファ6400に格納する。
引き続き、コンピュータは、下位8ビットの分割文字コードについて、分割文字コードの構造体3500に対する2分木探索をおこなう。一致する分割文字コードDc2(c2は葉の番号)が探索された場合、コンピュータは、その葉Lc2へのポインタにより葉Lc2の構造体にアクセスする。そして、コンピュータは、アクセス先の葉Lc2の構造体に格納されている分割文字コードDc2の圧縮符号を探索して、圧縮バッファ6400に格納する。
<ファイル圧縮処理>
図65は、コンピュータが自動実行する2N分枝無節点ハフマン木を用いたファイル圧縮処理手順を示すフローチャートである。まず、コンピュータは、ファイル番号:pをp=1とし(ステップS6501)、対象ファイルFpを読み込む(ステップS6502)。つぎに、コンピュータは、圧縮処理を実行して(ステップS6503)、ファイル番号:pをインクリメントする(ステップS6504)。そして、コンピュータは、p>αであるか否かを判断する(ステップS6505)。αは対象ファイル群Fsの総数である。p>αでない場合(ステップS6505:No)、ステップS6502に戻る。一方、p>αである場合(ステップS6505:Yes)、一連のファイル圧縮処理を終了する。
図66は、図65に示した圧縮処理(ステップS6503)の詳細な処理手順を示すフローチャート(その1)である。図66において、まず、コンピュータは、対象ファイル群Fsに圧縮対象文字コードがあるか否かを判断する(ステップS6601)。ある場合(ステップS6601:Yes)、コンピュータは、圧縮対象文字コードを取得してレジスタにセットする(ステップS6602)。そして、コンピュータは、先頭の圧縮対象文字コードか否かを判断する(ステップS6603)。
ここで、先頭の圧縮対象文字コードとは、未圧縮の1文字目の文字コードをいう。先頭である場合(ステップS6603:Yes)、コンピュータは、その圧縮対象文字コードの対象ファイル群Fs上の位置(先頭位置)となるポインタを取得し(ステップS6604)、ステップS6605に移行する。一方、先頭でない場合(ステップS6603:No)、先頭位置を取得せずにステップS6605に移行する。
そして、コンピュータは、特殊単語の構造体3600に対して2分木探索をおこなう(ステップS6605)。圧縮対象文字コードが一致した場合(ステップS6606:Yes)、コンピュータは、連続して一致した文字コード列が特殊単語(の文字コード列)に該当するか否かを判断する(ステップS6607)。該当しない場合(ステップS6607:No)、コンピュータは、ステップS6602に戻って後続の文字コードを圧縮対象文字コードとして取得する。この場合、後続の文字コードは先頭ではないため、先頭位置は取得しないこととなる。
一方、ステップS6607において、特殊単語に該当する場合(ステップS6607:Yes)、コンピュータは、該当する特殊単語の葉L♯へのポインタにより葉L♯の構造体にアクセスする(ステップS6608)。そして、コンピュータは、ポイントされた葉L♯の構造体に格納されている特殊単語の圧縮符号を抽出する(ステップS6609)。
この後、コンピュータは、抽出された圧縮符号を圧縮バッファ6400に格納して(ステップS6610)、ステップS6601に戻る。このループが特殊単語の圧縮処理の流れとなる。ステップS6601において、圧縮対象文字コードがない場合(ステップS6601:No)、コンピュータは、対象ファイルFpから圧縮された圧縮ファイルfpを圧縮バッファ6400からファイル出力して保存する(ステップS6611)。そして、ステップS6504に移行する。一方、ステップS6606において不一致となった場合(ステップS6606:No)、16ビットの文字コードの圧縮処理のループに入る。
図67は、図65に示した圧縮処理(ステップS6503)の詳細な処理手順を示すフローチャート(その2)である。図67において、コンピュータは、ステップS6604で取得された先頭位置のポインタを参照して、対象ファイル群Fsから圧縮対象文字コードを取得してレジスタにセットする(ステップS6701)。
つぎに、コンピュータは、圧縮対象文字コードについて、高位文字コードの構造体3400に対して2分木探索をおこなう(ステップS6702)。一致した場合(ステップS6703:Yes)、コンピュータは、該当する文字の葉L♯へのポインタにより葉L♯の構造体にアクセスする(ステップS6704)。そして、コンピュータは、ポイントされた葉L♯の構造体に格納されている圧縮対象文字コードの圧縮符号を抽出する(ステップS6705)。
この後、コンピュータは、探索された圧縮符号を圧縮バッファ6400に格納して(ステップS6706)、ステップS6601に戻る。このループが16ビットの文字コードの圧縮処理の流れとなる。一方、ステップS6703において一致する文字コードが存在しなかった場合(ステップS6703:No)、分割文字コードの圧縮処理のループに入る。
図68は、図65に示した圧縮処理(ステップS6503)の詳細な処理手順を示すフローチャート(その3)である。図68において、まず、コンピュータは、圧縮対象文字コードを上位8ビットと下位8ビットとに分割し(ステップS6801)、上位8ビットの分割文字コードを抽出する(ステップS6802)。そして、コンピュータは、分割文字コードの構造体3500に対して2分木探索をおこなう(ステップS6803)。
そして、コンピュータは、探索された分割文字コードの葉L♯へのポインタにより葉L♯の構造体にアクセスする(ステップS6804)。そして、コンピュータは、ポイントされた葉L♯の構造体に格納されている分割文字コードの圧縮符号を抽出する(ステップS6805)。この後、コンピュータは、探索された圧縮符号を圧縮バッファ6400に格納する(ステップS6806)。
つぎに、コンピュータは、下位8ビットが探索済みか否かを判断し(ステップS6807)、探索済みでない場合(ステップS6807:No)、コンピュータは、下位8ビットの分割文字コードを抽出して(ステップS6808)、ステップS6803〜S6806を実行する。一方、下位8ビットが探索済みである場合(ステップS6807:Yes)、ステップS6601に戻り、特殊単語の圧縮処理のループに入る。
このように、2N分枝無節点ハフマン木を用いた圧縮処理では、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉L♯の構造体に格納されている文字情報を抽出して、圧縮バッファ6400に書き込むだけでよい。したがって、圧縮処理の高速化を図ることができる。
また、圧縮対象文字コードが格納されている葉L♯の構造体を、特殊単語の構造体3600、高位文字コードの構造体3400および分割文字コードの構造体3500により即座に特定することができる。したがって、2N分枝無節点ハフマン木の葉を探索する必要がなく、圧縮処理の高速化を図ることができる。また、低位文字コードを上位ビットコードと下位ビットコードに分割することで、6万種以上ある低位の文字コードをたかだか256種の分割文字コードの圧縮符号に圧縮することができる。したがって、圧縮率の向上を図ることができる。
<伸長処理例>
つぎに、2N分枝無節点ハフマン木により圧縮された圧縮符号列を伸長する伸長処理例について説明する。
図69〜図73は、図61に示した圧縮符号列の伸長処理例を示す説明図である。伸長処理では、コンピュータは、レジスタに圧縮符号列をセットし、マスクパターンにより圧縮符号を抽出する。コンピュータは、抽出した圧縮符号を、1パス(1枝分のアクセス)で2N分枝無節点ハフマン木の根から探索する。そして、コンピュータは、アクセスした葉L♯の構造体に格納されている文字コードを読み出して伸長バッファ6900に格納する。
圧縮符号を抽出するため、コンピュータは、マスクパターンのマスク位置をオフセットする。また、マスクパターンの初期値を“0xFFF00000”とする。このマスクパターンは先頭12ビットが“1”であり、後続の20ビットが“0”のビット列である。
コンピュータは、ビットアドレス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ビットのビット列を対象ビット列として抽出する。コンピュータは、対象ビット列の抽出後はレジスタをクリアする。
なお、図69〜図73において、メモリには図61に示した圧縮符号列が保持されているものとする。また、図69〜図73のメモリ内のブロックは1バイトのビット列を示しており、内部の数字は、バイト境界となるバイト位置を示している。
図69は、初期状態((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ビット分シフトする。このシフトによりレジスタには、“101111111011”が残されるため、コンピュータは、末尾12ビットを対象ビット列として抽出する。この場合は、“101111111011”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図22に示したように、2N分枝無節点ハフマン木の根の構造体には、葉L1〜L2329へのポインタが格納されている。したがって、コンピュータは、2N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“101111111011”と一致する葉L♯へのポインタを探索する。この場合、葉L691へのポインタ群の中の1つと一致するため、コンピュータは、該当する葉L691へのポインタを読み出して、葉L691の構造体にアクセスする。
葉L691の構造体には、文字コード“0x216B”(高位文字:「次」に相当)が格納されているため、コンピュータは、当該文字コード“0x216B”を抽出して伸長バッファ6900に格納する。また、葉L691の構造体には、文字コード“0x216B”の圧縮符号長leg(=12ビット)も格納されているため、コンピュータは、文字コード“0x216B”の圧縮符号長legも抽出する。コンピュータは、この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=0+12=12となる。
図70は、図69に示した(A)の状態からレジスタをバイトオフセットbyos分シフトした場合の伸長処理((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ビット分シフトする。このシフトによりレジスタには、“0000010101110011”が残されるため、コンピュータは、末尾12ビットを対象ビット列として抽出する。この場合は、“010101110011”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図22に示したように、2N分枝無節点ハフマン木の根の構造体には、葉L1〜L2329へのポインタが格納されている。したがって、コンピュータは、2N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“010101110011”と一致する葉L♯へのポインタを探索する。この場合、対象ビット列“010101110011”が葉L27へのポインタ群の中の1つと一致するため、コンピュータは、該当する葉L27へのポインタを読み出して、葉L27の構造体にアクセスする。
葉L27の構造体には、文字コード“0x6E30”(文字:「の」に相当)が格納されているため、コンピュータは、当該文字コード“0x6E30”を抽出して伸長バッファ6900に格納する。また、葉L27の構造体には、文字コード“0x6E30”の圧縮符号長leg(=7ビット)も格納されているため、コンピュータは、文字コード“0x6E30”の圧縮符号長legも抽出する。コンピュータは、この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=12+7=19となる。
図71は、図70に示した(B)の状態からレジスタをバイトオフセットbyos分シフトした場合の伸長処理((C)の状態)を示している。前回である(B)のビットアドレスabiはabi=12、圧縮符号長legは7ビットであるため、(C)のビットアドレスabiはabi=19ビットとなる。
また、このビットアドレスabi=19により、バイトオフセットbyos=2、ビットオフセットbios=3となる。バイトオフセットbyos=2により、メモリに保持されている圧縮符号列のうち先頭2バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=3により、マスクパターンは、“0x1FFE0000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0x1FFE0000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=3により、レジスタシフト数rsは、rs=32−m―bios=32−12−3=17となる。したがって、コンピュータは、レジスタ内のAND結果を末尾方向に17ビット分シフトする。このシフトによりレジスタには、“000100110011101”が残されるため、末尾12ビットを対象ビット列として抽出する。この場合は、“100110011101”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図22に示したように、2N分枝無節点ハフマン木の根の構造体には、葉L1〜L2329へのポインタが格納されている。したがって、コンピュータは、2N分枝無節点ハフマン木の根の構造体セルの中から、抽出された対象ビット列“100110011101”と一致する葉L♯へのポインタを探索する。この場合、対象ビット列“100110011101”が葉L167へのポインタ群の中の1つと一致するため、コンピュータは、該当する葉L167へのポインタを読み出して、葉L167の構造体にアクセスする。
葉L167の構造体には、分割文字コード“0x51”が格納されているため、コンピュータは、当該文字コード“0x51”を抽出して伸長バッファ6900に格納する。また、葉L167の構造体には、文字コード“0x51”の圧縮符号長leg(=11ビット)も格納されているため、コンピュータは、文字コード“0x51”の圧縮符号長legも抽出する。コンピュータは、この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=19+11=30となる。
図72は、図71に示した(C)の状態からレジスタをバイトオフセットbyos分シフトした場合の伸長処理((D)の状態)を示している。前回である(C)のビットアドレスabiはabi=19、圧縮符号長legは11ビットであるため、(D)のビットアドレスabiはabi=30ビットとなる。
また、このビットアドレスabi=30により、バイトオフセットbyos=3、ビットオフセットbios=6となる。バイトオフセットbyos=3により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭3バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=6により、マスクパターンは、“0x03FFC000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0x03FFC000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=6により、レジスタシフト数rsは、rs=32−m―bios=32−12−6=14となる。したがって、コンピュータは、レジスタ内のAND結果を末尾方向に14ビット分シフトする。このシフトによりレジスタには、“000000100110000111”が残されるため、コンピュータは、末尾12ビットを対象ビット列として抽出する。この場合は、“100110000111”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図22に示したように、2N分枝無節点ハフマン木の根の構造体には、葉L1〜L2329へのポインタが格納されている。したがって、コンピュータは、2N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“100110000111”と一致する葉L♯へのポインタを探索する。この場合、対象ビット列“100110000111”が葉L156へのポインタ群の中の一つと一致するため、葉L156へのポインタを読み出して、葉L156の構造体にアクセスする。
葉L156の構造体には、分割文字コード“0x4E”が格納されているため、コンピュータは、当該文字コード“0x4E”を抽出して伸長バッファ6900に格納する。また、葉L156の構造体には、文字コード“0x4E”の圧縮符号長leg(=11ビット)も格納されているため、コンピュータは、文字コード“0x4E”の圧縮符号長legも抽出する。コンピュータは、この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=30+11=41となる。
図73は、図72に示した(D)の状態からレジスタをバイトオフセットbyos分シフトした場合の伸長処理((E)の状態)を示している。前回である(D)のビットアドレスabiはabi=30、圧縮符号長legは11ビットであるため、(E)のビットアドレスabiはabi=41ビットとなる。
また、このビットアドレスabi=41により、バイトオフセットbyos=5、ビットオフセットbios=1となる。バイトオフセットbyos=5により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭5バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=1により、マスクパターンは、“0x7FF80000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0x7FF80000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=1により、レジスタシフト数rsは、rs=32−m―bios=32−12−1=19となる。したがって、コンピュータは、レジスタ内のAND結果を末尾方向に19ビット分シフトする。このシフトによりレジスタには、“0100001101***”(*は1または0)が残されるため、コンピュータは、末尾12ビットを対象ビット列として抽出する。この場合は、“100001101***”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図22に示したように、2N分枝無節点ハフマン木の根の構造体には、葉L1〜L2329へのポインタが格納されている。したがって、コンピュータは、2N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“100001101***”と一致する葉L♯へのポインタを探索する。この場合、対象ビット列“100001101***”が葉L79へのポインタと一致するため、コンピュータは、葉L79へのポインタを読み出して、葉L79の構造体にアクセスする。
葉L79の構造体には、文字コード“0x6F30”が格納されているため、コンピュータは、当該文字コード“0x6F30”を抽出して伸長バッファ6900に格納する。また、葉L79の構造体には、文字コード“0x6F30”の圧縮符号長leg(=8ビット)も格納されているため、コンピュータは、文字コード“0x6F30”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=41+8=49となる。
このように、葉へのポインタには圧縮符号が含まれているため、いずれの葉へのポインタが抽出された場合であっても、圧縮符号を特定するまでもなく、直接葉の構造体にアクセスすることができる。したがって、伸長処理の高速化を実現することができる。
図74〜図78は、図63に示した圧縮符号列の伸長処理例を示す説明図である。図74は、初期状態((A)の状態)を示している。(A)では、ビットアドレスabi=0により、バイトオフセットbyos=0、ビットオフセットbios=0となる。バイトオフセットbyos=0により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=0により、マスクパターンは、“0xFFF80000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0xFFF80000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=0により、レジスタシフト数rsは、rs=32−m―bios=32−13−0=19となる。したがって、コンピュータは、レジスタ内のAND結果を末尾方向に19ビット分シフトする。このシフトによりレジスタには、“1001100111010”が残されるため、コンピュータは、末尾13ビットを対象ビット列として抽出する。この場合は、“1001100111010”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図32に示したように、2N分枝無節点ハフマン木の根の構造体には、葉L1〜L5401へのポインタが格納されている。したがって、コンピュータは、2N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“1001100111010”と一致する葉L♯へのポインタを探索する。この場合、葉L167へのポインタ群の中の1つと一致するため、コンピュータは、該当する葉L167へのポインタを読み出して、葉L167の構造体にアクセスする。
葉L167の構造体には、分割文字コード“0x51”が格納されているため、コンピュータは、当該文字コード“0x51”を抽出して伸長バッファ6900に格納する。また、葉L167の構造体には、文字コード“0x51”の圧縮符号長leg(=11ビット)も格納されているため、コンピュータは、文字コード“0x51”の圧縮符号長legも抽出する。コンピュータは、この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=0+11=11となる。
図75は、図74に示した(A)の状態からレジスタをバイトオフセットbyos分シフトした場合の伸長処理((B)の状態)を示している。前回である(A)のビットアドレスabiはabi=0、圧縮符号長legは11ビットであるため、(B)のビットアドレスabiはabi=11ビットとなる。
また、このビットアドレスabi=11により、バイトオフセットbyos=1、ビットオフセットbios=3となる。バイトオフセットbyos=1により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭1バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=3により、マスクパターンは、“0x1FFF0000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0x1FFF0000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=3により、レジスタシフト数rsは、rs=32−m―bios=32−13−3=16となる。したがって、コンピュータは、レジスタ内のAND結果を末尾方向に16ビット分シフトする。このシフトによりレジスタには、“0001001100001110”が残されるため、コンピュータは、末尾13ビットを対象ビット列として抽出する。この場合は、“1001100001110”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図32に示したように、2N分枝無節点ハフマン木の根の構造体には、葉L1〜L5401へのポインタが格納されている。したがって、コンピュータは、2N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“1001100001110”と一致する葉L♯へのポインタを探索する。この場合、対象ビット列“1001100001110”が葉L156へのポインタ群の中の1つと一致するため、コンピュータは、該当する葉L156へのポインタを読み出して、葉L156の構造体にアクセスする。
葉L156の構造体には、分割文字コード“0x4E”が格納されているため、コンピュータは、当該文字コード“0x4E”を抽出して伸長バッファ6900に格納する。また、葉L156の構造体には、文字コード“0x4E”の圧縮符号長leg(=11ビット)も格納されているため、コンピュータは、文字コード“0x4E”の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=11+11=22となる。
図76は、図75に示した(B)の状態からレジスタをバイトオフセットbyos分シフトした場合の伸長処理((C)の状態)を示している。前回である(B)のビットアドレスabiはabi=11、圧縮符号長legは11ビットであるため、(C)のビットアドレスabiはabi=22ビットとなる。
また、このビットアドレスabi=22により、バイトオフセットbyos=2、ビットオフセットbios=6となる。バイトオフセットbyos=2により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭2バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=6により、マスクパターンは、“0x03FFE000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0x03FFE000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=6により、レジスタシフト数rsは、rs=32−m―bios=32−13−6=13となる。したがって、コンピュータは、レジスタ内のAND結果を末尾方向に13ビット分シフトする。このシフトによりレジスタには、“0000001000011011111”が残されるため、コンピュータは、末尾13ビットを対象ビット列として抽出する。この場合は、“1000011011111”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図32に示したように、2N分枝無節点ハフマン木の根の構造体には、葉L1〜L5401へのポインタが格納されている。したがって、コンピュータは、2N分枝無節点ハフマン木の根の構造体セルの中から、抽出された対象ビット列“1000011011111”と一致する葉L♯へのポインタを探索する。この場合、対象ビット列“1000011011111”が葉L79へのポインタ群の中の1つと一致するため、コンピュータは、該当する葉L79へのポインタを読み出して、葉L79の構造体にアクセスする。
葉L79の構造体には、文字コード“0x6F30”が格納されているため、コンピュータは、当該文字コード“0x6F30”を抽出して伸長バッファ6900に格納する。また、葉L79の構造体には、文字コード“0x6F30”の圧縮符号長leg(=9ビット)も格納されているため、コンピュータは、文字コード“0x6F30”の圧縮符号長legも抽出する。コンピュータは、この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=22+9=31となる。
図77は、図76に示した(C)の状態からレジスタをバイトオフセットbyos分シフトした場合の伸長処理((D)の状態)を示している。前回である(C)のビットアドレスabiはabi=22、圧縮符号長legは9ビットであるため、(D)のビットアドレスabiはabi=31ビットとなる。
また、このビットアドレスabi=31により、バイトオフセットbyos=3、ビットオフセットbios=7となる。バイトオフセットbyos=3により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭3バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=7により、マスクパターンは、“0x01FFF000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0x01FFF000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=7により、レジスタシフト数rsは、rs=32−m―bios=32−13−7=12となる。したがって、コンピュータは、レジスタ内のAND結果を末尾方向に12ビット分シフトする。このシフトによりレジスタには、“00000001111001100001”が残されるため、コンピュータは、末尾13ビットを対象ビット列として抽出する。この場合は、“1111001100001”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図32に示したように、2N分枝無節点ハフマン木の根の構造体には、葉L1〜L5401へのポインタが格納されている。したがって、コンピュータは、2N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“1111001100001”と一致する葉L♯へのポインタを探索する。この場合、対象ビット列“1111001100001”が葉L5401へのポインタ群の中の一つと一致するため、コンピュータは、葉L5401へのポインタを読み出して、葉L5401の構造体にアクセスする。
葉L5401の構造体には、基礎単語“動物園”が格納されているため、コンピュータは、当該基礎単語“動物園”を抽出して伸長バッファ6900に格納する。また、葉L5401の構造体には、基礎単語“動物園”の圧縮符号長leg(=13ビット)も格納されているため、コンピュータは、基礎単語“動物園”の圧縮符号長legも抽出する。コンピュータは、この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=31+13=44となる。
図78は、図77に示した(D)の状態からレジスタをバイトオフセットbyos分シフトした場合の伸長処理((E)の状態)を示している。前回である(D)のビットアドレスabiはabi=31、圧縮符号長legは13ビットであるため、(E)のビットアドレスabiはabi=44ビットとなる。
また、このビットアドレスabi=44により、バイトオフセットbyos=5、ビットオフセットbios=4となる。バイトオフセットbyos=5により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭5バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=4により、マスクパターンは、“0x0FFE0000”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“0x0FFE0000”を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=4により、レジスタシフト数rsは、rs=32−m―bios=32−13−4=15となる。したがって、コンピュータは、レジスタ内のAND結果を末尾方向に15ビット分シフトする。このシフトによりレジスタには、“00000101001******”(*は1または0)が残されるため、コンピュータは、末尾13ビットを対象ビット列として抽出する。この場合は、“0101001******”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
図32に示したように、2N分枝無節点ハフマン木の根の構造体には、葉L1〜L5401へのポインタが格納されている。したがって、コンピュータは、2N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“0101001******”と一致する葉L♯へのポインタを探索する。この場合、対象ビット列“0101001******”が葉L27へのポインタと一致するため、コンピュータは、葉L27へのポインタを読み出して、葉L27の構造体にアクセスする。
葉L27の構造体には、文字コード“0x6E30”が格納されているため、コンピュータは、当該文字コード“0x6E30”を抽出して伸長バッファ6900に格納する。また、葉L27の構造体には、文字コード“0x6E30”の圧縮符号長leg(=9ビット)も格納されているため、コンピュータは、文字コード“0x6E30”の圧縮符号長legも抽出する。コンピュータは、この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=44+9=53となる。
このように、葉へのポインタには圧縮符号が含まれているため、いずれの葉へのポインタが抽出された場合であっても、圧縮符号を特定するまでもなく、直接葉の構造体にアクセスすることができる。したがって、伸長処理の高速化を実現することができる。
<伸長処理手順>
図79は、2N分枝無節点ハフマン木を用いた伸長処理手順を示すフローチャート(その1)である。図79において、まず、コンピュータは、ビットアドレスabiをabi=0とし(ステップS7901)、バイトオフセットbyosを算出し(ステップS7902)、ビットオフセットbiosを算出する(ステップS7903)。そして、コンピュータは、バイトオフセットbyosの位置からの圧縮符号列をレジスタにセットする(ステップS7904)。
つぎに、コンピュータは、マスクパターンをビットオフセットbios分、末尾方向にシフトして(ステップS7905)、レジスタにセットされた圧縮符号列とのAND演算をおこなう(ステップS7906)。このあと、コンピュータは、レジスタシフト数rsを算出して(ステップS7907)、AND演算後のレジスタをレジスタシフト数rs分、末尾にシフトする(ステップS7908)。
図80は、2N分枝無節点ハフマン木を用いた伸長処理手順を示すフローチャート(その2)である。ステップS7908のあと、図80において、コンピュータは、シフト後のレジスタから末尾Nビットを対象ビット列として抽出する(ステップS8001)。つぎに、コンピュータは、2N分枝無節点ハフマン木の根の構造体から葉L♯へのポインタを特定し(ステップS8002)、ポイント先となる葉L♯の構造体に1パスでアクセスする(ステップS8003)。そして、コンピュータは、アクセス先の葉L♯の構造体から文字情報を抽出し(ステップS8004)、抽出された文字情報を伸長バッファ6900に書き込む(ステップS8005)。
また、コンピュータは、葉L♯の構造体から圧縮符号長legを抽出し(ステップS8006)、ビットアドレスabiを更新する(ステップS8007)。このあと、コンピュータは、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する(ステップS8008)。たとえば、バイトオフセットbyosに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合(ステップS8008:Yes)、図79のステップS7902に戻る。一方、圧縮符号列がない場合(ステップS8008:No)、一連の伸長処理を終了する。
このような伸長処理により、圧縮符号列からNビット単位で圧縮符号を抽出することができ、さらに、2N分枝無節点ハフマン木の根の構造体にアクセスすることで、該当する枝番号となる葉L♯へのポインタを特定することができる。そして、アクセス先となる葉L♯の構造体から文字コードを抽出することで、圧縮符号を伸長する。このように、2N分枝無節点ハフマン木は、内部節点を有していないため、葉L♯へのポインタが特定されれば、1パスで葉L♯の構造体にアクセスすることができ、伸長速度の高速化を図ることができる。
以上説明したように、本実施の形態によれば、文字情報の総種類数に応じて2N分枝無節点ハフマン木での圧縮符号長の上限長Nを1ビット刻みで調節することができる。したがって、文字情報の総種類数に適したサイズで2N分枝無節点ハフマン木を生成することができ、省メモリ化を図ることができる。
具体的には、文字情報の総種類数が2K-1個より大きく2K個以下である場合は、上限長NをKビットに決定することで、上述の補正Aで示したように、上限長K以上の圧縮符号長の葉数は上限長Kの圧縮符号長の葉数に集約される。したがって、2K分枝無節点ハフマン木が生成されるため、上限符号長が(K+1)以上とした場合の無節点ハフマン木よりもサイズを小さくすることができる。
たとえば、文字情報の総種類数が210個より大きく211個以下である場合は、上限長Nを11ビットに決定することで、211分枝無節点ハフマン木を生成することができる。また、文字情報の総種類数が211個より大きく212個以下である場合は、上限長Nを12ビットに決定することで、212分枝無節点ハフマン木を生成することができる。さらに、文字情報の総種類数が212個より大きく213個以下である場合は、上限長Nを13ビットに決定することで、213分枝無節点ハフマン木を生成することができる。
また、補正Aでの生起確率総和がしきい値t以上1以下であれば、十分な圧縮効率を見込める。したがって、補正Aでの各圧縮符号長の葉数で2N分枝無節点ハフマン木を生成することで、生成速度の高速化を図ることができる。
また、補正Aでの生起確率総和がしきい値t以上1以下でなければ、補正Bを実行することで、圧縮効率の向上を図ることができる。たとえば、しきい値t未満であれば、補正+処理を実行することで、生起確率総和を1に漸近させることができ、圧縮効率の向上を最大限までおこなうことができる。同様に、1より大きい場合でも、補正-処理を実行することで、生起確率総和を1に漸近させることができ、圧縮効率の向上を最大限までおこなうことができる。
また、圧縮符号長間で葉数のシフトをおこなうことでも、生起確率総和を1に近似させることが可能となる。いずれにしても、生起確率総和が1に近似するように各圧縮符号長の葉数を最適な葉数とすることで、圧縮効率の向上を図ることができる。
なお、本実施の形態で説明した方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本生成プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本生成プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Nを決定する決定工程と、
前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Nを圧縮符号長とする前記文字情報の種類数を、前記上限長N以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Nを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする2N分枝無節点ハフマン木を構築する構築工程と、
をコンピュータに実行させることを特徴とする生成プログラム。
(付記2)前記決定工程は、
前記文字情報の総種類数が2K-1個より大きく2K個以下である場合は、前記上限長NをKビットに決定することを特徴とする付記1に記載の生成プログラム。
(付記3)前記決定工程は、
前記文字情報の総種類数が210個より大きく211個以下である場合は、前記上限長Nを11ビットに決定することを特徴とする付記2に記載の生成プログラム。
(付記4)前記決定工程は、
前記文字情報の総種類数が211個より大きく212個以下である場合は、前記上限長Nを12ビットに決定することを特徴とする付記2に記載の生成プログラム。
(付記5)前記決定工程は、
前記文字情報の総種類数が212個より大きく213個以下である場合は、前記上限長Nを13ビットに決定することを特徴とする付記2に記載の生成プログラム。
(付記6)前記補正工程による補正後の前記上限長Nまでの各圧縮符号長での前記文字情報の種類数に基づいて、前記上限長Nまでの各圧縮符号長を規定する各生起確率の総和を算出する算出工程と、
前記算出工程によって算出された総和がしきい値以上1以下であるか否かを判断する判断工程と、
前記判断工程によって前記しきい値以上1以下であると判断された場合、前記上限長Nまでの圧縮符号長と、前記上限長Nまでの圧縮符号長ごとの前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成する生成工程と、
前記上限長Nまでの圧縮符号長に基づいて、前記生成工程によって生成された葉の構造体1つ当たりの枝数を、前記上限長Nまでの圧縮符号長ごとに特定する特定工程と、を前記コンピュータに実行させ、
前記構築工程は、
前記葉の構造体内の圧縮符号に前記特定工程によって特定された枝数分の枝番号をあらわす各ビット列を連結した葉へのポインタ群を、葉の構造体ごとに生成することにより、前記各葉の構造体についての前記葉へのポインタ群を根とする2N分枝無節点ハフマン木を構築することを特徴とする付記1〜5のいずれか一つに記載の生成プログラム。
(付記7)前記判断工程によって前記しきい値以上1以下でないと判断された場合、前記上限長Nまでの各圧縮符号長の前記文字情報の種類数を、前記総和で割ることにより、前記上限長Nまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Nまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が1以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が前記最大値であると判断された場合、前記上限長Nまでの圧縮符号長と、前記上限長Nまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする付記6に記載の生成プログラム。
(付記8)前記判断工程によって前記しきい値以上1以下でないと判断された場合、前記上限長Nまでの各圧縮符号長のうち第1の圧縮符号長の前記文字情報の種類数を所定数減少させ、当該第1の圧縮符号長よりも大きい第2の圧縮符号長の前記文字情報の種類数を前記所定数増加させることにより、前記上限長Nまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Nまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が1以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が1以下の最大値であると判断された場合、前記上限長Nまでの圧縮符号長と、前記上限長Nまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする付記6に記載の生成プログラム。
(付記9)前記再算出された総和が1以下の最大値となるまで、前記更新工程による更新、前記算出工程による更新後における前記上限長Nまでの各圧縮符号長の前記文字情報の種類数に基づく前記総和の再算出、および、前記判断工程による再算出された総和が1以下の最大値であるか否かの判断を、前記コンピュータに繰り返し実行させることを特徴とする付記7または8に記載の生成プログラム。
(付記10)対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計手段と、
前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Nを決定する決定手段と、
前記集計手段によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定手段によって決定された上限長Nを圧縮符号長とする前記文字情報の種類数を、前記上限長N以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正手段と、
前記補正手段によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Nを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする2N分枝無節点ハフマン木を構築する構築手段と、
を備えることを特徴とする生成装置。
(付記11)対象ファイルを記憶する記憶装置を有するコンピュータが、
集計手段により、前記対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
決定手段により、前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Nを決定する決定工程と、
補正手段により、前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Nを圧縮符号長とする前記文字情報の種類数を、前記上限長N以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
構築手段により、前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Nを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする2N分枝無節点ハフマン木を構築する構築工程と、
を実行することを特徴とする生成方法。
3900 生成装置
3901 集計部
3902 決定部
3903 補正部
3904 算出部
3905 判断部
3906 更新部
3907 生成部
3908 特定部
3909 構築部

Claims (10)

  1. 対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
    前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Nを決定する決定工程と、
    前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Nを圧縮符号長とする前記文字情報の種類数を、前記上限長N以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
    前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Nを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする2N分枝無節点ハフマン木を構築する構築工程と、
    をコンピュータに実行させることを特徴とする生成プログラム。
  2. 前記決定工程は、
    前記文字情報の総種類数が2K-1個より大きく2K個以下である場合は、前記上限長NをKビットに決定することを特徴とする請求項1に記載の生成プログラム。
  3. 前記決定工程は、
    前記文字情報の総種類数が210個より大きく211個以下である場合は、前記上限長Nを11ビットに決定することを特徴とする請求項2に記載の生成プログラム。
  4. 前記決定工程は、
    前記文字情報の総種類数が211個より大きく212個以下である場合は、前記上限長Nを12ビットに決定することを特徴とする請求項2に記載の生成プログラム。
  5. 前記決定工程は、
    前記文字情報の総種類数が212個より大きく213個以下である場合は、前記上限長Nを13ビットに決定することを特徴とする請求項2に記載の生成プログラム。
  6. 前記補正工程による補正後の前記上限長Nまでの各圧縮符号長での前記文字情報の種類数に基づいて、前記上限長Nまでの各圧縮符号長を規定する各生起確率の総和を算出する算出工程と、
    前記算出工程によって算出された総和がしきい値以上1以下であるか否かを判断する判断工程と、
    前記判断工程によって前記しきい値以上1以下であると判断された場合、前記上限長Nまでの圧縮符号長と、前記上限長Nまでの圧縮符号長ごとの前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成する生成工程と、
    前記上限長Nまでの圧縮符号長に基づいて、前記生成工程によって生成された葉の構造体1つ当たりの枝数を、前記上限長Nまでの圧縮符号長ごとに特定する特定工程と、を前記コンピュータに実行させ、
    前記構築工程は、
    前記葉の構造体内の圧縮符号に前記特定工程によって特定された枝数分の枝番号をあらわす各ビット列を連結した葉へのポインタ群を、葉の構造体ごとに生成することにより、前記各葉の構造体についての前記葉へのポインタ群を根とする2N分枝無節点ハフマン木を構築することを特徴とする請求項1〜5のいずれか一つに記載の生成プログラム。
  7. 前記判断工程によって前記しきい値以上1以下でないと判断された場合、前記上限長Nまでの各圧縮符号長の前記文字情報の種類数を、前記総和で割ることにより、前記上限長Nまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
    前記算出工程は、
    前記更新工程による更新後における前記上限長Nまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
    前記判断工程は、
    前記算出工程によって再算出された総和が1以下の最大値であるか否かを判断し、
    前記生成工程は、
    前記判断工程によって前記再算出された総和が前記最大値であると判断された場合、前記上限長Nまでの圧縮符号長と、前記上限長Nまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする請求項6に記載の生成プログラム。
  8. 前記判断工程によって前記しきい値以上1以下でないと判断された場合、前記上限長Nまでの各圧縮符号長のうち第1の圧縮符号長の前記文字情報の種類数を所定数減少させ、当該第1の圧縮符号長よりも大きい第2の圧縮符号長の前記文字情報の種類数を前記所定数増加させることにより、前記上限長Nまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
    前記算出工程は、
    前記更新工程による更新後における前記上限長Nまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
    前記判断工程は、
    前記算出工程によって再算出された総和が1以下の最大値であるか否かを判断し、
    前記生成工程は、
    前記判断工程によって前記再算出された総和が1以下の最大値であると判断された場合、前記上限長Nまでの圧縮符号長と、前記上限長Nまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする請求項6に記載の生成プログラム。
  9. 対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計手段と、
    前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Nを決定する決定手段と、
    前記集計手段によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定手段によって決定された上限長Nを圧縮符号長とする前記文字情報の種類数を、前記上限長N以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正手段と、
    前記補正手段によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Nを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする2N分枝無節点ハフマン木を構築する構築手段と、
    を備えることを特徴とする生成装置。
  10. 対象ファイルを記憶する記憶装置を有するコンピュータが、
    集計手段により、前記対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
    決定手段により、前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Nを決定する決定工程と、
    補正手段により、前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Nを圧縮符号長とする前記文字情報の種類数を、前記上限長N以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
    構築手段により、前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Nを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする2N分枝無節点ハフマン木を構築する構築工程と、
    を実行することを特徴とする生成方法。
JP2012557687A 2011-02-14 2011-02-14 生成プログラム、生成装置、および生成方法 Active JP5505524B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2011/053059 WO2012111078A1 (ja) 2011-02-14 2011-02-14 生成プログラム、生成装置、および生成方法

Publications (2)

Publication Number Publication Date
JP5505524B2 true JP5505524B2 (ja) 2014-05-28
JPWO2012111078A1 JPWO2012111078A1 (ja) 2014-07-03

Family

ID=46672043

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012557687A Active JP5505524B2 (ja) 2011-02-14 2011-02-14 生成プログラム、生成装置、および生成方法

Country Status (4)

Country Link
US (1) US9542427B2 (ja)
EP (1) EP2677662B1 (ja)
JP (1) JP5505524B2 (ja)
WO (1) WO2012111078A1 (ja)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP2830225A4 (en) * 2012-03-19 2015-12-30 Fujitsu Ltd PROGRAM, COMPROMISED DATA PRODUCTION PROCESS, DECOMPRESSION PROCESS, INFORMATION PROCESSING DEVICE AND RECORDING MEDIUM
JP6447161B2 (ja) 2015-01-20 2019-01-09 富士通株式会社 意味構造検索プログラム、意味構造検索装置、及び意味構造検索方法
CN105490683B (zh) * 2015-11-26 2019-01-08 东方网力科技股份有限公司 保存范式哈夫曼树的方法及装置
JP6737025B2 (ja) 2016-07-19 2020-08-05 富士通株式会社 符号化プログラム、検索プログラム、符号化装置、検索装置、符号化方法、及び検索方法
US9698819B1 (en) * 2016-12-23 2017-07-04 Amazon Technologies, Inc. Huffman code generation

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06131151A (ja) * 1992-10-15 1994-05-13 Sony Corp データ伝送装置及びデータ伝送方法
JP2002278748A (ja) * 2001-03-22 2002-09-27 Sony Corp データ処理装置およびデータ処理方法、プログラムおよびプログラム記録媒体、並びに符号化データおよびデータ記録媒体
WO2008146756A1 (ja) * 2007-05-24 2008-12-04 Fujitsu Limited 情報検索プログラム、該プログラムを記録した記録媒体、情報検索方法、および情報検索装置
JP2010093414A (ja) * 2008-10-06 2010-04-22 Fujitsu Ltd 情報処理プログラム、情報処理装置、および情報処理方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6040790A (en) * 1998-05-29 2000-03-21 Xerox Corporation Method of building an adaptive huffman codeword tree
US7538696B2 (en) * 2007-08-31 2009-05-26 Rmi Corporation System and method for Huffman decoding within a compression engine

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06131151A (ja) * 1992-10-15 1994-05-13 Sony Corp データ伝送装置及びデータ伝送方法
JP2002278748A (ja) * 2001-03-22 2002-09-27 Sony Corp データ処理装置およびデータ処理方法、プログラムおよびプログラム記録媒体、並びに符号化データおよびデータ記録媒体
WO2008146756A1 (ja) * 2007-05-24 2008-12-04 Fujitsu Limited 情報検索プログラム、該プログラムを記録した記録媒体、情報検索方法、および情報検索装置
JP2010093414A (ja) * 2008-10-06 2010-04-22 Fujitsu Ltd 情報処理プログラム、情報処理装置、および情報処理方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
JPN6014006719; Michael B.Baer: 'On Conditional Branches in Optimal Decision Trees' Information Theory,2007. ISIT 2007. IEEE International Symposium on , 200706, pp.436-440 *

Also Published As

Publication number Publication date
JPWO2012111078A1 (ja) 2014-07-03
EP2677662B1 (en) 2019-02-20
US20130332433A1 (en) 2013-12-12
WO2012111078A1 (ja) 2012-08-23
EP2677662A1 (en) 2013-12-25
EP2677662A4 (en) 2016-12-28
US9542427B2 (en) 2017-01-10

Similar Documents

Publication Publication Date Title
KR101560109B1 (ko) 추출 방법, 추출 프로그램을 기록한 컴퓨터 판독 가능한 기록 매체, 추출 장치, 및 추출 시스템
JP5505524B2 (ja) 生成プログラム、生成装置、および生成方法
JP4893805B2 (ja) 情報処理プログラム、情報検索プログラム、および情報処理装置
WO2012150637A1 (ja) 抽出方法、情報処理方法、抽出プログラム、情報処理プログラム、抽出装置、および情報処理装置
JP5062131B2 (ja) 情報処理プログラム、情報処理装置、および情報処理方法
JP5605288B2 (ja) 出現マップ生成方法、ファイル抽出方法、出現マップ生成プログラム、ファイル抽出プログラム、出現マップ生成装置、およびファイル抽出装置
Ferragina et al. On the bit-complexity of Lempel--Ziv compression
JP5621906B2 (ja) 検索プログラム、検索装置、および検索方法
JP5365719B2 (ja) 情報検索プログラム、該プログラムを記録した記録媒体、および情報検索方法
JP4208326B2 (ja) 情報索引装置
JP6931442B2 (ja) 符号化プログラム、インデックス生成プログラム、検索プログラム、符号化装置、インデックス生成装置、検索装置、符号化方法、インデックス生成方法および検索方法
JP6304302B2 (ja) 情報生成方法、情報生成装置、および情報生成プログラム
JP2016149160A5 (ja)
KR20220049540A (ko) 인코딩 및 디코딩 테이블을 이용한 세미 소팅 압축
JP5736589B2 (ja) 数列データ検索装置、数列データ検索方法及びプログラム
JP5007744B2 (ja) 情報検索装置
Venturini et al. Bit-Complexity of Lempel-Ziv Compression

Legal Events

Date Code Title Description
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: 20140218

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20140303

R150 Certificate of patent or registration of utility model

Ref document number: 5505524

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150