(57)【特許請求の範囲】
【請求項１】
入力された可変長のバイト列からなる複数のキーに基づいて、前記キーの共通する接頭辞部分のバイトを結合して前記複数のキーを表現するトライ木構造を構築するノード追加部と、
前記トライ木構造のノードの各々について、前記ノードが前記キー末端のバイトの情報を保持するノードであるか否かを示すビット値を付与したビット配列を作成するフラグ付与部と、
前記ビット配列における、前記キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、前記ビット配列における前記ビット値の相対インデックス値を入力として、最小完全ハッシュ関数により、固定長の非負整数値を算出し、前記ノードが末端のバイトの情報を保持する前記キーに対して、ＩＤとして付与する非負整数値ＩＤ付与部と、
を含むＩＤ付与装置。
【請求項２】
入力された可変長のバイト列からなる複数のキーに基づいて、前記キーの共通する接頭辞部分のバイトを結合して前記複数のキーを表現するトライ木構造を構築するノード追加部と、
前記トライ木構造のノードの各々について、前記ノードが前記キー末端のバイトの情報を保持するノードであるか否かを示すビット値を付与したビット配列を作成するフラグ付与部と、
前記ビット配列における、前記キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、前記ビット配列の先頭から前記ビット値までにおける、前記キーの末端のバイトの情報を保持するノードであることを示すビット値の数をカウントし、カウントされた値を固定長の非負整数値として算出し、前記ノードが末端のバイトの情報を保持する前記キーに対して、ＩＤとして付与する非負整数値ＩＤ付与部と、
を含むＩＤ付与装置。
【請求項３】
ノード追加部と、フラグ付与部と、非負整数値ＩＤ付与部とを含む、ＩＤ付与装置におけるＩＤ付与方法において、
前記ノード追加部により、入力された可変長のバイト列からなる複数のキーに基づいて、前記キーの共通する接頭辞部分のバイトを結合して前記複数のキーを表現するトライ木構造を構築し、
前記フラグ付与部により、前記トライ木構造のノードの各々について、前記ノードが前記キー末端のバイトの情報を保持するノードであるか否かを示すビット値を付与したビット配列を作成し、
前記非負整数値ＩＤ付与部により、前記ビット配列における、前記キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、前記ビット配列における前記ビット値の相対インデックス値を入力として、最小完全ハッシュ関数により、固定長の非負整数値を算出し、前記ノードが末端のバイトの情報を保持する前記キーに対して、ＩＤとして付与する
ＩＤ付与方法。
【請求項４】
ノード追加部と、フラグ付与部と、非負整数値ＩＤ付与部とを含む、ＩＤ付与装置におけるＩＤ付与方法において、
前記ノード追加部により、入力された可変長のバイト列からなる複数のキーに基づいて、前記キーの共通する接頭辞部分のバイトを結合して前記複数のキーを表現するトライ木構造を構築し、
前記フラグ付与部により、前記トライ木構造のノードの各々について、前記ノードが前記キー末端のバイトの情報を保持するノードであるか否かを示すビット値を付与したビット配列を作成し、
前記非負整数値ＩＤ付与部により、前記ビット配列における、前記キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、前記ビット配列の先頭から前記ビット値までにおける、前記キーの末端のバイトの情報を保持するノードであることを示すビット値の数をカウントし、カウントされた値を固定長の非負整数値として算出し、前記ノードが末端のバイトの情報を保持する前記キーに対して、ＩＤとして付与する
ＩＤ付与方法。
【請求項５】
コンピュータを、請求項１又は請求項２に記載のＩＤ付与装置を構成する各部として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＩＤ付与装置、方法、プログラムに係り、特に、入力されたキーに対してＩＤを付与するＩＤ付与装置、方法、プログラムに関する。
【背景技術】
【０００２】
従来、データベースの基本はリレーショナルデータベースが使われてきた。リレーショナルデータベースでは、理論的な枠組みが存在し、多種多様なデータベースをリレーショナルデータベースという一つの枠組みで表現できるといった汎用性や、比較的自由な表現力とＳＱＬを用いた汎用性の高い検索の仕組みがあるといった利便性の高さがあるため、多くの場面で利用されている。
【０００３】
一方、近年、ｗｅｂデータの急速な増大などの影響で、扱うべきデジタルデータも急速に増大している現状がある。リレーショナルデータベースで扱うデータ量が多くなると、その汎用性のため多少犠牲になっている情報格納容量や検索速度の問題が顕在化し、実用が難しくなるという現象が散見されるようになってきた。
【０００４】
そこで、キーバリューストアと呼ばれる単純にキーと値のペアのみのデータを対象としてコンパクトにデータを保持し、高速に検索できる仕組みが利用される場面が増えてきた。
【０００５】
これは、大量のデータを効率的に処理するために、複雑かつ汎用的なデータベースではなく、データの構造を限定し、データの格納とキーに対する値の検索という必要最小限の機能に特化した形で、より大きな効果を得るための方法論といえる。
【０００６】
実際に考えられるキーと値のペアの簡単な例は図１０に示すように、住所と名前の対応を表すデータ、商品名と値段のペアのデータ、ｗｅｂ上のＵＲＬとそのＵＲＬの実際のページが格納されている計算機上のアドレスなどが挙げられる。
【０００７】
図１０に示した例のように、キーは基本的に重複しないことを前提とするが、値は重複があってもよい。これら以外にも、計算機上で扱われる多くのデータは簡単化すると、このキーと値のペアの形に落とし込むことができる。
【０００８】
また、可変長バイト列のキー（主に文字列）と非負整数値のペアのデータは、ある可変長キーの情報が計算機内のどこに格納されているか検索する際に多く利用されてきた。これらの可変長キーと非負整数値がペアとなったデータの集合を保持する方法として、これまでに様々なデータの保持の仕方が考案されてきた。可変長キーの容量を圧縮して保存する方法には、トライ木構造に代表される共通接頭辞でまとめて表現する方法が広く使われている。
【０００９】
これにより、一般的に、キーを単純に連結した容量よりも小さく圧縮して同じキー情報を保持することができる。具体的な例として、パトリシア木（非特許文献１）、ダブル配列（非特許文献２）、簡潔木構造（非特許文献３、非特許文献４）などが挙げられる。
【先行技術文献】
【非特許文献】
【００１０】
【非特許文献１】Donald R. Morrison. PATRICIA: Practical Algorithm To Retrieve Information Coded in Alphanumeric Journal of the ACM (JACM), Volume 15 Issue 4, Pages 514 - 534, Oct. 1968.
【非特許文献２】青江順一. ダブル配列による高速ディジタル検索アルゴリズム電気情報通信学会, 論文誌D Vol, J71-D, No. 9, 1988.
【非特許文献３】定兼邦彦. 単純なRank/Select 辞書電気情報通信学会, 技術報告, 2006.
【非特許文献４】Sadakane, K., R. Grossi. Squeezing succinct data structures into entropy bounds. Proceedings of the seven-teenth annual ACM-SIAM symposium on Discrete algorithm, pp. 1230 - 1239, 2006
【発明の概要】
【発明が解決しようとする課題】
【００１１】
しかしながら、上述のように、近年、ｗｅｂデータの急速な増大などの影響で、扱うべきデータも急速に増大している現状がある。データ量が膨大になる場合には、１キーを保持するのに必要なビット数を１ｂｉｔでも減らすことができれば全体として大きな効果をもたらすことができる。
【００１２】
例えば、キーの数が１０億あるとする。この時に１キーあたりを保持するのに必要なビット数を１減らすと、全体として１０億ｂｉｔ分の削減となる。つまり、１，０００，０００，０００ｂｉｔ  ＝  １Ｇｂｉｔ  ＝  １２５ＭＢ  の削減となる。このように、特にデータ量が大きい場面では、キーあたりの削減で大きな効果が得られる。
【００１３】
また、与えられたキーに非負整数値のユニークなＩＤを付与することを対象とする場合、例えば、各ＵＲＬにＩＤを振り、ＵＲＬを検索キーとしてどこにデータが格納されているか示すＩＤを引くといった使い方をする場合、ＵＲＬが３０億あるデータを持っているとすると、ユニークなＩＤを付与するためには、単純な実装では各ＵＲＬに対して整数の値を割り振るだけで  ３２ｂｉｔ  ×  ３，０００，０００，０００  ／  ８  ＝  １２ＧＢ  もの容量が必要となってしまう。
【００１４】
実際には、これにキーの容量が必要であり、キーの保持はキーの長さに依存するため、全体としてこの倍以上の容量が必要となることが容易に起こる。そうすると、現在の一般的な計算機の主記憶容量が８ＧＢや１６ＧＢと考えると、容易にそれを上回ることになってしまう。
【００１５】
また、仮に、主記憶容量が６４ＧＢや１２８ＧＢ以上が主流になったとしても、高速な検索を実現するためや、ほかのプロセスに影響を及ぼさないためにも、記憶容量の占有を極力減らしたほうがいいのは自明である。
【００１６】
また、値のデータを可変長で記述して容量を減らすといった処理は可能であるが、値の数が３０億もある状況では現実的な処理ではないという問題がある。
【００１７】
本発明では、上記問題点を解決するために成されたものであり、入力された可変長のキーに対して、長さを抑制した固定長のＩＤを付与することができるＩＤ付与装置、方法、及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１８】
上記目的を達成するために、本発明の第１のＩＤ付与装置は、入力された可変長のバイト列からなる複数のキーに基づいて、前記キーの共通する接頭辞部分のバイトを結合して前記複数のキーを表現するトライ木構造を構築するノード追加部と、前記トライ木構造のノードの各々について、前記ノードが前記キー末端のバイトの情報を保持するノードであるか否かを示すビット値を付与したビット配列を作成するフラグ付与部と、前記ビット配列における、前記キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、前記ビット配列における前記ビット値の相対インデックス値を入力として、最小完全ハッシュ関数により、固定長の非負整数値を算出し、前記ノードが末端のバイトの情報を保持する前記キーに対して、ＩＤとして付与する非負整数値ＩＤ付与部と、を含んで構成されている。
【００１９】
本発明の第１のＩＤ付与方法は、ノード追加部と、フラグ付与部と、非負整数値ＩＤ付与部とを含む、ＩＤ付与装置におけるＩＤ付与方法において、前記ノード追加部により、入力された可変長のバイト列からなる複数のキーに基づいて、前記キーの共通する接頭辞部分のバイトを結合して前記複数のキーを表現するトライ木構造を構築し、前記フラグ付与部により、前記トライ木構造のノードの各々について、前記ノードが前記キー末端のバイトの情報を保持するノードであるか否かを示すビット値を付与したビット配列を作成し、前記非負整数値ＩＤ付与部により、前記ビット配列における、前記キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、前記ビット配列における前記ビット値の相対インデックス値を入力として、最小完全ハッシュ関数により、固定長の非負整数値を算出し、前記ノードが末端のバイトの情報を保持する前記キーに対して、ＩＤとして付与する。
【００２０】
第１の発明によれば、入力された可変長のバイトからなる複数のキーに基づいて、トライ木構造を構築し、トライ木のノードの各々について、キー末端のバイトの情報を保持するノードか否かを示すビット値を付与したビット配列を作成する。
【００２１】
そして、ビット配列における、キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、ビット値の相対インデックス値を入力として最小完全ハッシュ関数により、固定長の非負整数値を算出し、ノードが末端のバイトの情報を保持するキーに対してＩＤとして付与する。
【００２２】
このように、複数のキーを表現するトライ木構造を構築し、キーの末端のバイトの情報を保持するノードであるか否かを示すビット値を付与したビット配列を作成し、ビット配列における、キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、ビット値の相対インデックス値を入力として最小完全ハッシュ関数により、固定長の非負整数値を算出し、ノードが末端のバイトの情報を保持するキーに対してＩＤとして付与することにより、入力された可変長のキーに対して、長さを抑制した固定長のＩＤを付与することができる。
【００２３】
本発明の第２のＩＤ付与装置は、入力された可変長のバイト列からなる複数のキーに基づいて、前記キーの共通する接頭辞部分のバイトを結合して前記複数のキーを表現するトライ木構造を構築するノード追加部と、前記トライ木構造のノードの各々について、前記ノードが前記キー末端のバイトの情報を保持するノードであるか否かを示すビット値を付与したビット配列を作成するフラグ付与部と、前記ビット配列における、前記キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、前記ビット配列の先頭から前記ビット値までにおける、前記キーの末端のバイトの情報を保持するノードであることを示すビット値の数をカウントし、カウントされた値を固定長の非負整数値として算出し、前記ノードが末端のバイトの情報を保持する前記キーに対して、ＩＤとして付与する非負整数値ＩＤ付与部と、を含んで構成されている。
【００２４】
本発明の第２のＩＤ付与方法は、ノード追加部と、フラグ付与部と、非負整数値ＩＤ付与部とを含む、ＩＤ付与装置におけるＩＤ付与方法において、前記ノード追加部により、入力された可変長のバイト列からなる複数のキーに基づいて、前記キーの共通する接頭辞部分のバイトを結合して前記複数のキーを表現するトライ木構造を構築し、前記フラグ付与部により、前記トライ木構造のノードの各々について、前記ノードが前記キー末端のバイトの情報を保持するノードであるか否かを示すビット値を付与したビット配列を作成し、前記非負整数値ＩＤ付与部により、前記ビット配列における、前記キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、前記ビット配列の先頭から前記ビット値までにおける、前記キーの末端のバイトの情報を保持するノードであることを示すビット値の数をカウントし、カウントされた値を固定長の非負整数値として算出し、前記ノードが末端のバイトの情報を保持する前記キーに対して、ＩＤとして付与する。
【００２５】
第２の発明によれば、入力された可変長のバイト列からなる複数のキーに基づいて、トライ木構造を構築し、トライ木のノードの各々について、キー末端のバイトの情報を保持するノードか否かを示すビット値を付与したビット配列を作成する。
【００２６】
そして、ビット配列における、キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、ビット配列の先頭からノードのビット値までにおける、キーの末端のバイトの情報を保持するノードであることを示すビット値の数をカウントし、カウントされた値を固定長の非負整数値として算出し、ノードが末端のバイトの情報を保持するキーに対してＩＤとして付与することができる。
【００２７】
このように、複数のキーを表現するトライ木構造を構築し、キーの末端のバイトの情報を保持するノードであるか否かを示すビット値を付与したビット配列を作成し、キーの末端のバイトの情報を保持するノードの各々について、ビット配列の先頭からビット値までにおける、キーの末端のバイトの情報を保持するノードであることを示すビット値の数をカウントし、カウントされた値を固定長の非負整数値として算出し、キーに対してＩＤとして付与することにより、入力された可変長のキーに対して、長さを抑制した固定長のＩＤを付与することができる。
【００２８】
また、本発明のプログラムは、コンピュータを、請求項１又は請求項２に記載の木構造構築装置を構成する各部として機能させるためのプログラムである。
【発明の効果】
【００２９】
以上、説明したように、本発明のＩＤ付与装置、方法、及びプログラムによれば、入力された可変長のキーに対して、長さを抑制した固定長のＩＤを付与することができる。
【図面の簡単な説明】
【００３０】
【図１】本発明の実施の形態のＩＤ付与装置の機能的構成を示すブロック図である。
【図２】単語の集合の例を示す図である。
【図３】物理メモリ上の配列と相対インデックスの関係の例を示す図である。
【図４】各キーを分割する例を示す図である。
【図５】各キーの各バイトをトライ木のノードとして追加する例を示す図である。
【図６】各キーの末端に相当するノードに値を付与するためのフラグをセットする例を示す図である。
【図７】非負整数値ＩＤを付与する例を示す図である。
【図８】本発明の第１の実施の形態のＩＤ付与装置におけるＩＤ付与処理ルーチンの内容を示すフローチャートである。
【図９】本発明の第２の実施の形態のＩＤ付与装置におけるＩＤ付与処理ルーチンの内容を示すフローチャートである。
【図１０】キーと値のペアで表されるデータの例を示す図である。
【発明を実施するための形態】
【００３１】
以下、発明の原理について詳細に説明する。
【００３２】
本発明では、与えられたキーに非負整数値のユニークなＩＤを付与することを対象とする。例えば、各ＵＲＬにＩＤを振り、ＵＲＬを検索キーとしてどこにデータが格納されているかを示すＩＤを引くといった使い方が可能となる。
【００３３】
可変長キーに関しては従来よく用いられるやり方と同様に、トライ木を用いて共通接頭辞を共有して効率的に情報を保持する方法を用いることとする。このとき各キーの末尾にあたるトライ木中の値を保持すべきノードの計算機上の相対アドレスを利用し、各キーに連続した非負整数値のユニークなＩＤを付与する。
【００３４】
本発明では、トライ木中のノードが値をどの程度保持する必要があるかに応じて２つの処理方法を提案する。一つ目の処理方法は、トライ木中のノードの多くが値を持つような状況の時に有効な処理方法であり、各ノード毎に対応する１ｂｉｔを付与したｂｉｔ配列を準備し、そのｂｉｔ配列から、値を持つノードに対するＩＤ（連続した非負整数値）を計算する。
【００３５】
２つ目の処理方法は、逆にトライ木中のノードのほとんどが値を持たないような場合に有効な方法であり、値を持つノードの相対アドレスから完全最小ハッシュを構築し、そのハッシュによって与えられる非負整数値を、値を持つノードのＩＤとする。
【００３６】
最終的に、ノードに与えられたＩＤを、ルートからそのノードまで辿ったときに得られるキーに対するＩＤとする。
【００３７】
以下、図面を参照して本発明の実施の形態を詳細に説明する。本実施の形態では、ｗｅｂ上に出現する単語をキーとして、それらに連続したユニークな非負整数値ＩＤを付与し、その情報をなるべく少ない容量で保持し、かつ、高速に検索可能なデータ構造を構築する処理を行う状況を想定する。これは、実際にあるキーワードなどを入力して、その語に結びつく情報を抽出する際などに必要とされる処理であり、様々な情報処理システムで利用される重要度の高い処理である。この場合、単語は可変長バイト列（可変長文字列）で表されるため、キーの長さは可変となる。また、付与したい非負整数値ＩＤとは、単語がｎ個あったとすると、０からｎ−１までの非負の連続した整数値のことである。つまり、各単語に０からｎ−１の中から一つの値を付与する処理に相当する。
【００３８】
また、本実施の形態では、対象とする問題をより明確化、かつ、簡単化するために、値を０以上の連続した整数値に限定する。これは、実際の値の情報は、通常計算機上のメモリやストレージに格納されているので、値の情報そのものではなくて、値が保持されている計算機上の番地を値として代用することで、値の情報の形式に依存せず単一の方法で実現することができる。
【００３９】
＜ＩＤ付与装置の構成＞
本発明の第１の実施の形態に係るＩＤ付与装置について説明する。図１に示すように、本発明の第１の実施の形態に係るＩＤ付与装置１００は、入力部１０と、後述するＩＤ付与処理ルーチンを実行する演算部２０と、出力部５０と、を備えている。
【００４０】
入力部１０は、キーボードなどの入力装置から、可変長バイト列のキーの集合として、図２に示すような単語の集合を受け付ける。なお、入力部１０は、ネットワーク等を介して外部から入力されたものを受け付けるようにしてもよい。
【００４１】
演算部２０は、ＣＰＵ（Central Processing Unit）と、ＲＡＭ（Random Access Memory）と、後述するＩＤ付与処理ルーチンを実行するためのプログラムを記憶したＲＯＭ（Read Only Memory）とを備えたコンピュータで構成されている。このコンピュータは、機能的には、図１に示すように、トライ木構造構築部３０と、非負整数値ＩＤ付与部３８とを含んだ構成で表すことができる。
【００４２】
トライ木構造構築部３０は、入力部１０において受け付けた可変長文字列である単語の集合に基づいて、共通する接頭辞部分の文字を結合して単語の集合を表現するトライ木構造（または接尾辞木構造）を構築する。トライ木構造は、各キーで共通する接頭辞部分を結合して情報を保持することができることから、同じ接頭辞を多く含むデータ集合ではより効率的にデータを圧縮できる。このトライ木構造構築部３０は、図１に示すように、分割部３２と、ノード追加部３４と、フラグ付与部３６とを含んだ構成で表すことができる。なお、トライ木構造の各ノードが保持する情報は図３に示すように、相対インデックスが付与された物理メモリ上の配列に格納される。
【００４３】
分割部３２は、図４に示すように、入力部１０において受け付けた単語の集合の各単語を１文字単位にそれぞれ分割する。
【００４４】
ノード追加部３４は、図５に示すように、分割部３２において分割された各単語の各文字を保持するノードを、トライ木のノードとして順次追加する。このとき、図５に示すように、順次追加する各々のノードに対して、すでに存在するノードが保持する文字列と接頭辞部分が一致する場合はとくに処理をおこなわない。ただし、まだ未出現の文字列を保持する各ノードであれば新規ノードとして追加して、単語に対応する文字列を保持するノードを有するトライ木を作成する。また、トライ木構造の各ノードが保持する文字情報を、相対インデックスが付与された物理メモリ上の配列に格納する。なお、トライ木構造の作成方法は、従来既知の手法と同様であるため、さらに詳細な説明を省略する。
【００４５】
フラグ付与部３６は、図６に示すように、ノード追加部３４において構築されたトライ木の各単語の末端に相当するノードの各々に値を各々付与するためのフラグをセットする。そのため、フラグ付与部３６においては、ノード追加部３４において作成されたトライ木の各ノード毎に、各ノードの文字情報が格納されている物理メモリ上の配列の相対インデックスが付与され、かつ、各ノードに対して１ｂｉｔを割り当てたｂｉｔ配列を作成する。これは、トライ木中のノード数がｍとすると、ｍｂｉｔの長さの配列となる。各ノードへ割り当てられる１ｂｉｔの位置は、物理メモリ上のノードの文字情報の格納位置の相対位置と同じ位置とする。あるノードが、ある単語の末尾の文字を保持するノードに相当する場合は、その単語に対応する値を付与する必要があるので、ｂｉｔ配列において、値を持つことを意味する１を付与し、何れの単語の末尾の文字を保持しないノードである場合は、値を付与する必要がないので、ｂｉｔ配列において、値を持たないことを意味する０を付与する。キー検索時には、ｂｉｔ配列において、ノードの文字情報の格納位置の相対位置を示す相対インデックスの番号と同一位置のｂｉｔ位置を見ることで、そのノードが値を持つかどうかを容易に判定することができる。
【００４６】
非負整数値ＩＤ付与部３８は、図７に示すように、トライ木構造構築部３０において構築されたトライ木構造及びｂｉｔ配列に基づいて、連続した固定長の非負整数値ＩＤを算出し、単語の集合の各単語に対して、連続した固定長の非負整数値ＩＤを付与するように、各単語の末尾の文字を保持するノードの各々に、算出された非負整数値ＩＤを対応づける。
【００４７】
上述のとおり、フラグ付与部３６において、各ノード毎に１ｂｉｔを割り当てたｂｉｔ配列が作成され、ｂｉｔ配列では、ある単語の末尾の文字を保持するノードに対して１が付与され、そうでないノードに対して０が付与されている。
【００４８】
このｂｉｔ配列を利用して、ノードに付与する値を決定する。ｂｉｔ値１が付与されたｂｉｔ配列のｂｉｔ位置各々について、フラグ付与部３６において作成したノードが値を持つか否かを示すｂｉｔ配列の先頭から、当該ｂｉｔ位置までの範囲で、１が出現した数を数えてその数をそのまま非負整数値ＩＤとして付与する。この計算は、下記（１）式で示すような、簡潔データ構造（succinct data structure）で使われるｒａｎｋ関数の計算と等価である。よって、簡潔データ構造で使われている技術をそのまま利用することができる。
【００４９】
【数１】
0005521064.tif 000002
【００５０】
上記（１）式の関数は、インデックス０からｉ番目までの１の数を数え上げるということを意味する。つまり、インデックスｉのｂｉｔ値が１であることが確定している場合は、ｒａｎｋｑ＝１（ｉ）は、０からｎ−１までの連続した非負整数値のいずれかの値に必ずなり、重複することはないことが保証できる。ここで、ｎは単語の集合における単語の数である。つまり、ノードが値を持つかどうかを示すｂｉｔ配列があれば、同時にそのノードに対する非負整数値ＩＤも表していることになる。
【００５１】
ただし、単純なｂｉｔ配列だけでは、検索時にｒａｎｋを効率的に計算するのは難しい。そこで、フラグ付与部３６は、実際によく用いられる処理方法として、任意固定長のブロック毎に、１の数を事前に計算しておき値を保持するようにしてもよい。これにより、直近の保持された値とそこからのｒａｎｋ計算で実際にほしいｒａｎｋ計算が可能となり、より高速に計算することができる。
【００５２】
固定長ブロックの長さｃに関しては、例えばｃ＝２５６等とする。この場合、事前に計算した値を保持するのに３２ｂｉｔ必要だと仮定すると、前述のようにｂｉｔ配列のｂｉｔ数（あるいはノード数）をｍとするとｍ／２５６×３２＝ｍ／８ｂｉｔの容量が必要となる。また、よくある実装方法としては、２５６ｂｉｔのブロックを更に３２ｂｉｔ毎に分割し、値を計算したものを８ｂｉｔの容量に記憶する手続きをとる。これにより、最終的には３２ｂｉｔのｂｉｔ列に対してｒａｎｋ計算をし、それに対象ブロックの値を加算したものを非負整数値ＩＤとして使えば良い。最終的に、２つの事前に計算した値を記憶するのに３ｍ／８ｂｉｔの追加の容量が必要となる。
【００５３】
出力部５０は、トライ木構造構築部３０において構築されたトライ木構造及びｂｉｔ配列と、非負整数値ＩＤ付与部３８において各単語の末尾のノードに対応付けられた非負整数値ＩＤとを出力する。
【００５４】
出力されたトライ木構造及び非負整数値ＩＤを用いることにより、可変長文字列である単語に対して、固定長の非負整数値ＩＤを付与することができる。具体的には、上記の単語の集合に含まれる１つの単語が入力され、当該単語の各文字に沿って、トライ木構造のノードを辿って、末尾の文字を保持するノードに対応付けられた固定長の非負整数値ＩＤを取得することにより、入力された単語に対して付与された固定長の非負整数値ＩＤを得ることができる。
【００５５】
＜ＩＤ付与装置の作用＞
次に、本発明の第１の実施の形態に係るＩＤ付与装置１００の作用について説明する。まず、入力部１０により、可変長文字列である単語の集合が入力されると、ＩＤ付与装置１００のＲＯＭに記憶されたプログラムを、ＣＰＵが実行することにより、図８に示すＩＤ付与処理ルーチンが実行される。
【００５６】
次に、ステップＳ１００において、トライ木構造が表現する対象となる単語の集合を受け付ける。
【００５７】
次に、ステップＳ１０２において、ステップＳ１００において受け付けた単語の集合の各単語を１文字単位にそれぞれ分割する。
【００５８】
次に、ステップＳ１０４において、ステップＳ１０２において分割された各単語の各文字を保持するノードを、トライ木のノードとして順次追加し、トライ木構造を構築する。
【００５９】
次に、ステップＳ１０６において、ステップＳ１０４において構築されたトライ木構造の各ノード毎に１ｂｉｔを割り振ったｂｉｔ配列を作成し、ステップＳ１００において受け付けた単語の集合の各単語の末尾の文字を保持するノードに対応するｂｉｔ配列のｂｉｔ位置に、値を持つことを意味する１を付与し、何れの単語の末尾の文字を保持しないノードに対応するｂｉｔ配列のｂｉｔ位置には、値を持たないことを意味する０を付与する。
【００６０】
次に、ステップＳ１０８において、１が付与されたｂｉｔ位置の各々について、ステップＳ１０６において作成されたｂｉｔ配列の先頭から当該ｂｉｔ位置までの範囲で、ｂｉｔ値１が出現した数を数えて固定長の非負整数値ＩＤを算出し、固定長の非負整数値ＩＤを各単語に対して付与するように、各単語の末尾の文字を保持するノードに対応づける。
【００６１】
次に、ステップＳ１１０において、ステップＳ１０６において作成されたトライ木構造及びｂｉｔ配列と、ステップＳ１０８においてノードに対応付けられた固定長の非負整数値ＩＤとを出力して処理を終了する。
【００６２】
以上、説明したように、本発明の第１の実施の形態に係るＩＤ付与装置によれば、単語の集合を表現するトライ木構造を構築し、単語の末尾の文字を保持するノードであるか否かを示すビット値を付与したビット配列を作成し、単語の末尾の文字を保持するノードの各々について、ビット配列の先頭から当該ノードのビット位置までにおける、ビット値１の数をカウントして固定長の非負整数値を算出し、単語に対してＩＤとして付与することにより、入力された可変長の文字列である単語に対して、長さを抑制した固定長の非負整数値ＩＤを付与することができる。
【００６３】
次に、第２の実施の形態について説明する。なお、第１の実施の形態と同様の構成となる部分については、同一符号を付して説明を省略する。
【００６４】
第２の実施の形態では、ｂｉｔ配列において１が付与されているｂｉｔ位置を示す相対インデックスの番号を入力として、最小完全ハッシュ関数により、固定長の非負整数値ＩＤを算出し、当該ｂｉｔ位置に対応する単語に付与する点が第１の実施の形態と異なっている。
【００６５】
＜ＩＤ付与装置の構成＞
非負整数値ＩＤ付与部３８は、ｂｉｔ配列においてｂｉｔ値１が付与されているｂｉｔ位置の各々の相対インデックスに基づいて最小完全ハッシュ関数を構築する。なお、最小完全ハッシュ関数の構築方法については、従来既知の手法を用いればよいため、説明を省略する。
【００６６】
また、非負整数値ＩＤ付与部３８は、図７に示すように、トライ木構造構築部３０において構築されたトライ木構造及びｂｉｔ配列に基づいて、最小完全ハッシュ関数を用いて、連続した固定長の非負整数値ＩＤを算出し、単語の集合の各単語に対して連続した固定長の非負整数値ＩＤを付与するように、各単語の末尾の文字を保持するノードに、固定長の非負整数値ＩＤを対応づける。
【００６７】
上述のとおり、フラグ付与部３６において、各ノード毎に１ｂｉｔを割り当てたｂｉｔ配列が作成され、ｂｉｔ配列では、ある単語の末尾の文字を保持するノードに対して１が付与され、そうでないノードに対して０が付与されている。
【００６８】
非負整数値ＩＤ付与部３８は、ｂｉｔ配列において１が付与されているｂｉｔ位置の各々について、当該ｂｉｔ位置の相対インデックス（すなわち、当該ｂｉｔ位置に対応するノードが保持する文字情報を格納した物理メモリ上の配列の相対インデックス）の値を入力として、最小完全ハッシュ関数に基づいて、連続した固定長の非負整数値ＩＤを算出し、当該ｂｉｔ位置に対応するノードが末尾の文字を保持する単語に対して付与するように、各単語の末尾の文字を保持するノードに、付与された固定長の非負整数値ＩＤを対応づける。
【００６９】
＜ＩＤ付与装置の作用＞
次に、本発明の第２の実施の形態に係るＩＤ付与装置１００の作用について説明する。なお、第１の実施の形態と同様の処理については、同一符号を付して詳細な説明を省略する。
【００７０】
まず、入力部１０により、可変長文字列である単語の集合が入力されると、ＩＤ付与装置１００のＲＯＭに記憶されたプログラムを、ＣＰＵが実行することにより、図９に示すＩＤ付与処理ルーチンが実行される。
【００７１】
次に、ステップＳ１００において、トライ木構造が表現する対象となる単語の集合を受け付ける。
【００７２】
次に、ステップＳ１０２において、ステップＳ１００において受け付けた単語の集合の各単語を１文字単位にそれぞれ分割する。
【００７３】
次に、ステップＳ１０４において、ステップＳ１０２において分割された各単語の各文字を保持するノードを、トライ木のノードとして順次追加し、トライ木構造を構築する。
【００７４】
次に、ステップＳ１０６において、ステップＳ１０４において構築されたトライ木構造の各ノード毎に１ｂｉｔを割り当てたｂｉｔ配列を作成し、ステップＳ１００において受け付けた単語の集合の各単語の末尾の文字を保持するノードに対応するｂｉｔ配列のｂｉｔ位置に、値を持つことを意味する１を付与し、何れの単語の末尾の文字を保持しないノードに対応するｂｉｔ配列のｂｉｔ位置には、値を持たないことを意味する０を付与する。
【００７５】
次に、ステップＳ１０７において、ステップＳ１０６において１が付与されたｂｉｔ位置の各々の相対インデックスに基づいて最小完全ハッシュ関数を構築する。
【００７６】
次に、ステップＳ１０８において、１が付与されたｂｉｔ位置の各々の相対インデックスについて、ステップＳ１０７において構築された最小完全ハッシュ関数を用いて、連続した固定長の非負整数値ＩＤを算出し、固定長の非負整数値ＩＤを各単語に対して付与するように、各単語の末尾の文字を保持するノードに対応づける。
【００７７】
次に、ステップＳ１１０において、ステップＳ１０６において作成されたトライ木と、ｂｉｔ配列と、ステップＳ１０８においてノードに対応付けられた固定長の非負整数値ＩＤとを出力して処理を終了する。
【００７８】
以上、説明したように、本発明の第２の実施の形態に係るＩＤ付与装置によれば、単語の集合を表現するトライ木構造を構築し、単語の末尾の文字を保持するノードであるか否かを示すビット値を付与したビット配列を作成し、単語の末尾の文字を保持するノードの各々について、ビット配列におけるノードに対応する相対インデックス値を入力として最小完全ハッシュ関数により、固定長の非負整数値を算出し、単語に対してＩＤとして付与することにより、入力された可変長の文字列である単語に対して、長さを抑制した固定長のＩＤを付与することができる。
【００７９】
第２の実施の形態に係るＩＤ付与装置において、例えば、非特許文献（非特許文献５：Botelho, F.C., Pagh, R. and Ziviani, N. Simple and Space-Efficient Minimal Perfect Hash Functions. 10th International Workshop on Algorithms and Data Structures (WADS07), pp. 139-150, August 2007.）において用いられている最小完全ハッシュ関数の構築手順を利用すると、各単語毎に２．６ｂｉｔ程度でＩＤ情報を保持することができる。よって、値を保持しているノード数をｂとしたときに、単純計算で７ｂ＜ｍであれば、第１の実施の形態で説明したｒａｎｋ関数を用いるよりも最小完全ハッシュ関数を利用するほうが効率的である。ただし、実際の実装では、最小完全ハッシュ関数を構築するのに、４ｂｂｉｔ程度の容量を必要とする。よって、おおよそ１０．７ｂ＜ｍであれば、第２の実施の形態におけるＩＤ付与装置を用いたほうがトライ木の値を保持する容量を抑えることができる。そのため、トライ木のノード数に対して値を持つノードの割合が大きい場合には第１の実施の形態に係るＩＤ付与装置の方が効率的にトライ木の値を保持する容量を抑えることができ、ノード数に対して値を持つノードの割合が小さい場合には第２の実施の形態に係るＩＤ付与装置の方が効率的にトライ木の値を保持する容量を抑えることができる。
【００８０】
第１及び第２の実施の形態に係るＩＤ付与装置を用いることにより、トライ木の値を保持する容量を抑えることができる。上述の通り、第１の実施の形態に係る非負整数値ＩＤ付与部３８においては、トライ木中のノード数ｍに対して、おおよそ３ｍ／８ｂｉｔで値を表現でき、第２の実施の形態に係る非負整数値ＩＤ付与部３８においては、値を持つノードの数ｂに対して約４ｂｂｉｔ程度の容量で値を表現することができる。
【００８１】
単純な実装では、単語数がｎ個であれば、一つの値を保持するのに３２ｂｉｔ使うと仮定すると、３２ｎｂｉｔの容量が必要となる。通常、ｂ＝ｎであるため、第２の実施の形態に係る非負整数値ＩＤ付与部３８を用いれば約８分の１程度の容量となる。また、第１の実施の形態に係る非負整数値ＩＤ付与部３８における処理においては、効率的に使う条件が、多くのノードが値を持つ場合なので、ｎとｍが非常に近い値ということになるため、おおよそ８５分の１程度の容量となる。
【００８２】
ただし、単語数が非常に小さい場合(例えばｎ＜２５６)は、単純な実装でも１単語あたり８ｂｉｔで記述できるため、上記の実施の形態で説明した手法の効果は小さくなり、逆に、単語数が大きくなれば、それだけ効果が大きくなる。
【００８３】
また、本実施の形態において出力されたトライ木構造と、各単語の末尾の文字を保持するノードに対応付けられた非負整数値ＩＤとを用いることで、可変長文字列である単語と、その単語に対応する値がペアになったデータが大量に存在するとき、それらを効率的に保持し、かつ、高速に単語に対応する値を検索することができ、情報検索、検索インデックス作成、キーバリューストアといった技術に利用することができる。
【００８４】
また、複数の単語をトライ木構造として表現することにより、単語の集合を圧縮して効率的に保持することができる。
【００８５】
なお、本発明は、上記の実施の形態に限定されるものではなく、この発明の要旨を逸脱しない範囲内で様々な変形や応用が可能である。
【００８６】
上記の実施の形態では、文字列からなる単語をキーとして入力しているが、これに限定されるものではなく、文字列以外の可変長バイト列をキーとして入力してもよい。この場合には、バイト列をバイト単位に分割し、各バイトを保持する各ノードを追加するようにトライ木構造を構築するようにすればよい。
【００８７】
また、上記の実施の形態では、トライ木構造の各ノードが保持する情報が１文字または１バイトで説明されているがこれに限定されるものではなく、各ノードが２つ以上の文字またはバイトを情報として保持するようにトライ木構造を構築してもよい。
【００８８】
上述のＩＤ付与装置１００は内部にコンピュータシステムを有しているが、「コンピュータシステム」は、ＷＷＷシステムを利用している場合であれば、ホームページ提供環境（あるいは表示環境）を含むものとする。
【００８９】
また、本願明細書中において、プログラムが予めインストールされている実施形態として説明したが、当該プログラムを、コンピュータ読み取り可能な記録媒体に格納して提供することも可能であるし、ネットワークを介して提供することも可能である。また、本実施の形態のＩＤ付与装置１００の各部をハードウエアにより構成してもよい。
【符号の説明】
【００９０】
１０   入力部
２０   演算部
３０   トライ木構造構築部
３２   分割部
３４   ノード追加部
３６   フラグ付与部
３８   非負整数値ＩＤ付与部
５０   出力部
１００ ＩＤ付与装置
【要約】
【課題】入力された可変長のキーに対して長さを抑制した固定長のＩＤを付与する。
【解決手段】ノード追加部３４により、入力された可変長のバイト列からなる複数のキーに基づいて、キーの共通する接頭辞部分のバイトを結合して複数のキーを表現するトライ木構造を構築し、フラグ付与部３６により、トライ木構造のノードの各々について、ノードがキー末端のバイトの情報を保持するノードであるか否かを示すビット値を付与したビット配列を作成し、非負整数値ＩＤ付与部３８により、ビット配列における、キーの末端のバイトの情報を保持するノードであることを示すビット値各々について、ビット配列におけるビット値の相対インデックス値を入力として、最小完全ハッシュ関数により、固定長の非負整数値を算出し、ノードが末端のバイトの情報を保持するキーに対して、ＩＤとして付与する。
【選択図】図１【図１】
0005521064.tif 000003
【図２】
0005521064.tif 000004
【図３】
0005521064.tif 000005
【図４】
0005521064.tif 000006
【図５】
0005521064.tif 000007
【図６】
0005521064.tif 000008
【図７】
0005521064.tif 000009
【図８】
0005521064.tif 000010
【図９】
0005521064.tif 000011
【図１０】
0005521064.tif 000012