(57)【要約】【課題】キーを複数のブロックに分類するとき、キーの値の範囲に重複のない分類手法と分類されたキーを分配する手法を、カップルドノードツリーの技術を応用して提供する。【解決手段】分類対象のキーを記憶するキー記憶手段からキーを順次分類キーとして選択し、分類キーによりカップルドノードツリーを応用した分類ツリーを生成し、そのリーフノードをそれぞれＮ個のブロックに分類されるキーと対応付けることにより分類する。分類ツリーの段数は、ブロックの個数Ｎに応じて制限される。分類ツリーからリーフノードを取り出し、対応付けられたキーを分類済みキーとして取り出して分配する。【選択図】図３
2011095849.tif 000002
【特許請求の範囲】
【請求項１】
ビット列からなる分類対象のキーを分類キーとして選択し、該分類キーの値に基づいて複数のブロックに分類するビット列キー分類装置において、
前記分類対象のキーを記憶するキー記憶手段と、
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるツリーであって、前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが１つのときは前記リーフノード、ツリーのノードが２つ以上のときは前記ブランチノードであり、前記ブランチノードは、前記分類キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは前記キー記憶手段に記憶されている前記分類キーの位置情報を取得するために用いるキーアクセス情報を含み、
前記ツリーの任意のノードを検索開始ノードとし、前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の前記分類キーのビット値に応じてリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたキーアクセス情報を、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記分類キーによる検索結果とするように構成された分類ツリーを生成する分類ツリー生成手段と、
前記分類対象のキーを分類する複数のブロックの数に応じた前記分類ツリーの最大段数を取得する分類ツリー最大段数取得手段と、
を備え、
前記分類ツリー生成手段は、
前記キー記憶手段から１つのキーを分類キーとして選択して該分類キーの位置情報を取得し、該取得した分類キーの位置情報を取得するために用いる前記キーアクセス情報を含むリーフノードをルートノードとする前記分類ツリーを生成するとともに、前記キーアクセス情報を用いて前記キーの位置情報を取得するための情報を格納するキー位置検索表を生成するルートノード生成手段と、
前記キー記憶手段からさらに順次分類対象のキーを分類キーとして選択して該分類キーの位置情報を取得し、前記分類ツリー最大段数取得手段で取得した分類ツリーの最大段数の範囲で、該取得した分類キーの位置情報を取得するために用いる前記キーアクセス情報を含むリーフノードを前記分類ツリーに挿入するとともに、前記キーアクセス情報を用いて前記分類キーの位置情報を取得するための情報を格納するキー位置検索表を生成するか、あるいは、既存のリーフノードに含まれるキーアクセス情報を用いて分類キーの位置情報を取得する情報を格納するキー位置検索表に、該既存のリーフノードに含まれるキーアクセス情報を用いて前記分類キーとして選択された分類対象のキーの位置情報を取得する情報を追加する分類キー挿入手段と、を含み、
前記分類対象のキーの全てを前記分類キーとして選択して前記分類ツリーを生成するとともに、該分類ツリーの各リーフノードに含まれるキーアクセス情報を用いて前記分類キーの位置情報を取得する情報を格納する前記キー位置検索表を生成することにより、前記分類対象のキーの全てを、前記各リーフノードに対応する複数のブロックに分類することを特徴とするビット列キー分類装置。
【請求項２】
請求項１記載のビット列キー分類装置において、
前記キー位置検索表は、前記複数のブロックに対応するエントリを有するキー分類表と、前記分類対象のキーに対応するエントリを有するキーリンク表から構成され、
前記キー分類表のエントリは、前記キーリンク表のエントリを指すキー管理ポインタが格納される領域である先頭リンクと末尾リンクを含み、
前記キーリンク表のエントリは、前記対応する分類対象のキーが記憶された前記キー記憶手段の位置情報を指すキー参照ポインタを格納する領域と、前記キー管理ポインタを格納する領域であるリンクを含むものであり、
前記キーアクセス情報は、前記キー分類表のエントリを指す分類参照ポインタであることを特徴とするビット列キー分類装置。
【請求項３】
請求項２記載のビット列キー分類装置において、
前記キー分類表のエントリは、さらに、前記対応するブロックに分類されているキーの最小値を格納する領域である最小値キーと前記対応するブロックに分類されているキーの最大値を格納する領域である最大値キーを含み、
前記ルートノード生成手段は、前記キー記憶手段から１つのキーを分類キーとして選択して読出し、該分類キーの位置情報を取得するとともに、前記キー分類表の空エントリを指す分類参照ポインタを取得し、該分類参照ポインタ含むリーフノードをルートノードとする前記分類ツリーを生成し、さらに、前記キーリンク表の空エントリを指すキー管理ポインタを取得し、該キー管理ポインタを前記取得したキー分類表のエントリの前記先頭リンクと前記末尾リンクに格納し、前記最小値キーと最大値キーに前記読み出した分類キーを格納するとともに、前記取得した位置情報を前記取得したキーリンク表のエントリのキー参照ポインタに格納するものであり、
前記分類キー挿入手段は、前記キー記憶手段からさらに順次分類対象のキーを分類キーとして選択して読み出し、該分類キーの位置情報を取得するとともに、前記ルートノードを検索開始ノードとして前記分類キーによる検索結果である分類参照ポインタを求める検索手段と、
前記キーリンク表の空エントリを指すキー管理ポインタを取得し、該キー管理ポインタの指すキーリンク表のキー参照ポインタに前記検索手段が取得した位置情報を格納するとともに、前記分類参照ポインタの指す前記キー分類表のエントリの末尾リンクの指すキーリンク表のリンクに、前記キー管理ポインタを格納することにより、前記分類参照ポインタを用いて分類キーの位置情報を取得するための情報を前記キー分類表とキーリンク表に追加する第１の分類キー連結手段と
前記キーリンク表の空エントリを指すキー管理ポインタを取得し、該キー管理ポインタの指すキーリンク表のキー参照ポインタに前記検索手段が取得した位置情報を格納するとともに、前記分類参照ポインタの指す前記キー分類表のエントリの末尾リンクの指すキーリンク表のリンクに、前記キー管理ポインタを格納することにより、前記分類参照ポインタを用いて分類キーの位置情報を取得するための情報を前記キー分類表とキーリンク表に追加するとともに、前記分類キーが該分類参照ポインタの指すキー分類表の最小値キーより小さければ、該最小値キーに該分類キーを書き込み、一方、前記分類キーが前記分類参照ポインタの指すキー分類表の最大値キーより大きければ、該最大値キーに該分類キーを書き込む第２の分類キー連結手段と、
前記検索手段が求めた分類参照ポインタの指す前記キー分類表のエントリの最小値キーあるいは最大値キーの一方を検索結果キーとし、該検索結果キーと前記分類キーの間でビット列比較を行い、該ビット列比較で異なるビット値となる先頭のビット位置である差分ビット位置を求め、前記検索手段が前記分類参照ポインタを求めたときのリンク経路のブランチノードの弁別ビット位置と前記差分ビット位置との相対的位置関係により、前記分類キーの位置情報を取得するために用いる分類参照ポインタを含むリーフノードと該リーフノードと対をなすノードからなるノード対を前記分類ツリーに挿入したときに該ノード対のリンク元となるノードの位置情報を該ノード対の挿入位置として決定するノード対挿入位置決定手段と、
前記分類キーの位置情報を取得するために用いる分類参照ポインタを含むリーフノードと対をなすノードの内容を、前記挿入位置のノードの内容とし、該挿入位置のノードのノード種別にはブランチノードを示すものを書き込み、弁別ビット位置には前記差分ビット位置を書き込み、代表ノード番号には、前記ノード対挿入位置決定手段で挿入位置を求めたノード対の代表ノードの位置情報を書き込むことで該ノード対を挿入するノード対挿入手段と、
前記ノード対挿入位置決定手段が決定したノード対の挿入位置に該ノード対を挿入したときに、該挿入位置のノードより下位のリーフノードの段数が前記最大段数を越さないかチェックを行い、前記最大段数を超すリーフノードがあれば、そのリーフノードを含むノード対の直近上位のノードである親ノードをリーフノードとし、前記ノード対を構成するリーフノードそれぞれの分類参照ポインタと、該分類参照ポインタの指す前記キー分類表のデータに基づいて、前記リーフノードとした親ノードの分類参照ポインタを決定するとともに、該分類参照ポインタの指すキー分類表のデータとキーリンク表のデータを更新し、前記ノード対を削除することを、前記挿入位置のノードより下位の全てのリーフノードに対して行うことにより、ノード対を挿入しても前記最大段数を超えないことを保証する処理を行うノード対連結手段と、を含み、
前記読み出された分類キーの値が、前記検索手段が求めた分類参照ポインタの指す前記キー分類表のエントリの最小値キーの値と最大値キーの値の間の範囲のものである場合に、
前記第１の分類キー連結手段が、前記分類参照ポインタを用いて分類キーの位置情報を取得するための情報を前記キー分類表とキーリンク表に追加し、
前記読み出された分類キーの値が、前記検索手段が求めた分類参照ポインタの指す前記キー分類表のエントリの最小値キーの値と最大値キーの値の間の範囲外のものである場合に、
前記ノード対挿入位置決定手段が、前記ノード対のリンク元となるノードの位置情報を該ノード対の挿入位置として決定し、
該決定された挿入位置のノードがリーフノードであって、該リーフノードの段数が前記最大段数のとき、前記第２の分類キー連結手段が、前記分類参照ポインタを用いて分類キーの位置情報を取得するための情報を前記キー分類表とキーリンク表に追加するとともに、前記分類キーが該分類参照ポインタの指すキー分類表の最小値キーより小さければ、該最小値キーに該分類キーを書き込み、一方、前記分類キーが前記分類参照ポインタの指すキー分類表の最大値キーより大きければ、該最大値キーに該分類キーを書き込み、
前記決定された挿入位置のノードがリーフノードであって、該リーフノードの段数が前記最大段数ではないとき、前記ノード対挿入手段が前記ノード対を挿入し、
前記ノード対挿入位置決定手段が決定した挿入位置のノードがブランチノードのとき、前記ノード対連結手段が前記ノード対を挿入しても前記最大段数を超えないことを保証する処理を行い、前記ノード対挿入手段が前記ノード対を挿入する、
ことを特徴とするビット列キー分類装置。
【請求項４】
請求項３記載のビット列キー分類装置において、前記分類ツリーは配列に配置され、前記代表ノードの位置を示す位置情報は、該代表ノードが配置された前記配列の配列要素の配列番号であることを特徴とするビット列キー分類装置。
【請求項５】
請求項１記載のビット列キー分類装置により複数のブロックに分類されたキーをブロック毎に取り出して出力するビット列キー分配装置において、
前記分類ツリーから順次リーフノードを取り出すリーフノード取り出し手段と、
該取り出したリーフノードから、前記キーアクセス情報を読み出し、該キーアクセス情報を用いて前記キー位置検索表からキーの位置情報を取り出し、該キーの位置情報に基づいて該キーを前記キー記憶手段から読み出して出力先に出力する分類キー出力手段と、
を備えることを特徴とするビット列キー分配装置。
【請求項６】
請求項５記載のビット列キー分配装置において、
前記キー位置検索表は、前記複数のブロックに対応するエントリを有するキー分類表と、前記分類対象のキーに対応するエントリを有するキーリンク表から構成され、
前記キー分類表のエントリは、前記キーリンク表のエントリを指すキー管理ポインタが格納される領域である先頭リンクと末尾リンクを含み、
前記キーリンク表のエントリは、前記対応する分類対象のキーが記憶された前記キー記憶手段の位置情報を指すキー参照ポインタを格納する領域と、前記キー管理ポインタを格納する領域であるリンクを含むものであり、
前記キーアクセス情報は、前記キー分類表のエントリを指す分類参照ポインタであることを特徴とするビット列キー分配装置。
【請求項７】
請求項６記載のビット列キー分配装置において、前記分類ツリーは配列に配置され、前記代表ノードの位置を示す位置情報は、該代表ノードが配置された前記配列の配列要素の配列番号であることを特徴とするビット列キー分配装置。
【請求項８】
分類対象のキーを記憶するキー記憶手段を備えたビット列分類装置が、ビット列からなる分類対象のキーを分類キーとして選択し、該分類キーの値に基づいて複数のブロックに分類するビット列キー分類方法において、
前記分類対象のキーを分類する複数のブロックの数に応じた後記分類ツリーの最大段数を取得する分類ツリー最大段数取得ステップと、
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるツリーであって、前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが１つのときは前記リーフノード、ツリーのノードが２つ以上のときは前記ブランチノードであり、前記ブランチノードは、前記分類キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは前記キー記憶手段に記憶されている前記分類キーの位置情報を取得するために用いるキーアクセス情報を含み、
前記ツリーの任意のノードを検索開始ノードとし、前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の前記分類キーのビット値に応じてリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたキーアクセス情報を、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記分類キーによる検索結果とするように構成された分類ツリーを生成する分類ツリー生成ステップと、
を備え、
前記分類ツリー生成ステップは、
前記キー記憶手段から１つのキーを分類キーとして選択して該分類キーの位置情報を取得し、該取得した分類キーの位置情報を取得するために用いる前記キーアクセス情報を含むリーフノードをルートノードとする前記分類ツリーを生成するとともに、前記キーアクセス情報を用いて前記キーの位置情報を取得するための情報を格納するキー位置検索表を生成するルートノード生成ステップと、
前記キー記憶手段からさらに順次分類対象のキーを分類キーとして選択して該分類キーの位置情報を取得し、前記分類ツリー最大段数取得手段で取得した分類ツリーの最大段数の範囲で、該取得した分類キーの位置情報を取得するために用いる前記キーアクセス情報を含むリーフノードを前記分類ツリーに挿入するとともに、前記キーアクセス情報を用いて前記分類キーの位置情報を取得するための情報を格納するキー位置検索表を生成するか、あるいは、既存のリーフノードに含まれるキーアクセス情報を用いて分類キーの位置情報を取得する情報を格納するキー位置検索表に、該既存のリーフノードに含まれるキーアクセス情報を用いて前記分類キーとして選択された分類対象のキーの位置情報を取得する情報を追加する分類キー挿入ステップと、を含み、
前記分類対象のキーの全てを前記分類キーとして選択して前記分類ツリーを生成するとともに、該分類ツリーの各リーフノードに含まれるキーアクセス情報を用いて前記分類キーの位置情報を取得する情報を格納する前記キー位置検索表を生成することにより、前記分類対象のキーの全てを、前記各リーフノードに対応する複数のブロックに分類することを特徴とするビット列キー分類方法。
【請求項９】
請求項８記載のビット列キー分類方法において、
前記キー位置検索表は、前記複数のブロックに対応するエントリを有するキー分類表と、前記分類対象のキーに対応するエントリを有するキーリンク表から構成され、
前記キー分類表のエントリは、前記キーリンク表のエントリを指すキー管理ポインタが格納される領域である先頭リンクと末尾リンクを含み、
前記キーリンク表のエントリは、前記対応する分類対象のキーが記憶された前記キー記憶手段の位置情報を指すキー参照ポインタを格納する領域と、前記キー管理ポインタを格納する領域であるリンクを含むものであり、
前記キーアクセス情報は、前記キー分類表のエントリを指す分類参照ポインタであることを特徴とするビット列キー分類方法。
【請求項１０】
請求項９記載のビット列キー分類方法において、
前記キー分類表のエントリは、さらに、前記対応するブロックに分類されているキーの最小値を格納する領域である最小値キーと前記対応するブロックに分類されているキーの最大値を格納する領域である最大値キーを含み、
前記ルートノード生成ステップは、前記キー記憶手段から１つのキーを分類キーとして選択して読出し、該分類キーの位置情報を取得するとともに、前記キー分類表の空エントリを指す分類参照ポインタを取得し、該分類参照ポインタ含むリーフノードをルートノードとする前記分類ツリーを生成し、さらに、前記キーリンク表の空エントリを指すキー管理ポインタを取得し、該キー管理ポインタを前記取得したキー分類表のエントリの前記先頭リンクと前記末尾リンクに格納し、前記最小値キーと最大値キーに前記読み出した分類キーを格納するとともに、前記取得した位置情報を前記取得したキーリンク表のエントリのキー参照ポインタに格納するものであり、
前記分類キー挿入ステップは、前記キー記憶手段からさらに順次分類対象のキーを分類キーとして選択して読み出し、該分類キーの位置情報を取得するとともに、前記ルートノードを検索開始ノードとして前記分類キーによる検索結果である分類参照ポインタを求める検索ステップと、
前記キーリンク表の空エントリを指すキー管理ポインタを取得し、該キー管理ポインタの指すキーリンク表のキー参照ポインタに前記検索ステップにおいて取得した位置情報を格納するとともに、前記分類参照ポインタの指す前記キー分類表のエントリの末尾リンクの指すキーリンク表のリンクに、前記キー管理ポインタを格納することにより、前記分類参照ポインタを用いて分類キーの位置情報を取得するための情報を前記キー分類表とキーリンク表に追加する第１の分類キー連結ステップと
前記キーリンク表の空エントリを指すキー管理ポインタを取得し、該キー管理ポインタの指すキーリンク表のキー参照ポインタに前記検索ステップにおいて取得した位置情報を格納するとともに、前記分類参照ポインタの指す前記キー分類表のエントリの末尾リンクの指すキーリンク表のリンクに、前記キー管理ポインタを格納することにより、前記分類参照ポインタを用いて分類キーの位置情報を取得するための情報を前記キー分類表とキーリンク表に追加するとともに、前記分類キーが該分類参照ポインタの指すキー分類表の最小値キーより小さければ、該最小値キーに該分類キーを書き込み、一方、前記分類キーが前記分類参照ポインタの指すキー分類表の最大値キーより大きければ、該最大値キーに該分類キーを書き込む第２の分類キー連結ステップと、
前記検索手段ステップにおいて求めた分類参照ポインタの指す前記キー分類表のエントリの最小値キーあるいは最大値キーの一方を検索結果キーとし、該検索結果キーと前記分類キーの間でビット列比較を行い、該ビット列比較で異なるビット値となる先頭のビット位置である差分ビット位置を求め、前記検索ステップにおいて前記分類参照ポインタを求めたときのリンク経路のブランチノードの弁別ビット位置と前記差分ビット位置との相対的位置関係により、前記分類キーの位置情報を取得するために用いる分類参照ポインタを含むリーフノードと該リーフノードと対をなすノードからなるノード対を前記分類ツリーに挿入したときに該ノード対のリンク元となるノードの位置情報を該ノード対の挿入位置として決定するノード対挿入位置決定ステップと、
前記分類キーの位置情報を取得するために用いる分類参照ポインタを含むリーフノードと対をなすノードの内容を、前記挿入位置のノードの内容とし、該挿入位置のノードのノード種別にはブランチノードを示すものを書き込み、弁別ビット位置には前記差分ビット位置を書き込み、代表ノード番号には、前記ノード対挿入位置決定ステップにおいて挿入位置を求めたノード対の代表ノードの位置情報を書き込むことで該ノード対を挿入するノード対挿入ステップと、
前記ノード対挿入位置決定ステップにおいて決定したノード対の挿入位置に該ノード対を挿入したときに、該挿入位置のノードより下位のリーフノードの段数が前記最大段数を越さないかチェックを行い、前記最大段数を超すリーフノードがあれば、そのリーフノードを含むノード対の直近上位のノードである親ノードをリーフノードとし、前記ノード対を構成するリーフノードそれぞれの分類参照ポインタと、該分類参照ポインタの指す前記キー分類表のデータに基づいて、前記リーフノードとした親ノードの分類参照ポインタを決定するとともに、該分類参照ポインタの指すキー分類表のデータとキーリンク表のデータを更新し、前記ノード対を削除することを、前記挿入位置のノードより下位の全てのリーフノードに対して行うことにより、ノード対を挿入しても前記最大段数を超えないことを保証する処理を行うノード対連結ステップと、を含み、
前記読み出された分類キーの値が、前記検索手段が求めた分類参照ポインタの指す前記キー分類表のエントリの最小値キーの値と最大値キーの値の間の範囲のものである場合に、
前記第１の分類キー連結ステップにおいて、前記分類参照ポインタを用いて分類キーの位置情報を取得するための情報を前記キー分類表とキーリンク表に追加し、
前記読み出された分類キーの値が、前記検索手段が求めた分類参照ポインタの指す前記キー分類表のエントリの最小値キーの値と最大値キーの値の間の範囲外のものである場合に、
前記ノード対挿入位置決定ステップにおいて、前記ノード対のリンク元となるノードの位置情報を該ノード対の挿入位置として決定し、
該決定された挿入位置のノードがリーフノードであって、該リーフノードの段数が前記最大段数のとき、前記第２の分類キー連結ステップにおいて、前記分類参照ポインタを用いて分類キーの位置情報を取得するための情報を前記キー分類表とキーリンク表に追加するとともに、前記分類キーが該分類参照ポインタの指すキー分類表の最小値キーより小さければ、該最小値キーに該分類キーを書き込み、一方、前記分類キーが前記分類参照ポインタの指すキー分類表の最大値キーより大きければ、該最大値キーに該分類キーを書き込み、
前記決定された挿入位置のノードがリーフノードであって、該リーフノードの段数が前記最大段数ではないとき、前記ノード対挿入手段が前記ノード対を挿入し、
前記ノード対挿入位置決定ステップにおいて決定した挿入位置のノードがブランチノードのとき、前記ノード対連結ステップにおいて前記ノード対を挿入しても前記最大段数を超えないことを保証する処理を行い、前記ノード対挿入ステップにおいて前記ノード対を挿入する、
ことを特徴とするビット列キー分類方法。
【請求項１１】
請求項１０記載のビット列キー分類方法において、前記分類ツリーは配列に配置され、前記代表ノードの位置を示す位置情報は、該代表ノードが配置された前記配列の配列要素の配列番号であることを特徴とするビット列キー分類方法。
【請求項１２】
ビット列キー分配装置が、請求項１記載のビット列キー分類装置により複数のブロックに分類されたキーをブロック毎に取り出して出力するビット列キー分配方法において、
前記分類ツリーから順次リーフノードを取り出すリーフノード取り出しステップと、
該取り出したリーフノードから、前記キーアクセス情報を読み出し、該キーアクセス情報を用いて前記キー位置検索表からキーの位置情報を取り出し、該キーの位置情報に基づいて該キーを前記キー記憶手段から読み出して出力先に出力する分類キー出力ステップと、
を備えることを特徴とするビット列キー分配方法。
【請求項１３】
請求項１２記載のビット列キー分配方法において、
前記キー位置検索表は、前記複数のブロックに対応するエントリを有するキー分類表と、前記分類対象のキーに対応するエントリを有するキーリンク表から構成され、
前記キー分類表のエントリは、前記キーリンク表のエントリを指すキー管理ポインタが格納される領域である先頭リンクと末尾リンクを含み、
前記キーリンク表のエントリは、前記対応する分類対象のキーが記憶された前記キー記憶手段の位置情報を指すキー参照ポインタを格納する領域と、前記キー管理ポインタを格納する領域であるリンクを含むものであり、
前記キーアクセス情報は、前記キー分類表のエントリを指す分類参照ポインタであることを特徴とするビット列キー分配方法。
【請求項１４】
請求項１３記載のビット列キー分配方法において、前記分類ツリーは配列に配置され、前記代表ノードの位置を示す位置情報は、該代表ノードが配置された前記配列の配列要素の配列番号であることを特徴とするビット列キー分配方法。
【請求項１５】
請求項８〜請求項１１のいずれか１項記載のビット列キー分類方法をコンピュータに実行させることを特徴とするプログラム。
【請求項１６】
請求項８〜請求項１１のいずれか１項記載のビット列キー分類方法をコンピュータに実行させるプログラムを記憶したことを特徴とするコンピュータ読み取り可能な記憶媒体。
【請求項１７】
請求項１２〜請求項１４のいずれか１項記載のビット列キー分配方法をコンピュータに実行させることを特徴とするプログラム。
【請求項１８】
請求項１２〜請求項１４のいずれか１項記載のビット列キー分配方法をコンピュータに実行させるプログラムを記憶したことを特徴とするコンピュータ読み取り可能な記憶媒体。
【請求項１９】
キー記憶手段に記憶され、複数のブロックに分類されたビット列キーを出力先に出力するビット列キー分配装置に用いられるデータ構造において、
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるツリーであって、前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが１つのときは前記リーフノード、ツリーのノードが２つ以上のときは前記ブランチノードであり、前記ブランチノードは、前記分類キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは前記キー記憶手段に記憶されている前記分類キーの位置情報を取得するために用いるキーアクセス情報を含み、
前記ツリーの任意のノードを検索開始ノードとし、前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の前記分類キーのビット値に応じてリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたキーアクセス情報を、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記分類キーによる検索結果とするように構成された分類ツリーと、
前記キーアクセス情報を用いて前記キーの位置情報を取得するための情報を格納するキー位置検索表と、
を備え、
前記ビット列キー分配装置が、前記分類ツリーと前記キー位置検索表により、請求項１２記載のビット列キー分配方法を実行し、複数のブロックに分類されたビット列キーの出力先への出力を可能とすることを特徴とするデータ構造。
【請求項２０】
請求項１９記載のデータ構造において、
前記キー位置検索表は、前記複数のブロックに対応するエントリを有するキー分類表と、前記分類対象のキーに対応するエントリを有するキーリンク表から構成され、前記キー分類表のエントリは、前記キーリンク表のエントリを指すキー管理ポインタが格納される領域である先頭リンクと末尾リンクを含み、前記キーリンク表のエントリは、前記対応する分類対象のキーが記憶された前記キー記憶手段の位置情報を指すキー参照ポインタを格納する領域と、前記キー管理ポインタを格納する領域であるリンクを含み、
前記分類ツリーのリーフノードに含まれる前記キーアクセス情報は、前記キー分類表のエントリを指す分類参照ポインタであり、
前記ビット列キー分配装置が、前記分類ツリー、前記キー分類表及びキーリンク表により、請求項１３記載のビット列キー分配方法を実行し、複数のブロックに分類されたビット列キーの出力先への出力を可能とすることを特徴とするデータ構造。
【請求項２１】
請求項２０記載のデータ構造において、
前記分類ツリーは配列に配置され、前記代表ノードの位置を示す位置情報は、該代表ノードが配置された前記配列の配列要素の配列番号であり、
前記ビット列キー分配装置が、前記分類ツリー、前記キー分類表及びキーリンク表により、請求項１４記載のビット列キー分配方法を実行し、複数のブロックに分類されたビット列キーの出力先への出力を可能とすることを特徴とするデータ構造。
【請求項２２】
請求項１９〜請求項２１のいずれか１項記載のデータ構造を記憶したことを特徴とするコンピュータ読み取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分類対象のビット列キーを分類する技術と、分類されたキーを出力先に分配する技術に関する。
【背景技術】
【０００２】
近年、社会の情報化が進展し、大規模なデータベースが各所で利用されるようになってきている。このような大規模なデータベースからレコードを検索するには、各レコードの記憶されたアドレスと対応づけられたレコード内の項目をインデックスキーとして検索をし、所望のレコードを探し出すことが通例である。また、全文検索における文字列も、文書のインデックスキーと見なすことができる。
【０００３】
そして、それらのインデックスキーはビット列で表現されることから、データベースの検索はビット列データの検索に帰着されるということができる。
一方、データベースに関連した処理として、下記特許文献１及び下記特許文献２に記載されているように、データベース中のレコードのマージソートが行われている。このマージソートもビット列データのマージソートに帰着される。
【０００４】
基本的なマージソートの手法は、データを２個の対まで分割してそれを並び替え、並び替えられたものを組み合せて行くものである。つまり、ソート対象データの分割を繰り返しながらソートして複数のソート済みのデータを得る前段の処理と、ソート済みのデータのマージを繰り返してソート対象データ全体のソートを行う後段の処理に分かれる。
特許文献２には、マージソートの後段の処理について図１に示す処理が開示されている。
【０００５】
図１に示すように、ブロック１〜ブロックＮにはソート済みのデータが格納されており、ブロック１の最小値は１３、ブロック２の最小値は８で、次に大きいデータは２２であることが例示されている。同様に、ブロック３の最小値が５３、ブロック４の最小値が２４、ブロックＮの最小値が９であると例示されている。
【０００６】
マージソートの後段の処理は、上記ブロック１〜ブロックＮの存在を前提としたものである。したがって、図１に示すマージソートを実行するためには、データをＮ個のブロックに分類することが必要である。
そして、図１に示すように、各ブロックから最小値を取り出し、各ブロックの最小値によるデータ列を生成することによりマージソートを実現している。
ところで、図１に示すように、従来のデータをＮ個のブロックに分類する手法では、各ブロックに分類されるデータの範囲に重複がある。したがって、各ブロックのサイズをキャッシュメモリに収まるものとすることにより、各ブロック内のソートを高速に実行できるとしても、後段の各ブロック内のデータをマージソートする処理では、ソート対象データ全体のソートを行うため、キャッシュメモリを用いた高速な処理とすることはできない。
【０００７】
一方、ビット列データの検索に用いられるデータ構造として、下記特許文献３にカップルドノードツリーの配列に格納された例が開示されている。配列にカップルドノードツリーを格納するのは、ノードの位置を配列番号で表すことができ、代表ノードの位置を示す位置情報の情報量を削減することができるからである。
また、下記特許文献４には、カップルドノードツリーの任意の部分木の最小値や最大値を検索する手法や、カップルドノードツリーの任意の部分木から昇順あるいは降順でインデックスキーを取り出す手法が開示されている。
以下、図２Ａ及び図２Ｂを参照して、本発明の背景技術の一つとして、カップルドノードツリーについて説明する。
【０００８】
図２Ａは、特許文献３に記載された配列に格納されたカップルドノードツリーの構成例を説明する図である。図２Ａに示すように、ノード１０１が配列１００の配列番号１０の配列要素に配置されている。ノード１０１はノード種別１０２、弁別ビット位置１０３及び代表ノード番号１０４で構成されている。ノード種別１０２の値は０であり、ノード１０１がブランチノードであることを示している。弁別ビット位置１０３には１が格納されている。代表ノード番号１０４にはリンク先のノード対の代表ノードの配列番号２０が格納されている。なお、以下では表記の簡略化のため、代表ノード番号に格納された配列番号を代表ノード番号ということもある。また、代表ノード番号に格納された配列番号をそのノードに付した符号あるいはノード対に付した符号で表すこともある。
【０００９】
配列番号２０の配列要素には、ノード対１１１の代表ノードであるノード［０］１１２が格納されている。そして隣接する次の配列要素（配列番号２０＋１）に代表ノードと対になるノード［１］１１３が格納されている。ノード［０］１１２はノード１０１と同様にブランチノードである。ノード［０］１１２のノード種別１１４には０が、弁別ビット位置１１５には３が、代表ノード番号１１６には３０が格納されている。またノード［１］１１３は、ノード種別１１７と参照ポインタ１１８ａで構成されている。ノード種別１１７には１が格納されており、ノード［１］１１３がリーフノードであることを示している。参照ポインタ１１８ａには、インデックスキーの記憶領域を参照するポインタが格納されている。以下では表記の簡略化のため、参照ポインタに格納されたデータのことも参照ポインタという。
【００１０】
配列番号３０及び３１の配列要素に格納されたノード１２２とノード１２３からなるノード対１２１の内容は省略されている。なお、代表ノードをノード［０］で表し、それと対になるノードをノード［１］で表すことがある。また、ある配列番号の配列要素に格納されたノードを、その配列番号のノードということがあり、ノードの格納された配列要素の配列番号を、ノードの配列番号ということもある。さらに、あるリーフノードと、そのリーフノードの参照ポインタが示す記憶領域に格納されたインデックスキーとの関係を示すために、リーフノードに対応するインデックスキーということもあり、インデックスキーに対応するリーフノードということもある。
【００１１】
ノード［０］１１２、ノード［１］１１３、ノード１２２、及びノード１２３の格納された配列要素にそれぞれ付された０あるいは１は、検索キーで検索を行う場合にノード対のどちらのノードにリンクするかを示すものである。前段のブランチノードの弁別ビット位置にある検索キーのビット値である０か１を代表ノード番号に加えた配列番号のノードにリンクする。したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置のビット値を加えることにより、リンク先のノードが格納された配列要素の配列番号を求めることができる。
【００１２】
図２Ｂは、カップルドノードツリーのツリー構造を概念的に示すとともにとインデックスキーの記憶領域の例を示す図である。
符号４１０ａで示すのが図２Ｂに例示するカップルドノードツリー４００のルートノードである。図示の例では、ルートノード４１０ａは配列番号４２０に配置されたノード対４０１ａの代表ノードとしている。ツリー構造としては、ルートノード４１０ａの下にノード対４０１ｂが、その下層にノード対４０１ｃとノード対４０１ｆが配置され、ノード対４０１ｆの下層にはノード対４０１ｈとノード対４０１ｇが配置されている。ノード対４０１ｃの下にはノード対４０１ｄが、さらにその下にはノード対４０１ｅが配置されている。
【００１３】
各ノードの前に付された０あるいは１の符号は、図２Ａにおいて説明した配列要素の前に付された符号と同じである。検索キーの弁別ビット位置のビット値に応じてツリーをたどり、検索対象のインデックスキーに対応するリーフノードを見つけることになる。
【００１４】
図示された例では、ルートノード４１０ａのノード種別４６０ａは０でブランチノードであることを示し、弁別ビット位置４３０ａは０を示している。代表ノード番号は４２０ａであり、それはノード対４０１ｂの代表ノード４１０ｂの格納された配列要素の配列番号である。
【００１５】
ノード対４０１ｂはノード４１０ｂと４１１ｂで構成され、それらのノード種別４６０ｂ、４６１ｂはともに０であり、ブランチノードであることを示している。ノード４１０ｂの弁別ビット位置４３０ｂには１が格納され、リンク先の代表ノード番号にはノード対４０１ｃの代表ノード４１０ｃの格納された配列要素の配列番号４２０ｂが格納されている。
【００１６】
ノード４１０ｃのノード種別４６０ｃには１が格納されているので、このノードはリーフノードであり、したがって、参照ポインタ４５０ｃを含んでいる。参照ポインタ４５０ｃには、インデックスキー２７０ｃが格納されている記憶領域を参照するポインタを格納する。参照ポインタ４５０ｃに格納されたデータのことも参照ポインタといい、符号４８０ｃにより表す。他のリーフノードでも同様に、参照ポインタと参照ポインタに格納されたデータを同じ参照ポインタという語で表す。図２Ｂに例示するインデックスキーの記憶領域３１１の参照ポインタ４８０ｃが指す領域には、インデックスキー２７０ｃとして“０００１１１”が記憶されている。
【００１７】
ノード対４０１ｃのもう一方のノード４１１ｃのノード種別４６１ｃは０、弁別ビット位置４３１ｃは２であり、代表ノード番号にはノード対４０１ｄの代表ノード４１０ｄの格納された配列要素の配列番号４２１ｃが格納されている。
【００１８】
ノード４１０ｄのノード種別４６０ｄは０、弁別ビット位置４３０ｄは５であり、代表ノード番号にはノード対４０１ｅの代表ノード４１０ｅの格納された配列要素の配列番号４２０ｄが格納されている。ノード４１０ｄと対をなすノード４１１ｄのノード種別４６１ｄは１であり、参照ポインタ４５１ｄには、“０１１０１０”というインデックスキー２７１ｄを格納した記憶領域を示す参照ポインタ４８１ｄが格納されている。
【００１９】
ノード対４０１ｅのノード４１０ｅ、４１１ｅのノード種別４６０ｅ、４６１ｅはともに１であり双方ともリーフノードであることを示している。ノード４１０ｅ、４１１ｅの参照ポインタ４５０ｅ、４５１ｅにはそれぞれ、値が“０１００１０”であるインデックスキー２７０ｅと、“０１００１１”であるインデックスキー２７１ｅを格納した記憶領域への参照ポインタ４８０ｅ、４８１ｅが格納されている。
【００２０】
ノード対４０１ｂのもう一方のノードであるノード４１１ｂの弁別ビット位置４３１ｂには２が格納され、リンク先の代表ノード番号にはノード対４０１ｆの代表ノード４１０ｆの格納された配列要素の配列番号４２１ｂが格納されている。
ノード対４０１ｆのノード４１０ｆ、４１１ｆのノード種別４６０ｆ、４６１ｆはともに０であり双方ともブランチノードである。それぞれの弁別ビット位置４３０ｆ、４３１ｆには５、３が格納されている。ノード４１０ｆの代表ノード番号にはノード対４０１ｇの代表ノード４１０ｇの格納された配列要素の配列番号４２０ｆが格納され、ノード４１１ｆの代表ノード番号にはノード対４０１ｈの代表ノードであるノード［０］４１０ｈの格納された配列要素の配列番号４２１ｆが格納されている。
【００２１】
ノード対４０１ｇのノード４１０ｇ、４１１ｇのノード種別４６０ｇ、４６１ｇはともに１であり双方ともリーフノードであることを示す。ノード４１０ｇ、４１１ｇのそれぞれの参照ポインタ４５０ｇ、４５１ｇには値が“１０００１０”と“１０００１１”であるインデックスキー２７０ｇ、２７１ｇを格納した記憶領域への参照ポインタ４８０ｇ、４８１ｇが格納されている。
【００２２】
また同じくノード対４０１ｈの代表ノードであるノード［０］４１０ｈとそれと対をなすノード［１］４１１ｈのノード種別４６０ｈ、４６１ｈはともに１であり双方ともリーフノードであることを示している。ノード４１０ｈ、４１１ｈのそれぞれの参照ポインタ４５０ｈ、４５１ｈには値がそれぞれ“１０１０１１”と“１０１１００”であるインデックスキー２７０ｈ、２７１ｈを格納した記憶領域への参照ポインタ４８０ｈ、４８１ｈが格納されている。
【００２３】
上述のカップルドノードツリー４００からインデックスキー“１０００１０”を検索する処理の流れを簡単に説明する。弁別ビット位置は、左から０、１、２、・・・とする。まず、ビット列“１０００１０”を検索キーとしてルートノード４１０ａから処理をスタートする。ルートノード４１０ａの弁別ビット位置４３０ａは０であるので、検索キー“１０００１０”の弁別ビット位置が０のビット値をみると１である。そこで代表ノード番号の格納された配列番号４２０ａに１を加えた配列番号の配列要素に格納されたノード４１１ｂにリンクする。ノード４１１ｂの弁別ビット位置４３１ｂには２が格納されているので、検索キー“１０００１０”の弁別ビット位置が２のビット値をみると０であるから、代表ノード番号の格納された配列番号４２１ｂの配列要素に格納されたノード４１０ｆにリンクする。
【００２４】
ノード４１０ｆの弁別ビット位置４３０ｆには５が格納されているので、検索キー“１０００１０”の弁別ビット位置が５のビット値をみると０であるから、代表ノード番号の格納された配列番号４２０ｆの配列要素に格納されたノード４１０ｇにリンクする。
【００２５】
ノード４１０ｇのノード種別４６０ｇは１でありリーフノードであることを示しているので、参照ポインタ４８０ｇにより示される記憶領域を参照し、そこに格納されたインデックスキー２７０ｇを読み出して検索キーと比較する。すると、インデックスキー２７０ｇと検索キーの両方とも値が“１０００１０”であって一致している。このようにしてカップルドノードツリーを用いた検索が行われる。
【００２６】
上述のカップルドノードツリー４００を用いた検索は、８個のインデックスキーをそれぞれ８個のリーフノードに対応するグループに分類する処理と見ることができる。すなわち、特許文献３には、ブロック内のインデックスキーが１個であるインデックスキーの分類手法が開示されていると考えることもできる。
しかしながら、上述のマージソートの後段の処理の前提となる、ブロック内のインデックスキーが複数であるインデックスキーの分類手法は開示されていない。
【先行技術文献】
【特許文献】
【００２７】
【特許文献１】特開２０００−０１０７６１号公報
【特許文献２】特開２００６−１６３５６５号公報
【特許文献３】特開２００８−２６９５０３号公報
【特許文献４】特開２００８−１１２２４０号公報
【発明の概要】
【発明が解決しようとする課題】
【００２８】
そこで、本発明が解決しようとする課題は、ビット列からなるデータ（以下、ビット列キー、あるいは単にキーということがある。また、インデックスキーということもある。）を複数のブロックに分類するとき、キーの値の範囲に重複のない分類手法と分類されたビット列キーを出力先に分配する手法を、カップルドノードツリーの技術を応用して提供することである。
【課題を解決するための手段】
【００２９】
本発明によるＮ個のブロックへのビット列キーの分類手法は、分類対象のキーを記憶するキー記憶手段からキーを順次分類キーとして選択し、分類キーによりカップルドノードツリーを応用した分類ツリーを生成し、そのリーフノードをそれぞれＮ個のブロックに分類されるキーと対応付けることにより行う。分類ツリーの段数は、ブロックの個数Ｎに応じて制限される。
本発明の一つの態様によれば、分類ツリーのリーフノードは、キー記憶手段に記憶されている分類キーの位置情報を取得するために用いるキーアクセス情報を含む。そして、キーアクセス情報を用いてキーの位置情報を取得するためのキー位置検索表を生成する。
分類ツリーの段数ｎは、２の（ｎ−１）乗がブロックの個数Ｎと等しいかそれより大きい最小の値に制限される。例えばＮ＝８であれば、ｎ＝４となる。
【００３０】
本発明の一つの態様によれば、分類対象のキーすべてにより生成された分類ツリーから、順次リーフノードを取り出し、リーフノードから読み出したキーアクセス情報を用いてキー位置検索表よりリーフノードに対応するブロックに分類されたキーの位置情報を得て、キー記憶手段からキーを読み出して出力先に出力する。
【発明の効果】
【００３１】
カップルドノードツリーの特徴により、あるリーフノードの直近上位のブランチノードの弁別ビット位置までの上位のビット値は、同一のブロックに分類されるどのキーでも一致し、リーフノードの直近上位のブランチノードの弁別ビット位置までに異なるビット値のあるキーは、他のブロックに分類される。したがって、本発明によれば、カップルドノードツリーの構造を持つ分類ツリーを生成することにより、分類対象のキーの値の範囲に重複がないように、キーを効率的に分類することができる。
【図面の簡単な説明】
【００３２】
【図１】ソート済みのデータのマージを繰り返してソート対象データ全体のソートを行う処理を説明する図である。
【図２Ａ】配列に格納されたカップルドノードツリーの構成例を説明する図である。
【図２Ｂ】カップルドノードツリーのツリー構造を概念的に示す図である。
【図３】本発明の一実施の形態における分類処理の概念を説明する図である。
【図４】本発明を実施するためのハードウェア構成例を説明する図である。
【図５】本発明の一実施の形態に係る分類ツリーのツリー構造を概念的に示すとともに、インデックスキーの管理領域を説明する図である。
【図６Ａ】分類キー“０１００１１”を挿入する前の状態を説明する図である。
【図６Ｂ】分類キー“０１００１１”の挿入後であって分類キー“０１００１０”を挿入する前の状態を説明する図である。
【図６Ｃ】分類キー“０１００１０”の挿入後であって分類キー“０００１１１”を挿入する前の状態を説明する図である。
【図６Ｄ】ノード対を挿入するため挿入位置のリーフノードのキーリンク表にインデックスキーを連結した状態を説明する図である。
【図６Ｅ】挿入位置のリーフノードのキーリンク表にインデックスキーを連結した後であって分類キー“０００１１１”を挿入した状態を説明する図である。
【図７Ａ】本発明の一実施の形態における分類処理の処理フロー例を示す図である。
【図７Ｂ】本発明の一実施の形態における分配処理の処理フロー例を示す図である。
【図８】本発明の一実施の形態における分類キーにより分類ツリーを生成する処理フロー例を説明する図である。
【図９Ａ】本発明の一実施の形態における分類キーを分類ツリーに挿入する処理の初段の処理フロー例を示す図である。
【図９Ｂ】本発明の一実施の形態における分類キーを分類ツリーに挿入する処理の中段の処理フロー例を示す図である。
【図９Ｃ】本発明の一実施の形態における分類キーを分類ツリーに挿入する処理の後段の処理フロー例を示す図である。
【図１０】本発明の一実施の形態における分類キーを挿入位置に挿入する処理フロー例を示す図である。
【図１１】本発明の一実施の形態における分類キーを、リーフノードのキーリンク表に連結する処理フロー例を示す図である。
【図１２】本発明の一実施の形態における分類ツリーを探索してリーフノードのキーリンク表に分類キーを連結する処理フロー例を説明する図である。
【図１３】本発明の一実施の形態におけるインデックスキーの最小値を含むノードを検索する処理フロー例を説明する図である。
【図１４】本発明の一実施の形態におけるリーフノードのノード対の分類参照ポインタを連結する処理フロー例を説明する図である。
【図１５Ａ】本発明の一実施の形態における、インデックスキーの最小値を含むリーフノードを求め、リーフノードのキーリンク表に連結したインデックスキーを順次取り出す処理の前段の処理フロー例を説明する図である。
【図１５Ｂ】本発明の一実施の形態における、インデックスキーの最小値を含むリーフノードを求め、リーフノードのキーリンク表に連結したインデックスキーを順次取り出す処理の後段の処理フロー例を説明する図である。
【図１６】本発明の一実施の形態におけるビット列キー分類・分配装置の機能ブロック構成例を説明する図である。
【発明を実施するための形態】
【００３３】
図３は、本発明の一実施の形態における分類処理の概念を説明する図である。図３に例示するものは、４つのブロックにキーを分類するものである。したがって、分類ツリーは２段である。
【００３４】
図３には、分類対象であるキーからなるキー列１１０が示されている。図３の例示では、キー列１１０に含まれるキーの存在するキーの位置であるキー位置が１１０ａ（以下、キー位置１１０ａのように表記する。）である記憶領域にはキー“１１１１”が存在する。また、キー位置１１０ｂ、１１０ｃ、１１０ｄ、１１０ｅには、それぞれキー“００１１”、“１０１０”、“０００１”
、“１１１０”が存在する。
【００３５】
図３に示す例では、キー列１１０に含まれるキーを分類済みキー列１３０ａ、１３０ｂ、１３０ｃ、１３０ｄの４つのブロックに分類するため、弁別ビット位置による分類（段数２の分類）１４０により、分類される。仮に３つのブロックに分類する場合でも、弁別ビット位置による分類（段数２の分類）１４０により４つのブロックに分類してから隣接する２つのブロックに分類されたものを１つのブロックに分類されたものとして扱えばよいから、ブロック数を２のｎ乗のものとしても一般性を失わない。
【００３６】
弁別ビット位置による分類（段数２の分類）１４０の第１段の弁別ビット位置による分類１４１ａで分類に用いる弁別ビット位置１４２ａは０である。インデックスキーのうち、ビット位置０のビット値１４３ａの値が０のものは、点線の矢印の組１５０ａが示すように、第２段の弁別ビット位置による分類１４１ｂでさらに分類される。
一方、インデックスキーのうち、ビット位置０のビット値１４３ａの値が１のものは、点線の矢印の組１５１ａが示すように、第２段の弁別ビット位置による分類１４１ｃでさらに分類される。
【００３７】
第２段の弁別ビット位置による分類１４１ｂで分類に用いる弁別ビット位置１４２ｂは２である。第２段の弁別ビット位置による分類１４１ｂの分類対象である分類キーのうち、ビット位置２のビット値１４３ｂの値が０のインデックスキー“０００１”は、点線の矢印１５０ｂが示すように、分類済みキー列１３０ａに分類済みキー１３１ａとして格納される。また、第２段の弁別ビット位置による分類１４１ｂの分類対象であるインデックスキーのうち、ビット位置２のビット値１４３ｂの値が１のインデックスキー“００１１”は、点線の矢印１５１ｂが示すように、分類済みキー列１３０ｂに分類済みキー１３１ｂとして格納される。
【００３８】
一方、第２段の弁別ビット位置による分類１４１ｃで分類に用いる弁別ビット位置１４２ｃは１である。第２段の弁別ビット位置による分類１４１ｃの分類対象であるインデックスキーのうち、ビット位置１のビット値１４３ｃの値が０のインデックスキー“１０１０”は、点線の矢印１５０ｃが示すように、分類済みキー列１３０ｃに分類済みキー１３１ｃとして格納される。また、第２段の弁別ビット位置による分類１４１ｃの分類対象であるインデックスキーのうち、ビット位置１のビット値１４３ｃの値が１の分類キー“１１１１”と“１１１０”は、点線の矢印の組１５１ｄが示すように、分類済みキー列１３０ｄに、それぞれ分類済みキー１３１ｄ、１３１ｅとして格納される。
【００３９】
図４は、本実施形態のためのハードウェア構成例を説明する図である。
図４には、ビット列キー分類・分配装置３００がネットワーク３４７を介してビット列キーソート装置３４０ａ、３４０ｂ、・・・、３４０ｍに接続されたシステムが例として記載されている。ビット列キー分類・分配装置３００による分類済みのビット列キーの分配先がビット列キーソート装置であるのは１つの例であり、集計処理等の他のアプリケーションにも適用可能である。
また、分配先の装置も、ネットワークを介して接続されたものに限らず、例えばマルチプロセッサシステムの中央処理装置とすることもできる。
【００４０】
本実施形態によるキーの分類は中央処理装置３０２及びキャッシュメモリ３０３を少なくとも備えたデータ処理装置３０１によりデータ格納装置３０８を用いて実施される。また、例示されたビット列ソート装置３４０ａ、３４０ｂ、・・・、３４０ｍへの分類済みキーの分配も、データ処理装置３０１によりデータ格納装置３０８を用いて実施される。分類ツリーが記憶される配列３０９、分類ツリーを検索中にたどるノードが配置された配列要素の配列番号を格納する探索経路スタック３１０、分類対象であるキーが記憶されているインデックスキーの記憶領域３１１、及び各ブロックに分類されるキーの位置情報を検索するデータを記憶するインデックスキーの管理領域３２０を有するデータ格納装置３０８は、主記憶装置３０５または外部記憶装置３０６で実現することができる。
【００４１】
ビット列ソート装置３４０ａ、３４０ｂ、・・・、３４０ｍはそれぞれ分配された分類済みキーを並列にソートする。これらの構成例として、ビット列ソート装置３４０ａの構成例が示されている。図４に示すように、ビット列ソートは、中央処理装置３０２及びキャッシュメモリ３０３を少なくとも備えたデータ処理装置３０１ａによりデータ格納装置３０８ａを用いて実施される。配列３０９ａ、インデックスキーの記憶領域３１０ａを有するデータ格納装置３０８ａは、主記憶装置３０５ａまたは外部記憶装置３０６ａで実現することができる。
【００４２】
図４の例示では、ビット列分類・分配装置３００の主記憶装置３０５、外部記憶装置３０６及び通信装置３０７が一本のバス３０４によりデータ処理装置３０１に接続されているが、接続方法はこれに限るものではない。また、主記憶装置３０５をデータ処理装置３０１内のものとすることもできるし、探索経路スタック３１０を中央処理装置３０２内のハードウェアとして実現することも可能である。あるいは、インデックスキーの記憶領域３１１は外部記憶装置３０６に、探索経路スタック３１０とインデックスキーの管理領域３２０を主記憶装置３０５に持つなど、使用可能なハードウェア環境、インデックスキー集合の大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
【００４３】
なお、特に図示されてはいないが、処理の途中で得られた各種の値や初期設定値等を後の処理で用いるためにそれぞれの処理に応じた主記憶装置３０５の一時記憶領域が用いられることは当然である。
また、ビット列ソート装置３４０ａ、３４０ｂ、・・・、３４０ｍにおける各装置の接続方法やデータ格納装置の構成についても同様である。
【００４４】
図５は、本発明の一実施の形態に係る分類ツリーのツリー構造を概念的に示すとともに、インデックスキーの管理領域を説明する図である。
図５に例示する分類ツリー２００は、図２Ｂに例示するインデックスキーの記憶領域３１１に記憶されたインデックスキーを４つのブロックに分類するためのものである。
図５に示すインデックスキーの管理領域３２０には、キー分類表３２１とキーリンク表３２２が格納されている。キー分類表３２１とキーリンク表で、先に述べたキー位置検索表の例を構成しており、キー分類表３２１のエントリを指す分類参照ポインタは、先に述べたキーアクセス情報の例である。
図５のインデックスキーの管理領域３２０に記載された２７０ｈ等の符号は、図２Ｂのインデックスキーの記憶領域３１１に記載された２７０ｈ等の符号で示すインデックスキー“１０１０１１”等を示している。
【００４５】
符号２１０ａで示すのが図５に例示する分類ツリー２００のルートノードである。図示の例では、ルートノード２１０ａは配列番号２２０に配置されたノード対２０１ａの代表ノードとしている。ツリー構造としては、ルートノード２１０ａの下にノード対２０１ｂが、その下層にノード対２０１ｃとノード対２０１ｆが配置されている。
【００４６】
図示された例では、ルートノード２１０ａのノード種別２６０ａは０でブランチノードであることを示し、弁別ビット位置２３０ａは０を示している。代表ノード番号は２２０ａであり、それはノード対２０１ｂの代表ノード２１０ｂの格納された配列要素の配列番号である。
【００４７】
ノード対２０１ｂはノード２１０ｂと２１１ｂで構成され、それらのノード種別２６０ｂ、２６１ｂはともに０であり、ブランチノードであることを示している。ノード２１０ｂの弁別ビット位置２３０ｂには１が格納され、リンク先の代表ノード番号にはノード対２０１ｃの代表ノード２１０ｃの格納された配列要素の配列番号２２０ｂが格納されている。
【００４８】
ノード２１０ｃのノード種別２６０ｃには１が格納されているので、このノードはリーフノードである。分類ツリーのリーフノードは、分類参照ポインタ２５０ｃを含んでいる。分類参照ポインタ２５０ｃには、インデックスキーの管理領域３２０に含まれるキー分類表のエントリを指すポインタが格納される。分類参照ポインタ２５０ｃに格納されたデータも分類参照ポインタといい、符号２８０ｃにより表す。他のリーフノードでも同様に、分類参照ポインタと分類参照ポインタに格納されたデータを同じ分類参照ポインタという語で表す。
【００４９】
ノード対２０１ｃのもう一方のノードであるノード２１１ｃのノード種別２６１ｃにも１が格納されているので、このノードもリーフノードである。ノード２１１ｃの分類参照ポインタ２５１ｃには、分類参照ポインタ２８０ｅが格納されている。
【００５０】
ノード対２０１ｂのもう一方のノードであるノード２１１ｂの弁別ビット位置２３１ｂには２が格納され、リンク先の代表ノード番号にはノード対２０１ｆの代表ノードであるノード［０］２１０ｆの配置された配列要素の配列番号２２１ｂが格納されている。
ノード対２０１ｆの代表ノードであるノード［０］２１０ｆとそれと対をなすノード［１］２１１ｆのノード種別２６０ｆ、２６１ｆはともに１であり双方ともリーフノードである。ノード２１０ｆ、２１１ｆの分類参照ポインタ２５０ｆ、２５１ｆには、それぞれ分類参照ポインタ２８０ｇ、２８０ｈが格納されている。
【００５１】
図５に示すように、分類キーを４つのブロックに分類するための分類ツリー２００は、第１段のブランチノードであるルートノード２１０ａと第２段のブランチノードであるノード２１０ｂとノード２１１ｂ、及び第３段目のノードとして、各ブロックに対応する４つのリーフノード２１０ｃ、２１１ｃ、２１０ｆ、２１１ｆを含む。以下の説明において、リーフノードに対応するブロックに分類されるインデックスキーを、リーフノードに含まれるインデックスキーということがある。
【００５２】
一方、インデックスキーの管理領域３２０は、キー分類表３２１とキーリンク表３２２を含む。図５に示すインデックスキーの管理領域３２０の各データの記憶状況は、図２Ｂに示すインデックスキーの記憶領域３１１に記憶された全てのインデックスキーを４つのブロックに分類したときのものである。
【００５３】
キー分類表３２１は、インデックスキーを分類するブロック数に対応して４つのエントリを有する。各エントリの先頭アドレスは、分類ツリー２００の４つのリーフノード２１０ｃ、２１１ｃ、２１０ｆ、２１１ｆの分類参照ポインタ２８０ｃ、２８０ｅ、２８０ｇ、２８０ｈでそれぞれ示される。
【００５４】
また、キー分類表３２１は、図の例では、各エントリに最小値キー３１２ａ、最大値キー３１２ｂ、キーの出力先３１２ｅ、先頭リンク３１２ｃ、及び末尾リンク３１２ｄを含む。図に示す例では、分類参照ポインタ２８０ｃの指すエントリの先頭リンク３１２ｃと末尾リンク３１２ｄには、どちらにもキーリンク表３２２のエントリを指すキー管理ポインタ３７０ｃが格納されている。分類参照ポインタ２８０ｅの指すエントリの先頭リンク３１２ｃと末尾リンク３１２ｄには、それぞれキー管理ポインタ３７０ｅとキー管理ポインタ３７１ｄが格納されている。分類参照ポインタ２８０ｇの指すエントリの先頭リンク３１２ｃと末尾リンク３１２ｄには、それぞれキー管理ポインタ３７０ｇとキー管理ポインタ３７１ｇが格納されている。分類参照ポインタ２８０ｈの指すエントリの先頭リンク３１２ｃと末尾リンク３１２ｄには、それぞれキー管理ポインタ３７０ｈとキー管理ポインタ３７１ｈが格納されている。
最小値キー３１２ａ、最大値キー３１２ｂ、キーの出力先３１２ｅに格納される値の記載については省略されている。最小値キー３１２ａと最大値キー３１２ｂの値は分類ツリー２００が生成される途中で書き込まれ、更新されるが、キーの出力先３１２ｅは、分類ツリーの生成が終了した後に書き込まれる。なお、キーの出力先については、キー分類表とは別に、分類対象のキーを分類するブロック対応に設定しておくこともできる。
【００５５】
キーリンク表３２２は、同一のリーフノードに対応付けられるインデックスキーを順次たどることを可能とするためのインデックスキー間のリンク関係を書き込むものであり、分類対象のインデックスキーの数に対応したエントリを有する。例えば、インデックスキーの記憶領域が図２Ｂに示すものであれば、８つのエントリを有する。各エントリの先頭アドレスは、キー管理ポインタ３７０ｃ、３７０ｅ、３７１ｅ、３７１ｄ、３７０ｇ、３７１ｇ、３７０ｈ、３７１ｈで示されており、それぞれインデックスキー２７０ｃ、２７０ｅ、２７１ｅ、２７１ｄ、２７０ｇ、２７１ｇ、２７０ｈ、２７１ｈに対応付けられている。
【００５６】
キーリンク表３２２は、図の例では、各エントリにキー参照ポインタ３１３ａとリンク３１３ｂを含む。キー参照ポインタ３１３ａは、そのエントリを指すキー管理ポインタに対応付けられたインデックスキーの記憶領域を指す。したがって、インデックスの記憶領域が図２Ｂに示すものであれば、キー管理ポインタ３７０ｃ、３７０ｅ、３７１ｅ、３７１ｄ、３７０ｇ、３７１ｇ、３７０ｈ、３７１ｈの指すキーリンク表３２２のキー参照ポインタ３１３ａには、参照ポインタ４８０ｃ、４８０ｅ、４８１ｅ、４８１ｄ、４８０ｇ、４８１ｇ、４８０ｈ、４８１ｈが格納されるが、図５ではキー参照ポインタ３１３ａの記載は省略されている。
【００５７】
キー管理ポインタの指すキーリンク表３２２のリンク３１３ｂには、キー管理ポインタに対応付けられたインデックスキーと同一ブロックに分類されるインデックスキーが対応付けられたキー管理ポインタが格納されている。図５の例示では、キー管理ポインタ３７０ｈに対応付けられたインデックスキー２７０ｈとキー管理ポインタ３７１ｈに対応付けられたインデックスキー２７１ｈは、分類参照ポインタ２８０ｈに対応するブロックに分類されている。そのブロックの先頭リンク３１２ｃであるキー管理ポインタ３７０ｈの指すキーリンク表３２２のリンク３１３ｂには、キー管理ポインタ３７１ｈが格納されている。インデックスキー２７１ｈに対応付けられたキー管理ポインタ３７１ｈはキー分類表３２１の末尾リンクに格納され、インデックスキー２７１ｈはブロックの末尾のインデックスキーであるので、キー管理ポインタ３７１ｈの指すキーリンク表３２２のリンク３１３ｂにはなにも格納されていない。
【００５８】
同様に、キー管理ポインタ３７０ｇに対応付けられたインデックスキー２７０ｇとキー管理ポインタ３７１ｇに対応付けられたインデックスキー２７１ｇは、分類参照ポインタ２８０ｇに対応するブロックに分類されている。そのブロックの先頭リンク３１２ｃであるインデックスキー２７０ｇに対応付けられたキー管理ポインタ３７０ｇの指すキーリンク表３２２のリンク３１３ｂには、キー管理ポインタ３７１ｇが格納されている。インデックスキー２７１ｇに対応付けられたキー管理ポインタ３７１ｇはキー分類表３２１の末尾リンクに格納され、インデックスキー２７１ｇはブロックの末尾のインデックスキーであるので、キー管理ポインタ３７１ｇの指すリンク３１３ｂにはなにも格納されていない。
【００５９】
キー管理ポインタ３７０ｅに対応付けられたインデックスキー２７０ｅとキー管理ポインタ３７１ｅに対応付けられたインデックスキー２７１ｅ、及びキー管理ポインタ３７１ｄに対応付けられたインデックスキー２７１ｄは、分類参照ポインタ２８０ｅに対応するブロックに分類されている。そのブロックの先頭リンク３１２ｃであるインデックスキー２７０ｅに対応付けられたキー管理ポインタ３７０ｅの指すキーリンク表３２２のリンク３１３ｂには、キー管理ポインタ３７１ｅが格納されている。キー管理ポインタ３７１ｅの指すキーリンク表３２２のリンク３１３ｂには、キー管理ポインタ３７１ｄが格納されている。そして、インデックスキー２７１ｄに対応付けられたキー管理ポインタ３７１ｄはキー分類表３２１の末尾リンクに格納され、インデックスキー２７１ｄはブロックの末尾のインデックスキーであるので、キー管理ポインタ３７１ｄの指すキーリンク表３２２のリンク３１３ｂにはなにも格納されていない。
【００６０】
また、キー管理ポインタ３７０ｃに対応付けられたインデックスキー２７０ｃは、分類参照ポインタ２８０ｃに対応するブロックに分類されている。分類参照ポインタ２８０ｃの指すキー分類表３２１の先頭リンク３１２ｃと末尾リンク３１２ｄにはともにインデックスキー２７０ｃに対応付けられたキー管理ポインタ３７０ｃが格納されているので、分類参照ポインタ２８０ｃに対応するブロックに分類されているインデックスキーはインデックスキー２７０ｃだけである。したがって、キー管理ポインタ３７０ｃが指すキーリンク表３２２のリンク３１３ｂには何も格納されていない。
なお、以下の説明において、リーフノードにインデックスキーを対応付けることを、インデックスキーをリーフノードのキーリンク表に連結するということがある。また、インデックスキーが対応付けられたリーフノードを、そのインデックスキーと連結するリーフノードということがある。
【００６１】
上述のキー分類表３２１の分類参照ポインタに対応するブロックのインデックスキーは、次のようにして全て取り出すことができる。まず、分類参照ポインタの指す先頭リンク３１２ｃをキーリンク表３２２のキー管理ポインタとしてキー参照ポインタ３１３ａを読み出し、キー参照ポインタ３１３ａの指すインデックスキーをインデックスキー記憶領域から取り出す。次にリンク３１３ｂをキーリンク表３２２のキー管理ポインタとしてキー参照ポインタ３１３ａを読み出し、キー参照ポインタ３１３ａの指すインデックスキーをインデックスキー記憶領域から取り出すことを、リンク３１３ｂがキー分類表３２１の末尾リンク３１２ｄと等しくなるまで繰り返す。
【００６２】
次に、図６Ａ〜図６Ｅを参照して、分類ツリー２００の生成処理の概要を説明する。分類ツリー２００のうちノード２１１ｂ以下の階層の部分についての説明は省略する。また、すでにインデックスキー２７１ｄ“０１１０１０”がリーフノード２１０ｂに対応するブロックに分類されている、すなわちリーフノード２１０ｂのキーリンク表に連結されているものとする。なお、以下の説明においては、インデックスキーの記憶領域から読み出され、分類処理の対象となるインデックスキーを、分類キーということがある。また、分類キーを分類ツリーによりリーフノードに対応するブロックに分類すること、すなわちリーフノードのキーリンク表に連結することを、分類ツリーに分類キーを挿入するということがある。分類ツリーの最大段数に制限のあることから、分類ツリーに分類キーを挿入するとき、分類キーと連結するリーフノードを含むノード対を分類ツリーに挿入する場合のほか、分類キーを既存のリーフノードに連結する場合と、既存のリーフノードからなるノード対の直近上位のノードである親ノードをリーフノードとし、そのリーフノードのキーリンク表に分類キーを連結する場合がある。
【００６３】
図６Ａは、分類キー２７０ｅ“０１００１１”を挿入する前の状態である分類ツリー２００ａを説明する図である。図６Ａに示す分類ツリー２００ａは、図５に示す分類ツリー２００のノード２１０ｂがリーフノードとなったものであり、その分類参照ポインタ２５０ｂには、分類参照ポインタ２８０ｄが格納されている。また、ノード２１１ｂより下位のノードの記載は省略されている。この下位ノードの記載の省略は、図６Ｂ〜図６Ｅにおいても同様である。
【００６４】
図６Ａの点線の矢印２９０ｄで示すように、リーフノード２１０ｂには分類参照ポインタ２８０ｄによりインデックスキーの管理領域３２０を介してインデックスキー記憶領域３１１に記憶されたインデックスキー２７１ｄ“０１１０１０”が対応付けられている。言い換えれば、リーフノード２１０ｂのキーリンク表にインデックスキー２７１ｄが連結されている。
【００６５】
図６Ａには、挿入される分類キーとして分類キー２７１ｅ“０１００１１”とその挿入位置が記載されている。
また、探索経路カウンタのカウント値が記載されている。探索経路カウンタのカウント値は、分類ツリーに分類キーを挿入するときに、分類ツリーの段数の制限を満足しながら、分類キーと連結するリーフノードを含むノード対を分類ツリーに挿入することができるかの判断に用いられる。
探索経路カウンタのカウント値は、例えば初期値を０としてカウントアップし、図６Ａに示すように、ルートノードにおいて値１を取るものとする。なお、初期値を分類ツリーの最大段数としてカウントダウンし、カウント値が０か判定をすることにより、同じく、分類ツリーの段数の制限を満足しながら、分類キーと連結するリーフノードを含むノード対を分類ツリーに挿入することができるかの判断を行えることは明らかである。
【００６６】
図６Ａの例では、ルートノード２１０ａの弁別ビット位置２６０ａに格納された値が０、挿入される分類キー２７１ｅ“０１００１１”の０ビット目のビット値が０なので、挿入される分類キー２７１ｅによる検索の結果、リーフノード２１０ｂが求められる。探索経路カウンタの値はリーフノード２１０ｂにおいて２となる。また、分類キー２７１ｅ“０１００１１”とリーフノード２１０ｂのキーリンク表に連結したインデックスキー２７１ｄ“０１１０１０”の上位ビット位置から見て最初に異なるビット値となるビット位置である差分ビット位置と、ブランチノード２１０ａの弁別ビット位置の相対的位置関係により、分類キー２７１ｅはリーフノード２１０ｂの下位に挿入される。したがって、分類キー２７１ｅの挿入位置は、図に示すようにノード２１０ｂとなる。分類ツリーの最大段数は３、探索経路カウンタのカウント値は２であるので、段数の制限を満足することから、挿入される分類キー２７１ｅと連結するリーフノードを含むノード対を、ノード２１０ｂの下位に挿入することが可能である。
【００６７】
図６Ｂは、分類キー２７１ｅ“０１００１１”の挿入後であって分類キー２７０ｅ“０１００１０”を挿入する前の状態である分類ツリー２００ｂを説明する図である。分類キー２７１ｅ“０１００１１”と連結するリーフノードを含むノード対２０１ｄはノード２１０ｂの下位に挿入されている。分類ツリー２００ａではリーフノードであったノード２１０ｂはブランチノードとなっており、弁別ビット位置には、インデックスキー２７１ｄと分類キー２７１ｅの差分ビット位置２が格納されている。ノード２１０ｂの代表ノード番号２２０ｂは挿入されたノード対２０１ｄの代表ノード２１０ｄが配置された配列要素の配列番号である。
【００６８】
インデックスキー２７１ｄが分類キー２７１ｅより大きいので、分類キー２７１ｄと連結するリーフノードはノード対２０１ｄのノード［１］であるノード２１１ｄとなる。図６Ｂに示すように、図６Ａに示すノード２１０ｂの内容が、図６Ｂのノード２１１ｄにコピーされている。
【００６９】
一方、ノード対２０１ｄのノード［０］であるノード２１０ｄが、分類キー２７１ｅと連結するリーフノードとなる。その分類参照ポインタ２５０ｄには、分類参照ポインタ２８０ｅが格納されている。そして、点線の矢印２９０ｅで示すように、リーフノード２１０ｄには分類参照ポインタ２８０ｅによりインデックスキーの管理領域３２０を介してインデックスキー記憶領域３１１に記憶された分類キー２７１ｅ“０１００１１”が対応付けられている。すなわち、分類キー２７１ｅ“０１００１１”は、リーフノード２１０ｄに分類される。
【００７０】
図６Ｂには、分類ツリー２００ｂに加えて、次に挿入される分類キーとして、分類キー２７０ｅ“０１００１０”が記載され、分類キー２７０ｅの挿入位置としてノード２１０ｄが示されている。また、探索経路カウンタのカウント値はリーフノード２１０ｄにおいて最大段数である３と表示されている。したがって、段数制限により、ノード２１０ｄの下位に分類キー２７０ｅと連結するリーフノードを含むノード対を挿入することはできない。
【００７１】
図６Ｃは、分類キー２７０ｅ“０１００１０”の挿入後であって分類キー２７０ｃ“０００１１１”を挿入する前の状態である分類ツリー２００ｃを説明する図である。上述のように、ノード２１０ｄの下位に分類キー２７０ｅと連結するリーフノードを含むノード対を挿入することはできないので、図６Ｃの点線の矢印２９０ｅで示すように、分類キー２７０ｅ“０１００１０”を、インデックスキー２７１ｅ“０１００１１”に加えて、図６Ｂに示す挿入位置のリーフノード２１０ｄのキーリンク表に連結する。この処理については後に詳細に説明するが、インデックスキーの管理領域３２０のキー分類表３２１とキーリンク表３２２の書き込みにより行われる。
【００７２】
図６Ｃには、分類ツリー２００ｃに加えて、次に挿入される分類キーとして、分類キー２７０ｃ“０００１１１”が記載され、分類キー２７０ｃの挿入位置としてノード２１０ｂが示されている。また、探索経路カウンタのカウント値は２段に亘って表示されている。上段に表示されたカウント値は、挿入位置を求める際にカウントされたものであり、１段目のルートノード２１０ａに対応するカウント値１から、２段目の挿入位置であるノード２１０ｂに対応するカウント値２にカウントアップされている。下段に表示されたカウント値は、挿入位置であるノード２１０ｂを検索開始ノードとして、ノード２１０ｂより下位の階層のリーフノードを順次検索し、リーフノードの段数を求める際にカウントされたものであり、検索開始ノード２１０ｂに対応するカウント値２から、３段目のリーフノード２１０ｄに対応するカウント値３にカウントアップされている。すると、ノード２１０ｂの下位に分類キー２７０ｃと連結するリーフノードを含むノード対を挿入するとリーフノード２１０ｄの段数は４となる。したがって、段数制限を超えるので、ノード２１０ｂの下位に分類キー２７０ｃと連結するリーフノードを含むノード対を挿入することはできない。
【００７３】
図６Ｄは、ノード対を挿入するため挿入位置の下位のリーフノードのキーリンク表に連結したインデックスキーを、挿入位置のリーフノードのキーリンク表に連結した状態の分類ツリー２００ｄを説明する図である。上述のとおり、図６Ｃに示す分類ツリー２００ｃの挿入位置であるノード２１０ｂの下位にノード対を挿入することはできない。そこで、本発明によれば、ノード対を構成する２つのリーフノード（子ノード）の親ノードをリーフノードとし、親ノードであるリーフノードのキーリンク表に、２つの子ノードのキーリンク表に連結するインデックスキーを連結する（以下、挿入位置の下位のリーフノードを統合する、あるいはリーフノードを統合する、のように表記することがある。）ことにより、分類ツリーの段数を減らして挿入する分類キーと連結するリーフノードを含むノード対の挿入を可能にする。
【００７４】
図６Ｄに示すように、分類ツリー２００ｄのノード２１０ｂは、図６Ｃに示す分類ツリー２００ｃのリーフノード２１０ｄの内容を、リーフノード２１０ｄとリーフノード２１１ｄからなるノード対２０１ｄの上位のブランチノードであるノード２１０ｂに書き込んだものである。そして、図６Ｄの点線の矢印２９０ｅで示すように、インデックスキー２７０ｅ“０１００１０”、インデックスキー２７１ｅ“０１００１１”、インデックスキー２７１ｄ“０１１０１０”を、図６Ｄに示すリーフノード２１０ｂのキーリンク表に連結する。
【００７５】
図６Ｄには、分類ツリー２００ｄに加えて、次に挿入される分類キーとして、分類キー２７０ｃ“０００１１１”が記載され、分類キー２７０ｃの挿入位置としてノード２１０ｂが示されている。また、リーフノード２１０ｂにおける探索経路カウンタの下段のカウント値は、１つ減って、２と表示されている。したがって、分類ツリー２００ｄの段数が１つ減り、分類ツリー２００ｄのノード２１０ｂの下位に、分類キー２７０ｃと連結するリーフノードを含むノード対を挿入することが可能である。
【００７６】
図６Ｅは、挿入位置の下位のリーフノードを統合した後の分類ツリー２００ｄに分類キー２７０ｃ“０００１１１”を挿入した分類ツリー２００ｅの状態を説明する図である。分類キー２７０ｃ“０００１１１”と連結するリーフノードを含むノード対２０１ｃは、ノード２１０ｂの下位に挿入されている。分類ツリー２００ｄではリーフノードであったノード２１０ｂはブランチノードとなっており、弁別ビット位置には、分類キー２７０ｃとインデックスキー２７０ｅの差分ビット位置１が格納されている。ノード２１０ｂの代表ノード番号２２０ｂは挿入されたノード対２０１ｃの代表ノード２１０ｃが配置された配列要素の配列番号である。
【００７７】
分類キー２７０ｃがインデックスキー２７０ｅより小さいので、分類キー２７０ｃと連結するリーフノードはノード対２０１ｃのノード［０］であるノード２１０ｃとなる。その分類参照ポインタ２５０ｃには、分類参照ポインタ２８０ｃが格納されている。そして、点線の矢印２９０ｃで示すように、リーフノード２１０ｃには分類参照ポインタ２８０ｃによりインデックスキーの管理領域３２０を介してインデックスキー記憶領域３１１に記憶された分類キー２７０ｃ“０００１１１”が対応付けられている。すなわち、分類キー２７０ｃ“０００１１１”は、リーフノード２１０ｃに分類される。
一方、図６Ｅに示すように、図６Ｄに示すノード２１０ｂの内容が、図６Ｅのノード２１１ｃにコピーされている。
以上説明した流れにより、図５に示す分類ツリー２００が生成される。
【００７８】
次に、図７Ａ及び図７Ｂを参照して、本発明の一実施の形態におけるインデックスキーの分類処理と、分類された分類済みキーを出力先に出力する分配処理の全体の処理の概要を説明する。
【００７９】
図７Ａは、本発明の一実施の形態における分類処理の処理フロー例を示す図である。分類処理は、分類キーにより分類ツリーを生成するとともに、インデックスキーの管理領域にデータの書き込みを行い分類対象であるインデックスキーを分類ツリーのリーフノードと対応付けて分類するものである。なお、以下の説明においては、分類キーにより分類ツリーを生成するとともに、インデックスキーの管理領域にデータの書き込みを行うことを、単に分類ツリーを生成するということがある。
【００８０】
図７Ａに示すように、まずステップＳ７０１において、分類ツリーの最大段数を取得する。この最大段数の取得は、直接最大段数を取得するものであってもよいし、分類対象のキーを分類するブロック数から割り出すものであってもよい。先に述べたように、例えばブロック数が８であれば最大段数が４であるように、ブロック数より小さくない最小の２のべき乗のべき乗数に１を加えた数値を最大段数とすることができる。
【００８１】
次にステップＳ７０１ａにおいて、インデックスキーの記憶領域のキー参照ポインタに、インデックスキーの記憶領域の先頭のキーの記憶位置を設定する。ここで、インデックスキーの記憶領域のキー参照ポインタは、先に述べた、特に図示されてはいないが、処理の途中で各種の値を設定しておき、後の処理でその設定値を用いるための一時記憶領域の１つである。
【００８２】
次にステップＳ７０２において、分類対象の全てのキーは処理済みか判定し、処理済みであれば、ステップＳ７０６を介して、図７Ｂに示すステップＳ７１１以降の処理に進み、処理済みでなければ、ステップＳ７０３に進む。
ステップＳ７０３では、インデックスキーの記憶領域より、キー参照ポインタの指すキーを読み出し、分類キーに設定する。そしてステップＳ７０４において、分類キーにより分類ツリーを生成する。ステップＳ７０４の分類ツリーの生成処理の詳細については、後に図８、図９Ａ〜図９Ｃを参照して説明する。
【００８３】
次にステップＳ７０５において、インデックスキーの記憶領域のキー参照ポインタに、インデックスキーの記憶領域に記憶された次のキーの記憶位置を設定してステップＳ７０２に戻る。ステップＳ７０２〜ステップＳ７０５のループ処理を、ステップＳ７０２で全てのキーは処理済みであると判定されるまで繰り返し、ステップＳ７０２で全てのキーは処理済みであると判定される分類処理を終了し、ステップＳ７０６において、キー分類表のキーの出力先にキーの出力先を設定して、図７Ｂに示すステップＳ７１１以下の分配処理に進む。
【００８４】
図７Ｂは、本発明の一実施の形態における分配処理の処理フロー例を示す図である。分配処理は、分類処理で書き込みの行われたインデックスキーの管理領域のデータにより、ブロック毎に分類された分類キーを読み出して出力先に出力するものである。
【００８５】
図７Ｂに示すように、まずステップＳ７１１において、検索開始ノードの配列番号に、分類ツリーのルートノードの配列番号を設定する。次にステップＳ７１２において、検索処理においてたどるノードの配置された配列要素の配列番号を格納する探索経路スタックに、最初に格納される配列番号として終端番号を格納する。この終端番号は検索処理でたどるノードの格納された配列要素の配列番号と区別ができるものであればよい。
【００８６】
次にステップＳ７１４において、検索開始ノードより配列を検索し、インデックスキーの最小値を含むリーフノードを求め、リーフノードのキーリンク表に連結したインデックスキーを順次取り出す。ステップＳ７１４の処理の詳細は、後に図１５Ａ及び図１５Ｂを参照して説明する。
【００８７】
次にステップＳ７１８で、探索経路スタックから配列番号を取り出し、探索経路スタックのスタックポインタを１つ減らし、ステップＳ７１９に進む。ステップＳ７１９では、ステップＳ７１８で取り出した配列番号が終端番号であるか判定する。判定の結果、終端番号であれば、処理を終了し、終端番号でなければ、ステップＳ７２１に進む。
【００８８】
ステップＳ７２１では、ステップＳ７１８で取り出した配列番号から、その配列番号のノードがノード対のどちらの配列要素に格納されているかのノード位置を得る。例えばノード［０］については偶数番号の配列の配列要素に格納する等により、配列番号からノード位置を求めることができる。
【００８９】
そして、ステップＳ７２２で、ステップＳ７２１で得たノード位置がノード［１］側であるか否かを判定する。ステップＳ７２２においてノード［１］側と判定された場合は、ステップＳ７１８に戻る。
【００９０】
ステップＳ７２２においてノード［０］側と判定されると、ステップＳ７２３に進み、配列番号に１を加算し、そのノードと対をなすノード［１］の配列番号を得る。そして、ステップＳ７２４で、検索開始ノードの配列番号に、ステップＳ７２３で得たノード［１］の配列番号を設定してステップＳ７１４に戻る。
【００９１】
上述のステップＳ７１４〜ステップＳ７２４のループ処理を、ステップＳ７１８で探索経路スタックのスタックポインタを１つ減らしながら、ステップＳ７１９で探索経路スタックから取り出した配列番号が終端番号であると判定されるまで繰り返す。探索経路スタックから取り出した配列番号が終端番号であれば、分類ツリーの全てのリーフノードについての処理が完了したので、処理を終了する。
【００９２】
上述の図７Ｂに示す分類ツリーに格納された分類キーを取り出す処理は、先に述べた特許文献４の図面第１０図に開示された、カップルドノードツリーからインデックスキーを昇順で取り出す処理（以下、先発明の処理ということがある）と類似したものである。図７Ｂに例示したフローでは、リーフノードを昇順で求めているが、降順で求めることによっても、各ブロックに分類されたキーを取り出せることは、当業者に明らかである。
なお、先発明ではリーフノードと連結するインデックスキーは１つであるのに対して、本発明ではリーフノードのキーリンク表に連結するインデックスキーは複数でありえるので、ステップＳ７１４において、リーフノードのキーリンク表に連結するインデックスキーを順次取り出す点で本質的に異なる。
【００９３】
次に、図８、図９Ａ〜図９Ｃを参照して、図７Ａに示すステップＳ７０４の分類キーにより、分類ツリーを生成する処理の詳細を説明する。
図８は、本発明の一実施の形態における分類キーにより分類ツリーを生成する全体の処理フロー例を説明する図である。  図８に示す処理の前提として、図７Ａに示すステップＳ７０３において、分類キーが一時記憶領域に設定されている。
【００９４】
図８に示すように、まずステップＳ８０１において、ルートノードの配列番号は登録済みか判定する。ルートノードの配列番号が登録済みでなければ、ステップＳ８０２以下の処理に進み、上記一時記憶領域に設定されている分類キーと連結するリーフノードをルートノードとする分類ツリーが新たに生成される。
【００９５】
ステップＳ８０２では、インデックスキーの管理領域の分類参照ポインタとキー管理ポインタを取得する。ここで取得される分類参照ポインタとキー管理ポインタは、インデックスキーの管理領域３２０をデータ格納装置３０８上に設定し、最初に用いるキー分類表のエントリとキーリンク表のエントリのアドレスをそれぞれ決めることにより得られるものである。
【００９６】
次にステップＳ８０３において、分類参照ポインタの指すキー分類表の先頭リンクと末尾リンクに、キー管理ポインタを、最小値キーと最大値キーに分類キーを書き込み、ステップＳ８０４において、キー管理ポインタの指すキーリンク表のキー参照ポインタに、図７ＡのステップＳ７０３でキーの読み出しに用いたキー参照ポインタを書き込む。
例えば、最初に処理される分類キーが、図２Ｂに例示する分類キー２７１ｄで、図５に示すキー分類表３２１の最初に用いるエントリを指す分類ポインタが２８０ｄ、キーリンク表３２２の最初に用いるエントリを指すキー管理ポインタが３７１ｄであるとすると、分類ポインタ２８０ｄの指すキー分類表３２１の最小値キー３１２ａと最大値キー３１２ｂに分類キー２７１ｄが、先頭リンク３１２ｃと末尾リンク３１２ｄにキー管理ポインタ３７１ｄが、それぞれ書き込まれ、キー管理ポインタ３７１ｄの指すキーリンク表３２２のキー参照ポインタ３１３ａに図２Ｂに示す参照ポインタ４８１ｄが、書き込まれる。
【００９７】
次にステップＳ８０５において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得し、ステップＳ８０６において、ステップＳ８０５で得た配列番号に０を加えた配列番号を求める。（実際には、ステップＳ８０５で取得した配列番号に等しい。)。
【００９８】
さらにステップＳ８０７において、ステップＳ８０６で得た配列番号の配列要素に、挿入するルートノードのノード種別に１（リーフノード)と分類参照ポインタにステップＳ８０２で得た分類参照ポインタを書き込み、ステップＳ８０８で、ステップＳ８０５で取得したルートノードの配列番号を登録して処理を終了する。
上述の最初に処理される分類キーがキー２７１ｄとすると、図６Ａに示すリーフノード２１０ｂが、最初に生成される分類キーとなる。なお、図５に示すキー分類表には分類参照ポインタ２８０ｄの指すエントリは記載されていないが、分類キーを順次挿入していく過程において、当初用いられていたキー分類表のエントリが他のエントリと結合されて用いられなくなる場合がある。
【００９９】
一方、ステップＳ８０１において、ルートノードの配列番号が登録済みであると判定されると、ステップＳ８０９に進み、ルートノードが登録済みである分類ツリーに分類キーを挿入することにより、新たな分類ツリーを生成して処理を終了する。ステップＳ８０９の処理の詳細は、次に図９Ａ〜図９Ｃを参照して説明する。
【０１００】
図９Ａは、本発明の一実施の形態における分類キーを分類ツリーに挿入する処理の初段の処理フロー例を示す図である。この初段の処理は、分類ツリーのルートノードを検索開始ノードとし、分類キーを検索キーとしてリーフノードを求める検索処理である。先に図６Ａを参照して説明したように、リーフノードに至る探索経路上のノードの階層に対応して探索経路カウンタのカウント値がカウントアップされる。
【０１０１】
図９Ａに示すように、まずステップＳ９０１で、配列番号に、ルートノードの配列番号を設定し、ステップＳ９０３に進む。
【０１０２】
ステップＳ９０３では、配列から、配列番号の指す配列要素をノードとして読み出し、ステップＳ９０４でノードから、ノード種別を取り出し、ステップＳ９０５でノード種別はブランチノードであるか否かを判定する。
【０１０３】
ステップＳ９０５の判定において、読み出したノードがブランチノードと判定された場合は、ステップＳ９０６に進み、ノードから弁別ビット位置を取り出し、更に、ステップＳ９０７で、取り出した弁別ビット位置に対応するビット値を分類キーから取り出す。そしてステップＳ９０８において、ノードから代表ノード番号を取り出す。さらにステップＳ９０９において、代表ノード番号に分類キーから取り出したビット値を加えて新たな配列番号を得て、ステップＳ９０２に戻る。
【０１０４】
以降、ステップＳ９０５の判定においてリーフノードと判定されてステップＳ９１０に進むまで、ステップＳ９０３〜ステップＳ９０９のループ処理を繰り返す。ステップＳ９１０では、リーフノードから分類参照ポインタを取り出し、図９Ｂに示すステップＳ９１１に進む。
【０１０５】
図９Ｂは、本発明の一実施の形態における分類キーを分類ツリーに挿入する処理の中段の処理フロー例を示す図である。この中段の処理は、初段の処理で求められたリーフノードのキーリンク表に連結しているキーと分類キーの値を比較し、分類キーをリーフノードのキーリンク表に連結するかを決定し、連結する場合は連結し、連結しない場合には、分類キーと連結するリーフノードを含むノード対の挿入位置を求める処理の準備を行うものである。
【０１０６】
図９Ｂに示すように、まずステップＳ９１１において、図９ＡのステップＳ９１０で取り出した分類参照ポインタの指すキー分類表の最小値キーと最大値キーを読み出す。次にステップ９１５に進み、分類キーは最小値キーより小さいか判定する。
【０１０７】
分類キーが最小値キーより小さくなければ、ステップＳ９１６において、さらに分類キーは最大値キーより大きいか判定する。ステップＳ９１６において、分類キーは最大値キーより大きくないと判定される、すなわち、分類キーの値が最小値キーと最大値キーの値の間であると判定されると、ステップＳ９１７で、分類キーを、リーフノードのキーリンク表に連結して挿入処理を終了する。ステップＳ９１７の処理の詳細は、後に図１１を参照して説明する。
【０１０８】
一方、ステップＳ９１６において、分類キーは最大値キーより大きいと判定されると、ステップＳ９１８に進み、インデックスキーに最大値を設定してステップＳ９２０に進む。
また、先に述べたステップＳ９１５において、分類キーは最小値キーより小さいとか判定されると、ステップＳ９１９において、インデックスキーに最小値を設定してステップＳ９２０に進む。
【０１０９】
ステップＳ９２０においては、分類キーとステップＳ９１８またはステップＳ９１９で設定されたインデックスキーとのビット列比較を例えば排他的論理和で行い、差分ビット列を得る。次にステップＳ９２１において、ステップＳ９２０で得た差分ビット列から、上位０ビット目から見た最初の不一致ビットのビット位置（差分ビット位置）を得る。この処理は、例えばプライオリティエンコーダを有するＣＰＵではそこに差分ビット列を入力し、不一致のビット位置を得ることができる。また、ソフト的にプライオリティエンコーダと同等の処理を行い最初の不一致ビットのビット位置を得ることも可能である。
【０１１０】
次にステップＳ９２２ａにおいて、挿入位置の配列番号に、ルートノードの配列番号を設定し、図９Ｃに示すステップＳ９２２ｂに進む。
【０１１１】
図９Ｃは、本発明の一実施の形態における分類キーを分類ツリーに挿入する処理の後段の処理フロー例を示す図である。この後段の処理は、図９Ｂに示す中段の処理においてなされた準備に基づいて、分類キーをリーフノードのキーリンク表に連結するものである。
【０１１２】
図９Ｃに示すように、まずステップＳ９２２ｂにおいて、探索経路カウンタに、初期値として０を設定してステップＳ９２３に進む。
【０１１３】
ステップＳ９２３では、探索経路カウンタのカウント値を１つ増やす。次にステップＳ９２４ａにおいて、配列から、挿入位置の配列番号の指す配列要素をノードとして読み出し、ステップＳ９２４ｂにおいて、ノードから、ノード種別を取り出してステップＳ９２５に進む。
【０１１４】
ステップＳ９２５では、ステップＳ９２４ｂで取り出したノード種別はブランチノードを示すか判定する。ノード種別がブランチノードを示すものではない、すなわちリーフノードを示すものであれば、ステップＳ９３２に進む。
【０１１５】
一方、ノード種別がブランチノードを示すものであればステップＳ９２６に進み、ノードから弁別ビット位置を取り出し、ステップＳ９２７において、弁別ビット位置はステップＳ９２１で得た差分ビット位置より上位の位置関係か判定する。弁別ビット位置が差分ビット位置より上位でなければ、ステップＳ９３５に進む。
【０１１６】
一方、弁別ビット位置が差分ビット位置より上位であれば、ステップＳ９２８ａに進む。ステップＳ９２８ａでは、分類キーから、弁別ビット位置の指すビット値を取り出し、ステップＳ９２８ｂでノードから、代表ノード番号を取り出す。そして、ステップＳ９２９において、その代表ノード番号にステップＳ９２８ａで得た値を加えた値を、挿入位置の配列番号に設定してステップＳ９２３に戻る。
【０１１７】
上述のステップＳ９２３〜ステップＳ９２９のループ処理を、ステップＳ９２５でノード種別がリーフノードのものと判定されるか、あるいはステップＳ９２７でブランチノードの弁別ビット位置が差分ビット位置より上位でないと判定されるまで、ルートノードからの探索を繰り返す。ステップＳ９２５あるいはステップＳ９２７でループ処理から抜け出す直前のステップＳ９２９で設定された挿入位置の配列番号あるいはルートノードがリーフノードの場合はステップＳ９２２ａで設定された挿入位置の配列番号が、分類キーと連結するリーフノードを含むノード対の挿入位置を示すものである。
【０１１８】
上述のステップＳ９２３〜ステップＳ９２９のループ処理は、探索経路上のブランチノードをたどって、その弁別ビット位置と、分類キーとインデックスキーの差分ビット位置との相対的位置関係を判定するために、図９Ａに示す検索処理と同様に、検索開始ノードであるルートノードからリーフノードに向かって探索経路を再度たどるものである。
【０１１９】
上記ステップＳ９２５で、ステップＳ９２４で取り出したノード種別はリーフノードを示すものであると判定されると、ステップＳ９３２に進み、探索経路カウンタは分類ツリーの最大段数の値である最大値を示しているか判定する。
【０１２０】
探索経路カウンタのカウント値は最大値ではないと判定されると、ステップＳ９３３に進み、分類キーを、挿入位置に挿入して挿入処理を終了する。挿入位置のノードがリーフノードであって探索経路カウンタのカウント値は最大値ではない状態の一例は、先に図６Ａを参照して説明した状態である。そして、分類キーを、挿入位置に挿入した状態の一例は、図６Ｂに示すものである。
ステップＳ９３３の処理の詳細は、後に図１０を参照して説明する。
【０１２１】
一方、ステップＳ９３２で、探索経路カウンタのカウント値が最大値であると判定されると、ステップＳ９３４に進み、分類キーを、リーフノードのキーリンク表に連結して挿入処理を終了する。この探索経路カウンタのカウント値が最大値である状態の一例は、先に図６Ｂを参照して説明した状態である。そして、分類キーを、リーフノードのキーリンク表に連結した状態の一例は、図６Ｃに示すものである。
なお、リーフノードの直近上位のブランチノードの弁別ビット位置までの上位のビット値は、同一のブロックに分類されるどのキーでも一致し、リーフノードの直近上位のブランチノードの弁別ビット位置までに異なるビット値のあるキーは、他のブロックに分類されることから、ステップＳ９３４において分類キーをリーフノードに連結しても、各ブロックに分類された分類キーの値の範囲に重複が生じることはない。
ステップＳ９３４の処理の詳細は、後に図１１を参照して説明する。
【０１２２】
先に述べたステップＳ９２７において、弁別ビット位置はステップＳ９２１で得た差分ビット位置より上位の位置関係ではないと判定されると、ステップＳ９３５に進む。
【０１２３】
ステップＳ９３５では、分類キーを挿入位置に挿入したときに、分類ツリーの段数が制限を超えないことを保証する処理を行う。すなわち、挿入位置に分類キーを挿入したときに、挿入位置より下位のリーフノードの段数が最大値を越さないかチェックを行い、制限を越すリーフノードがあれば、そのリーフノードを含むノード対の親ノードをリーフノードとし、該ノード対を構成するリーフノードのキーリンク表に連結するキーを、リーフノードとした親ノードのキーリンク表に連結することを、挿入位置より下位のリーフノードのすべてについて行う。このステップＳ９３５の処理により、挿入位置に分類キーを挿入しても、分類ツリーの段数が最大値を越えることはない。
【０１２４】
挿入位置に分類キーを挿入したときに、挿入位置より下位のリーフノードの段数が最大値を越える状態の一例は、先に図６Ｃを参照して説明した状態である。図６Ｃに示す状態では、挿入位置の下位のリーフノード２１０ｄにおける探索経路カウンタの値は最大値の３となっている。
【０１２５】
そして、リーフノード２１０ｄを含むノード対２０１ｄの親ノード２１０ｂをリーフノードとして、リーフノード２１０ｄのキーリンク表に連結するキー２７０ｅ、２７１ｅとリーフノード２１０ｄを含むノード対２０１ｄのもう一方のリーフノード２１１ｄのキーリンク表に連結するキー２７１ｄとを、リーフノードとした親ノード２１０ｂのキーリンク表に連結した状態の一例は、図６Ｄに示すものである。
ステップＳ９３５の詳細は、後に図１２を参照して説明する。
【０１２６】
ステップＳ９３５に続いて、ステップＳ９３６に進み、先に述べたステップＳ９３３と同じく、分類キーを挿入位置に挿入して挿入処理を終了する。リーフノードを含むノード対の親ノードをリーフノードとし、該ノード対を構成するリーフノードのキーリンク表に連結するキーをリーフノードとした親ノードのキーリンク表に連結することにより、探索経路カウンタの値を最大値から１つ減らし、分類キーを挿入位置に挿入した状態の一例は、先に図６Ｅを参照して説明した状態である。
ステップＳ９３６の処理の詳細は、先にステップＳ９３３について述べたように、次に図１０を参照して説明する。
【０１２７】
図１０は、本発明の一実施の形態における分類キーを挿入位置に挿入する処理フロー例を示す図であり、図９Ｃに示すステップＳ９３３及びステップＳ９３６の詳細な処理を説明するものである。
【０１２８】
図１０に示すように、まずステップＳ１００１において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。次にステップＳ１００２に進み、分類キーと図９Ｂに示す処理で設定したインデックスキーの大小を比較し、分類キーが大きいときは値１を小さいときは値０のブール値を得る。
【０１２９】
さらに、ステップＳ１００３に進み、ステップＳ１００１で得た代表ノードの配列番号にステップＳ１００２で得たブール値を加算した配列番号を得る。また、ステップＳ１００４において、ステップＳ１００１で得た代表ノードの配列番号にステップＳ１００２で得たブール値の論理否定値を加算した配列番号を得る。
【０１３０】
次にステップＳ１００５に進み、インデックスキーの管理領域の分類参照ポインタとキー管理ポインタを取得する。ここでインデックスキーの管理領域の分類参照ポインタとキー管理ポインタを取得するのは、挿入する分類キーを含むリーフノードに対応するキー分類表とキーリンク表のエントリを確保するためである。
【０１３１】
キーリンク表のエントリ数は分類対象のキーの数であるから、分類対象のキーの数だけ空きエントリの領域を予めインデックスキーの管理領域に確保しておき、取得要求があるたびに順次空きエントリの先頭アドレスをキー管理ポインタとして渡すことにより、キー管理ポインタの取得を実行することができる。
【０１３２】
キー分類表のエントリ数は、最終的に必要な数はキーを分類するブロック数、言い換えれば分類ツリーのリーフノードの数であるが、キーリンク表と同様に分類対象のキーの数だけ空きエントリの領域を予めインデックスキーの管理領域に確保しておき、取得要求があるたびに順次空きエントリの先頭アドレスを分類参照ポインタとして渡すことにより、分類参照ポインタの取得を実行することができる。
【０１３３】
先に図９Ｃに示すステップＳ９３５の説明において述べた、リーフノードを含むノード対の親ノードをリーフノードとし、該ノード対を構成するリーフノードのキーリンク表に連結するキーを、リーフノードとした親ノードのキーリンク表に連結する処理によって不要となったエントリは、削除されることになる。
【０１３４】
次にステップＳ１００６において、ステップＳ１００５で取得した分類参照ポインタの指すキー分類表の先頭リンクと末尾リンクにステップＳ１００５で取得したキー管理ポインタを、最小値キーと最大値キーに分類キーを書き込み、ステップＳ１００７において、キー管理ポインタの指すキーリンク表のキー参照ポインタに、インデックスキーの記憶領域のキー参照ポインタを書き込む。インデックスキーの記憶領域のキー参照ポインタは、図７Ａに示すステップＳ７０１あるいはステップＳ７０５で設定されたものである。
【０１３５】
次にステップＳ１００８において、ステップＳ１００３で得た配列番号の指す配列要素のノード種別に１（リーフノード)を、分類参照ポインタにステップＳ１００５で得た分類参照ポインタを書き込む。
【０１３６】
ステップＳ１００９に進み、配列から挿入位置の配列番号の配列要素の内容を読み出し、ステップＳ１０１０において、ステップＳ１００４で得た配列番号の指す配列要素に、ステップＳ１００９で読み出した内容を書き込む。ここで、挿入位置の配列番号は、図９Ｃに示すステップＳ９２９で設定されたものである。
【０１３７】
最後にステップＳ１０１１において、挿入位置の配列番号の指す配列要素のノード種別に０(ブランチノード）を、弁別ビット位置に図９Ｃに示すステップＳ９２１で得た差分ビット位置を、代表ノード番号にステップＳ１００１で得た代表ノード番号を書き込み、処理を終了する。
【０１３８】
以上説明した図１０に示す処理フロー例に、先に説明した図６Ａ及び図６Ｂの例示を対応付けると、ステップＳ１００１で得た代表ノード番号は図６Ｂに示すノード２１０ｂの代表ノード番号２２０ｂ、ステップＳ１００２で得たブール値は０、ステップＳ１００８で生成したリーフノードは図６Ｂに示すノード２１０ｄ、ステップＳ１００９で読み出した配列要素の内容は図６Ａに示すノード２１０ｂ、ステップＳ１０１０で生成したノードは図６Ｂに示すノード２１１ｄ、ステップＳ１０１１で生成したブランチノードは図６Ｂに示すノード２１０ｂである。
【０１３９】
図１１は、本発明の一実施の形態における、分類キーをリーフノードのキーリンク表に連結する処理フロー例を示す図であり、図９Ｂに示すステップＳ９１７及び図９Ｃに示すステップＳ９３４の詳細な処理を説明するものである。分類キーをリーフノードのキーリンク表に連結する処理は、分類ツリーには変更を加えることなく、インデックスキーの管理領域のキー分類表とキーリンク表を書き換えることにより行われる。
【０１４０】
図１１に示すように、まずステップＳ１１０１において、インデックスキーの管理領域のキー管理ポインタを取得する。次にステップＳ１１０２に進み、キー管理ポインタの指すキーリンク表のキー参照ポインタに、インデックスキーの記憶領域のキー参照ポインタを書き込む。
【０１４１】
次にステップＳ１１０３に進み、図９Ａに示すステップＳ９１０において取り出した分類参照ポインタの指すキー分類表の末尾リンクを読み出し、ステップＳ１１０４において、末尾リンクの指すキーリンク表のリンクに、ステップＳ１１０１で取得したキー管理ポインタを書き込む。そして、ステップＳ１１０５に進み、さらにキー管理ポインタを、図９Ａに示すステップＳ９１０において取り出した分類参照ポインタの指すキー分類表の末尾リンクに書き込む。
【０１４２】
次にステップＳ１１０６において、図９Ａに示すステップＳ９１０において取り出した分類参照ポインタの指すキー分類表の最小値キーと最大値キーを読み出し、ステップＳ１１０７において、分類キーは最小値キーより小さいか判定する。
【０１４３】
分類キーが最小値キーより小さければ、ステップＳ１１０８において、図９Ａに示すステップＳ９１０において取り出した分類参照ポインタの指すキー分類表の最小値キーに分類キーを書き込み、処理を終了する。
【０１４４】
分類キーが最小値キーより小さくなければ、ステップＳ１１０９において、分類キーは最大値キーより大きいか判定する。分類キーが最大値キーより大きくなければ処理を終了し、分類キーが最大値キーより大きければ、ステップＳ１１１０において、図９Ａに示すステップＳ９１０において取り出した分類参照ポインタの指すキー分類表の最大値キーに分類キーを書き込み、処理を終了する。
なお、上述の図１１に例示する処理フローは、図９Ｂに示すステップＳ９１７と図９Ｃに示すステップＳ９３４の処理に共通のものとしているが、図９Ｂに示すステップＳ９１７の処理は分類キーの値が最小値キーの値と最大値キーの値の範囲内であることを前提としているので、図９Ｂに示すステップＳ９１７の処理としては、ステップＳ１１０１〜ステップＳ１１０５の処理とすることもできる。
【０１４５】
図１２は、本発明の一実施の形態における分類キーを挿入位置に挿入したときに、分類ツリーの段数が制限を超えないための準備を行う処理フロー例を説明する図であり、図９Ｃに示すステップＳ９３５の詳細な処理を説明するものである。先に図９Ｃを参照して説明したように、図１２に示す処理は、探索経路上の、ステップＳ９２９で設定された挿入位置の配列番号の指す配列要素に配置されたブランチノードの弁別ビット位置が、ステップＳ９２１で得た差分ビット位置より上位の位置関係ではないと判定されときに実行される。
【０１４６】
そして、挿入位置に分類キーを挿入したときに、挿入位置より下位のリーフノードの段数が最大値を越さないかチェックを行い、制限を越すリーフノードがあれば、そのリーフノードを含むノード対の親ノードをリーフノードとして、該親ノードのキーリンク表に、該ノード対を構成するリーフノードのキーリンク表に連結しているキーを連結することを、挿入位置より下位のリーフノードの全てについて行う。
【０１４７】
そこで、図１２に示す処理においては、挿入位置より下位のリーフノードを全て巡回するために、先に図７Ｂを参照して説明した分類ツリーに格納された分類キーを取り出す処理と同様に、本願と同一の出願人の出願に係る、特許第４２７１２２７号の図面第１０図に開示された、カップルドノードツリーからインデックスキーを昇順で取り出す処理と類似した処理を行う。
【０１４８】
図１２に示すように、まずステップＳ１２０１において、検索開始ノードの配列番号に、挿入位置の配列番号を設定し、ステップＳ１２０４に進む。ステップＳ１２０４においては、検索開始ノードより配列を検索し、インデックスキーの最小値を含むリーフノードを求める。ここで、挿入位置の配列番号は、図９Ｃに示すステップＳ９２９で設定されたものである。ステップＳ１２０４の処理の詳細は、後に図１３を参照して説明する。
【０１４９】
次にステップＳ１２０５において、探索経路カウンタのカウント値は最大値か判定する。ここで探索経路カウンタのカウント値は、ステップＳ１２０４でリーフノードを求める際にカウントされるものであり、そこで求められたリーフノードが分類ツリーの何段目にあるかを示すものである。
【０１５０】
ステップＳ１２０５において、探索経路カウンタのカウント値が最大値ではないと判定されると、ステップＳ１２０６に進み、探索経路スタックから配列番号を取り出し、探索経路スタックのスタックポインタを１つ減らし、ステップＳ１２０９に進む。ステップＳ１２０６で探索経路スタックから取り出される配列番号は、ステップＳ１２０４において求めた、インデックスキーの最小値を含むリーフノードが配置された配列要素の配列番号か、ステップＳ１２０６〜ステップＳ１２１２ａのループ処理の１回前のループにおけるステップＳ１２０６で１つ減らしたスタックポインタの指す配列番号である。
【０１５１】
一方、ステップＳ１２０５において、探索経路カウンタのカウント値は最大値であると判定されると、ステップＳ１２０７に分岐する。ステップＳ１２０７では、探索経路スタックから、探索経路スタックのスタックポインタの値を１つ減らして配列番号を取り出し、取り出した配列番号を親ノードの配列番号に設定する。ここでの親ノードは、ステップＳ１２０４において求めた、インデックスキーの最小値を含むリーフノードの直近上位のノードである。あるノードの直近上位のノードをそのノードの親ノードといい、直近下位のノードを子ノードという。
【０１５２】
次にステップＳ１２０８において、ステップＳ１２０４で求めたリーフノードのキーリンク表に連結したキーと、そのリーフノードと対をなすリーフノードのキーリンク表に連結したキーとに連結するリーフノードを、ステップＳ１２０６で設定した配列番号、すなわち親ノードの配列要素に書き込む。言い換えれば、ステップＳ１２０４で求めたリーフノードの直近上位のブランチノード（親ノード）をリーフノードとし、リーフノードとした親ノードのキーリンク表に、ステップＳ１２０４で求めたリーフノードのキーリンク表に連結したキーと、そのリーフノードと対をなすリーフノードのキーリンク表に連結したキーを連結する。
ステップＳ１２０８の処理の詳細は、後に図１４を参照して説明する。
【０１５３】
次にステップＳ１２０８ａにおいて、探索経路カウンタのカウント値を１つ減らし、ステップＳ１２０９に進む。ここで探索経路カウンタのカウント値を１つ減らすのは、上記ステップＳ１２０７の処理で親ノードをリーフノードとしたことにより、リーフノードの段数が１つ減ったからである。この処理により、再度ステップＳ１２０４において最小値検索を行うときの探索経路カウンタのカウント値を、探索経路の段数と一致させることができる。
【０１５４】
ステップＳ１２０９では、ステップＳ１２０６で取り出した配列番号あるいはステップＳ１２０７が挿入位置の配列番号であるか判定する。判定の結果、挿入位置の配列番号であれば、挿入位置のノードより下位の全てのリーフノードについての処理が完了しているので、連結処理を終了する。判定の結果、挿入位置の配列番号でなければ、ステップＳ１２１１に進む。
【０１５５】
ステップＳ１２１１では、ステップＳ１２０６あるいはステップＳ１２０７で取り出した配列番号から、その配列番号のノードがノード対のどちらの配列要素に格納されているかのノード位置を得る。例えばノード［０］については偶数番号の配列の配列要素に格納する等により、配列番号からノード位置を求めることができる。
【０１５６】
そして、ステップＳ１２１２で、ステップＳ１２１１で得たノード位置がノード［１］側であるか否かを判定する。ステップＳ１２１２においてノード［１］側と判定された場合は、ステップＳ１２１２ａにおいて探索経路カウンタのカウント値を１つ減らしてステップＳ１２０６に戻る。
【０１５７】
ステップＳ１２１２においてノード［０］側と判定されると、ステップＳ１２１３に進み、配列番号に１を加算し、そのノードと対をなすノード［１］の配列番号を得る。そして、ステップＳ１２１４で、検索開始ノードの配列番号に、ステップＳ１２１３で得たノード［１］の配列番号を設定してステップＳ１２０４に戻る。
【０１５８】
上述のステップＳ１２０４〜ステップＳ１２１４のループ処理を、ステップＳ１２０６で探索経路スタックのスタックポインタを１つ減らしながら、あるいはステップＳ１２０７〜ステップＳ１２０８ａの処理で親ノードをリーフノードとすることによりリーフノードの段数を減らしながら、ステップＳ１２０９で探索経路スタックから取り出した配列番号が挿入位置の配列番号であると判定されるまで繰り返す。
【０１５９】
図６Ｃに示す例のように、挿入位置のノードの直近下位のノードがリーフノードでその段数が最大値の場合、ステップＳ１２０４で、最小値を含むノードとしてノード２１０ｄが得られ、探索経路スタックには、挿入位置のノードの配列番号である２２０ａとノード２１０ｄが配置された配列要素の配列番号２２０ｂが格納される。探索経路カウンタのカウント値は最大値となっているので、ステップＳ１２０７では配列番号２２０ａが取り出され、ステップＳ１２０８、ステップＳ１２０８ａの処理に続いてステップＳ１２０９の判定において、配列番号は挿入位置の配列番号であると判定されて処理は終了する。
【０１６０】
仮に、分類ツリーの最大段数が４であると図６Ｃの例を変更すると、ステップＳ１２０５の判定によりステップＳ１２０６に進み、配列番号２２０ｂが探索経路スタックから取り出され、ステップＳ１２０９の判定は否定的なものとなり、ステップＳ１２１１、ステップＳ１２１２及びステップＳ１２１３を介してステップＳ１２１４に至る。ステップＳ１２１４において、検索開始ノードの配列番号に配列番号２２０ｂ＋１が設定され、ノード２１１ｄを検索開始ノードとしてステップＳ１２０４の最小値検索が行われ、インデックスキーの最小値を含むリーフノードとしてノード２１１ｄが得られる。そして、ステップＳ１２０６〜ステップＳ１２１２ａのループ処理が実行され、ステップＳ１２０６で挿入位置の配列番号２２０ａが取り出されるとステップＳ１２０９の判定により処理を終了する。
【０１６１】
最初の最小値検索が行われるときは、挿入位置のノードをルートノードとする部分木の最小値を含むリーフノードが探索されることから、そのリーフノードのノード位置はノード［０］側であり、同一ノード対を構成するノード［１］を検索開始ノードとして次の最小値検索が行われる。最後には、挿入位置のノードをルートノードとする部分木の最大値を含むリーフノードが探索さる。そのリーフノードのノード位置はノード［１］側であり、ステップＳ１２０６において探索経路スタックから挿入位置の配列番号が取り出されるまで、ステップＳ１２０６〜ステップＳ１２１２ａのループ処理が繰り返され、ステップＳ１２０９で配列番号は挿入位置の配列番号であると判定されて処理を終了する。
【０１６２】
図１３は、本発明の一実施の形態におけるインデックスキーの最小値を含むノードを検索する処理フロー例を説明する図であり、図１２に示すステップＳ１２０４の詳細な処理を説明するものである。
【０１６３】
図１３に、示すように、まずステップＳ１３０１において、配列番号に、検索開始ノードの配列番号を設定する。検索開始ノードの配列番号は、図１２に示すステップＳ１２０１、あるいはステップＳ１２１４で設定されている。
【０１６４】
次にステップＳ１３０２において、探索経路スタックに配列番号を格納する。そして、ステップＳ１３０３で、配列から配列番号の指す配列要素をノードとして読み出し、ステップＳ１３０４で、該読み出したノードからノード種別を取り出してステップＳ１３０５に進む。
【０１６５】
テップＳ１３０５では、ノード種別はブランチノードのものか判定し、ノード種別がブランチノードのものと判定されると、ステップＳ１３０５ａに進み、探索経路カウンタの値を１つ増やす。次にステップＳ１３０６に進み、ノードから配列の代表ノード番号を取り出し、ステップＳ１３０７で、取り出した代表ノード番号に値０を加算してその結果を新たな配列番号として、ステップＳ１３０２に戻る。
【０１６６】
以降、ステップＳ１３０５において、ステップＳ１３０４で取り出されたノードがリーフノードと判定されるまでステップＳ１３０２からステップＳ１３０７までの処理を繰り返し、ステップＳ１３０５で、ステップＳ１３０４で取り出されたノードがリーフノードと判定されると処理を終了する。
【０１６７】
なお、上述の図１３を参照して説明したインデックスキーの最小値を含むリーフノードを検索する処理では、カップルドノードツリーは配列に記憶されたものとして説明したが、カップルドノードツリーが配列に記憶されることは必須ではなく、ノード対を構成する２つのノードのうちの代表ノードのみあるいは代表ノードと隣接した記憶領域に配置されたノードのみをリンクしてリーフノードに至ることによりインデックスキーの最小値を含むリーフノードの検索が可能であることは明らかである。
【０１６８】
図１４は、本発明の一実施の形態におけるリーフノードを含むノード対の親ノードをリーフノードとして、該親ノードのキーリンク表に該ノード対のキーリンク表を連結する処理フロー例を説明する図であり、図１２に示すステップＳ１２０８の処理の詳細を説明するものである。リーフノードを含むノード対のキーリンク表を親ノードのキーリンク表に連結する処理においては、ノード対をなす各ノードに対応する分類参照ポインタは親ノードの分類参照ポインタに統合される。
【０１６９】
図１４に示すように、まずステップＳ１４０１において、配列から、親ノードの配列番号の指す配列要素をノードとして読み出し、ステップＳ１４０２で、該読み出したノードから、代表ノード番号を取り出す。図６Ｃの例示では、親ノード２１０ｂの代表ノード番号２２０ｂが取り出される。
【０１７０】
次にステップＳ１４０３に進み、代表ノード番号に値１を加えて、１側の配列番号を得る。そしてステップＳ１４０４において、配列から、１側の配列番号の指す配列要素をノードとして読み出し、ステップＳ１４０５において、ノードから、分類参照ポインタを取り出し、１側の分類参照ポインタに設定する。図６Ｃの例示では、配列番号２２０ｂ＋１の指すノード２１１ｄが読み出され、分類参照ポインタ２８０ｄが、一時的記憶領域である１側の分類参照ポインタに設定される。
【０１７１】
次にステップＳ１４０６に進み、代表ノード番号に値０を加えて、ノード位置０の配列番号を得る。そしてステップＳ１４０７において、配列から、０側の配列番号の指す配列要素をノードとして読み出し、ステップＳ１４０８において、ノードから、分類参照ポインタを取り出し、０側の分類参照ポインタに設定する。図６Ｃの例示では、配列番号２２０ｂの指すノード２１０ｄが読み出され、分類参照ポインタ２８０ｅが、一時的記憶領域である０側の分類参照ポインタに設定される。
【０１７２】
次にステップＳ１４０９において、１側の分類参照ポインタの指すキー分類表の、先頭リンクと末尾リンクと最大値キーを読み出し、１側の先頭リンクと１側の末尾リンクに設定するとともに、最大値キーを１側の最大値キーに設定する。
【０１７３】
次にステップＳ１４１０において、０側の分類参照ポインタの指すキー分類表の末尾リンクを読み出し、ステップＳ１４１１において、該読み出した末尾リンクの指すキーリンク表のリンクに、ステップＳ１４０９で設定した１側の先頭リンクを書き込む。そしてステップＳ１４１２において、０側の分類参照ポインタの指すキー分類表の末尾リンクに１側の末尾リンクを、最大値キーに１側の最大値キーを書き込む。
【０１７４】
以上の処理により、リーフノードとする親ノードの分類参照ポインタを０側の子ノードの分類参照ポインタとし、それに合わせたキーリンク表とキー分類表の書き換えが行われる。上記ステップＳ１４１１の、０側の分類参照ポインタの指すキー分類表の末尾リンクの指すキーリンク表のリンクに、１側の先頭リンクを書き込む処理は、０側のリーフノードのキーリンク表に連結したキーに続いて１側のリーフノードのキーリンク表に連結したキーへのリンクを設定するものである。
【０１７５】
次にステップＳ１４１３に進み、親ノードの配列番号の指す配列要素に、ステップＳ１４０７で読み出した内容を書き込む。図６Ｃ及び図６Ｄに示す例示では、図６Ｃに示すノード２１０ｄの内容が、図６Ｄに示すノード２１０ｂに書き込まれる。
【０１７６】
最後に、ステップＳ１４１４で、Ｓ１４０１で得た代表ノード番号の指すノード対を削除し、ステップＳ１４１５で、Ｓ１４０５で得た１側の分類参照ポインタの指すキー分類表のエントリを削除して処理を終了する。
【０１７７】
次に、図１５Ａ及び図１５Ｂを参照して、検索開始ノードより配列を検索し、インデックスキーの最小値を含むリーフノードを求め、リーフノードのキーリンク表に連結したインデックスキーを順次取り出す処理について説明する。図１５Ａ及び図１５Ｂに例示する処理フローは、図７Ｂに示すステップＳ７１４の処理の詳細を説明するものである。
【０１７８】
図１５Ａは、本発明の一実施の形態における、検索開始ノードより配列を検索し、インデックスキーの最小値を含むリーフノードを求め、リーフノードのキーリンク表に連結したインデックスキーを順次取り出す処理の前段の処理フロー例を説明する図である。図１５Ａに例示する前段の処理は、検索開始ノードより配列を検索し、インデックスキーの最小値を含むリーフノードを求め、リーフノードから、分類参照ポインタを取り出すものである。
【０１７９】
図１５Ａに示すように、まずステップＳ１５０１において、配列番号に、検索開始ノードの配列番号を設定する。ここで検索開始ノードの配列番号は、図７Ｂに示すステップＳ７１１で設定された分類ツリーのルートノードの配列番号か、ステップＳ７２４で設定されたノード［１］の配列番号である。
【０１８０】
次にステップＳ１５０１ａにおいて、探索経路スタックに配列番号を格納する。そして、ステップＳ１５０２に進み、配列から、配列番号の指す配列要素をノードとして読み出し、ステップＳ１５０３において、該読み出したノードから、ノード種別を取り出してステップＳ１５０４に進む。
【０１８１】
ステップＳ１５０４では、ステップＳ１５０３で取り出したノード種別はブランチノードを示すものか判定する。ノード種別がブランチノードを示すものであれば、ステップＳ１５０５に進み、ステップＳ１５０２で読み出したノードから、代表ノード番号を取り出し、ステップＳ１５０６において、該取り出した代表ノード番号に値０を加えて、配列番号を得て、ステップＳ１５０１ａに戻る。
【０１８２】
一方、ステップＳ１５０４において、ステップＳ１５０３で取り出したノード種別がリーフノードと判定されると、ステップＳ１５０８に進み、ステップＳ１５０２で読み出したノードから、分類参照ポインタを取り出して、図１５Ｂに示すステップＳ１５１１に進む。
【０１８３】
図１５Ｂは、本発明の一実施の形態における、検索開始ノードより配列を検索し、インデックスキーの最小値を含むリーフノードを求め、リーフノードのキーリンク表に連結したインデックスキーを順次取り出す処理の後段の処理フロー例を説明する図である。図１５Ｂに例示する後段の処理は、前段の処理で求めたインデックスキーの最小値を含むリーフノードのキーリンク表に連結するインデックスキーを順次取り出して出力先に出力するものである。
【０１８４】
図１５Ｂに示すように、ステップＳ１５１１において、図１５Ａに示すステップＳ１５０８で取り出した分類参照ポインタの指すキー分類表の先頭リンクと末尾リンク、キーの出力先を読み出し、ステップＳ１５１２において、読出ポインタに、該読み出した先頭リンクを設定する。
【０１８５】
次にステップＳ１５１３において、読出ポインタの指すキーリンク表のキー参照ポインタとリンクを読み出す。ここで読み出しポインタは、ステップＳ１５１２あるいは後記ステップＳ１５１６で設定されたものである。
【０１８６】
次にステップＳ１５１３ａにおいて、インデックスキーの格納領域より、ステップＳ１５１３で読み出したキー参照ポインタの指すキーを読み出し、ステップＳ１５１４において、該読み出したキーをステップＳ１５１１で読み出したキーの出力先に出力し、ステップＳ１５１５に進む。
【０１８７】
ステップＳ１５１５では、読出ポインタと末尾リンクは一致するか判定し、一致しなければステップＳ１５１６において、読出ポインタに、ステップＳ１５１３で読み出したリンクを設定してステップＳ１５１３に戻る。
【０１８８】
ステップＳ１５１５において、読出ポインタと末尾リンクが一致すると判定されると、図１５Ａに示す前段の処理で求めたインデックスキーの最小値を含むリーフノードのキーリンク表に連結するインデックスキーは全て出力先に出力されたので、処理を終了する。
【０１８９】
以上、本発明の実施の形態に係るビット列キーの分類手法と分配手法を実現する処理フローについて説明をした。これらの処理フローを図４に例示するデータ処理装置３０１のようなコンピュータに実行させるプログラムにより、本発明に係るビット列キー分類装置とビット列キー分配装置をコンピュータ上に構築可能なことは明らかである。
そこで、本発明に係るビット列キー分類装置とビット列キー分配装置の機能構成例について、以下に説明する。
【０１９０】
図１６は、本発明の一実施の形態におけるビット列キー分類・分配装置の機能ブロック構成例を説明する図である。
図１６に示すように、ビット列キー分類装置５００は、分類ツリー最大段数取得手段５１０、分類ツリー生成手段５２０、キー記憶手段５５０を含んで構成され、分類ツリー最大段数取得手段５１０で取得した最大段数の制限の中で、キー記憶手段５５０に記憶された分類対象のビット列キーを分類キーとして読み出し、分類ツリー５３０とキー位置検索表５４０を生成することにより、分類対象のビット列キーを分類する。
キー位置検索表５４０は、キー分類表３２１とキーリンク表３２２とすることができる。
【０１９１】
ビット列キー分配装置６００は、リーフノード取り出し手段６１０と分類キー出力手段６２０を含んで構成され、リーフノード取り出し手段６１０は分類ツリー５３０からリーフノードを順次取り出し、分類キー出力手段６２０は、リーフノード取り出し手段６１０が取り出したリーフノードからキーアクセス情報を読み出し、キーアクセス情報を用いてキー位置検索表からキーの位置情報を取り出し、キーの位置情報に基づいてキーを前記キー記憶手段から読み出して出力先に出力する。なお、キーの出力先は、分類処理の終了時にキー分類表に設定することもできるが、分類対象のキーを分類するブロックに対応して設定しておき、分類ツリーからリーフノードを取り出す毎に、決定することもできる。
【符号の説明】
【０１９２】
１００    配列
１０１    ノード
１０２    ノード種別
１０３    弁別ビット位置
１０４    代表ノード番号
１１０    キー列
１３０ａ  分類済みキー列
１４０    弁別ビット位置による分類（段数２の分類）
１１８ａ  参照ポインタ
２００    分類ツリー
２１０ａ  ルートノード
２２０    ルートノードの配列番号
２８０ｇ  分類参照ポインタ
３００    ビット列キー分類・分配装置
３０１    データ処理装置
３０２    中央処理装置
３０３    キャッシュメモリ
３０４    バス
３０５    主記憶装置
３０６    外部記憶装置
３０７    通信装置
３０８    データ格納装置
３０９    配列
３１０    探索経路スタック
３１１    インデックスキーの記憶領域
３２０    インデックスキーの管理領域
３２１    キー分類表
３２２    キーリンク表
３４０ａ  ビット列キーソート装置
３４７    ネットワーク
４００    カップルドノードツリー
５００    ビット列キー分類装置
５２０    分類ツリー生成手段
５３０    分類ツリー
５４０    キー位置検索表
５５０    キー記憶手段
６００    ビット列キー分配装置
６１０    リーフノード取り出し手段
６２０    分類キー出力手段
【図１】
2011095849.tif 000003
【図２Ａ】
2011095849.tif 000004
【図２Ｂ】
2011095849.tif 000005
【図３】
2011095849.tif 000006
【図４】
2011095849.tif 000007
【図５】
2011095849.tif 000008
【図６Ａ】
2011095849.tif 000009
【図６Ｂ】
2011095849.tif 000010
【図６Ｃ】
2011095849.tif 000011
【図６Ｄ】
2011095849.tif 000012
【図６Ｅ】
2011095849.tif 000013
【図７Ａ】
2011095849.tif 000014
【図７Ｂ】
2011095849.tif 000015
【図８】
2011095849.tif 000016
【図９Ａ】
2011095849.tif 000017
【図９Ｂ】
2011095849.tif 000018
【図９Ｃ】
2011095849.tif 000019
【図１０】
2011095849.tif 000020
【図１１】
2011095849.tif 000021
【図１２】
2011095849.tif 000022
【図１３】
2011095849.tif 000023
【図１４】
2011095849.tif 000024
【図１５Ａ】
2011095849.tif 000025
【図１５Ｂ】
2011095849.tif 000026
【図１６】
2011095849.tif 000027