(57)【特許請求の範囲】
【請求項１】
記憶手段と、前記記憶手段内の記憶データの検索のための動的データ構造とを有するコンピュータシステムであって、前記データ記憶手段が、
少なくとも１つのレベルで構成されている前記記憶手段内に記憶された階層木構造と、
前記木構造内で相互連結されている記入項目であって、前記記入項目の各々が、前記木構造内のそうした記入項目を索引付ける対応する深さ値要素と、対応するデータ有り表示子とを含み、前記少なくとも１つのレベルのうちの１つにおける前記記入項目の各データ有り表示子は、対応データ項目が前記記憶データに含まれており且つ前記少なくとも１つのレベルの一つにおける前記記入項目の対応する一つに関係付けられているかどうかを表示する
コンピュータシステム。
【請求項２】
前記木構造が更に、前記記憶データ内の前記対応データ項目に関連付けられた幾つかの前記記入項目の記憶されたカウントも含む請求項１に記載のコンピュータシステム。
【請求項３】
前記記憶データ内の前記対応データ項目が探索キーによって検索され、前記探索キーが前記記憶データの対応データ項目の記憶されたカウントも含む請求項１に記載のコンピュータシステム。
【請求項４】
対応する前記データ項目が前記記憶データ内に含まれていることを表示する前記データ有り表示子を有する前記少なくとも１つのレベルの１つにおける前記記入項目の対応する一つを各対応データ項目に関連付けるためのポインタ構造を更に含む請求項１に記載のコンピュータシステム。
【請求項５】
前記データ記憶構造が更に、前記木構造内のキー区間範囲を定義する少なくとも１つの前記記入項目を含む少なくとも１つの索引ブロックも含む請求項１に記載のコンピュータシステム。
【請求項６】
前記少なくとも１つの索引ブロックが前記木構造内の少なくとも１つの更に別の索引ブロックとに連結されている根レベル索引ブロックを有し、前記更に別の索引ブロック内の前記記入項目の少なくとも一つが前記記憶データ内の対応データ項目に関連付けられている請求項５に記載のコンピュータシステム。
【請求項７】
前記更に別の索引ブロック内の少なくとも１つの前記記入項目内の前記データ有り表示子が、前記記憶データ内の対応データ項目の存在を表示する請求項６に記載のコンピュータシステム。
【請求項８】
根索引ブロックが、前記更に別の索引ブロック各々毎に少なくとも１つの前記記入項目を含み、前記根索引ブロックの各記入項目の深さ値要素が、前記対応する前記更に別の索引ブロック内の前記記入項目の深さ値要素によって表される最小値を表す請求項６に記載のコンピュータシステム。
【請求項９】
前記記憶データ内の対応するデータ項目の存在を表示するデータ有り表示子を有する更に別の索引ブロック内の記入項目の数を表示するカウントを更に含む請求項７に記載のコンピュータシステム。
【請求項１０】
前記木構造が、前記少なくとも１つの索引ブロックの少なくとも１つを含む少なくとも１つの部分木から構成されている請求項５に記載のコンピュータシステム。
【請求項１１】
前記少なくとも１つのレベルの中の１つのレベルの記入項目以外の各々の記入項目が、前記木構造の前記少なくとも１つの部分木の中の１つの部分木の１つの索引ブロックに関係付けられている請求項１０に記載のコンピュータシステム。
【請求項１２】
記憶手段と、前記記憶手段内の記憶データの検索のための木構造とを備え、該木構造は、深さ値とデータ有り表示子とを各々に含む少なくとも１つの記入項目を有する少なくとも１つの索引ブロックを含み、各々の索引ブロックがキー区間を定義するものであるコンピュータにおいて、複数の探索キーを逐次処理するための方法であって、
前記コンピュータ内のバッファの中に複数の探索キーをフェッチする段階、
前記コンピュータのバッファ内で前記複数の探索キーを辞書順にソートする段階、並びに、
現在索引ブロックを判定することと、事前定義された機能を行うことと、前記バッファ内の１つの探索キーの後に続く前記複数の探索キーのうちの別の探索キーが現在索引ブロックのキー区間内にあるかどうかを判定することとによって、前記複数の探索キーの各々を逐次処理する段階
を含む方法。
【請求項１３】
前記逐次処理段階が更に、別の探索キーを処理するためのキービット位置を判定する段階も含む請求項１２に記載の方法。
【請求項１４】
事前定義された機能を行う前記段階が、前記１つの探索キーを位置指定する段階を含む請求項１２に記載の方法。
【請求項１５】
記入項目の各々が別のキー区間を定義し、前記位置指定段階が、前記１つの探索キーに対応する木構造内の別のキー区間を位置指定する段階を含む請求項１２に記載の方法。
【請求項１６】
事前定義された機能を行う前記段階が、前記木構造内の前記１つの探索キーに関する索引付け情報を挿入する段階を含む請求項１２に記載の方法。
【請求項１７】
空ストリングを処理する段階を更に含む請求項１２に記載の方法。
【請求項１８】
前記空ストリングを処理する段階が、
前記記憶手段内に記憶された記憶データの第１の項目が空ストリングを含むかどうかを判定する段階、
前記バッファの第１の位置が空ストリングを含むかどうかを判定する段階、及び、
前記記憶手段内に記憶された第１の要素が空ストリングを含まないと判定し、前記第１の位置が空ストリングを含むと判定した後に、前記記憶手段内の前記第１の記憶要素に前記空ストリングを記憶する段階
を含む請求項１７に記載の方法。
【請求項１９】
前記逐次処理段階が更に、
現在索引ブロック内の記入項目の量を判定する段階、
予め決められた最大索引ブロック数より前記量が大きいかどうかを判定する段階、及び、
予め決められた最大索引ブロック数より前記量が大きいと判定し、別の探索キーが現在索引ブロックのキー区間内に存在しないと判定した後に、現在索引ブロックを分割する段階
も含む請求項１２に記載の方法。
【請求項２０】
前記逐次処理段階が更に、
現在索引ブロック内の記入項目の量を判定する段階、
前記量が記入項目の最大数より大きいかどうかを判定する段階、及び、
前記量が前記最大数より大きいと判定した後に現在索引ブロックを分割する段階を含む請求項１２に記載の方法。
【請求項２１】
記憶手段と、記憶データの検索のための木構造と、順序要素から構成されるシーケンスとを含み、前記木構造が少なくとも１つの記入項目を含み、且つ、前記記憶手段内の探索キーを表示するための深さ値とデータ有り表示子とを記入項目の各々が含むコンピュータにおける、前記木構造によって索引付けられた探索キーを位置指定するために前記コンピュータを使用する方法であって、
前記探索キーの各々の順序値を前記シーケンスの各順序要素の中にコンパイルする段階４０２、５０１）、
前記シーケンスの前記順序要素の１つに対する予め決められた関係を有する深さ値をどの記入項目が含むか判定する段階、
前記記憶データ内に含まれる対応データ項目を前記表示子が表示する記入項目の各々のカウントを判定する段階、及び、
前記カウントに基づいて前記木構造によって索引付けられた探索キーを位置指定する段階
を含む前記方法。
【請求項２２】
前記各順序要素の中にコンパイルする段階が更に、有限な２つのアルファベット文字から構成される探索キーの各順序値を判定する段階を含む請求項２１に記載の方法。
【請求項２３】
前記各順序値を判定する段階が、２進表現から構成される探索キーの各順序値を判定する段階を含む請求項２２に記載の方法。
【請求項２４】
どの記入項目が深さ値を含むか判定する段階が、前記シーケンスの順序要素の１つよりも小さい深さ値をどの記入項目が含むか判定する段階を含む請求項２１に記載の方法。
【請求項２５】
記憶手段と記憶データの検索のための木構造を含み、前記木構造が、各々が深さ値と表示子を含む少なくとも１つの記入項目を各々が有する少なくとも１つの索引ブロックを含み、且つ、前記記入項目の各々がキー区間を定義し、葉記入項目または非葉記入項目を更に含むコンピュータにおける、前記木構造内の探索キーに関する索引付け情報を記憶するための方法であって、
その葉記入項目によって定義されるキー区間内に探索キーが帰属する、葉記入項目を求めて木構造をくまなく探索する段階、
前記木構造内の前記葉記入項目に関係した探索キーの索引付け情報を記憶するための正しい配置を判定する段階、
正しい配置に対応する記入項目に対して前記記憶手段内の記憶要素を関連付ける段階、及び、
対応データ項目が前記記憶手段内に記憶されていることを表示するように前記記入項目の前記表示子を設定する段階
を含む前記方法。
【請求項２６】
索引ブロックの各々が更に、葉索引ブロックまたは非葉索引ブロックを含み、索引ブロックの各々が第２のキー区間を定義し、且つ、前記探索段階が、
前記葉索引ブロックによって定義された前記第２のキー区間内に前記探索キーが含まれる前記葉索引ブロックを求めて前記木構造をくまなく探索する段階、及び、
前記葉記入項目によって定義された前記キー区間内に前記探索キーが含まれる前記葉記入項目を求めて葉索引ブロックをくまなく探索する段階
を含む請求項２５に記載の方法。
【請求項２７】
記憶手段と、前記記憶手段内での記憶データの検索のための木構造とを含み、前記木構造が、深さ値とデータ有り表示子とを各々が含む少なくとも１つの記入項目を各々が有する少なくとも１つの索引ブロックを含み、且つ、前記索引ブロックの各々がアクセス情報に関連付けられているコンピュータにおける、１つの索引ブロックを分割するための方法であって、
前記１つの索引ブロック内の最小深さ記入項目を判定する段階、
前記木構造内に新たな索引ブロックを生じさせる段階、
最小深さ記入項目と、前記１つの索引ブロック内の最小深さ記入項目に先行し且つこれを含む各記入項目とを、前記１つの索引ブロックに割り当てる段階、
前記１つの索引ブロック内の最小深さ記入項目に先行する各記入項目を前記新たな索引ブロックに割り当てる段階、
親索引ブロック内に前記１つの索引ブロックと前記新たな索引ブロックとに関連した情報を記憶する段階、及び、
前記１つの索引ブロックと前記新たな索引ブロックと親索引ブロックのアクセス情報を記憶する段階
を含む前記方法。
【請求項２８】
前記情報記憶段階が、親索引ブロック内に前記１つの索引ブロックと前記新たな索引ブロックとの最終深さ値を記憶する段階を含む請求項２７に記載の方法。
【請求項２９】
各索引ブロックが、探索キーを索引付けるためのカウント構造の要素に関連付けられ、前記カウント構造が、前記記憶データ内の対応データ項目に連結した前記少なくとも１つの記入項目の幾つかを記憶することによって探索キーを索引付け、前記アクセス情報記憶段階が、前記１つの索引ブロックと前記新たな索引ブロックと前記親索引ブロックとに関連付けられた前記カウント構造の要素を更新する段階を含む請求項２７に記載の方法。
【発明の詳細な説明】
発明の分野
本発明は、コンピュータデータ及びファイル記憶システムと、コンピュータデータ及びファイル記憶システムでのデータの索引付けとアクセスのための構造に係り、更に特に、０完全木のコンパクト表現を使用するための新規の構造と、こうした構造において探索キーの集まりを記憶及び検索するための方法とに係る。
発明の背景
データベースのようなデータ及びファイル記憶システム、特にコンピュータシステムで使用するデータ及びファイル記憶システムで繰り返し起こる問題は、データベース内に記憶された情報の特定の項目の探索と位置指定である。こうした探索は、ディレクトリすなわち索引をデータベースに作成することと、そのロケーションがコンピュータのメモリ上にあるか記憶媒体上にあるかに係らずデータベース内の情報の最有望な位置に対するポインタを発見するために、探索キーを使用して索引を探索することとによって行われることが一般的である。
その最も一般的な形態では、コンピュータ内のデータベース・レコードに対する索引は、そのコンピュータの記憶手段内に記憶されている、枝で結合された１つ以上のノードで構成された木として形成される。各々のノードは、一般的に、探索を誘導するための情報を収容する１つ以上の枝フィールドを含み、更に、こうした枝フィールドの各々が、一般的に、別のノードへのポインタすなわち枝と、ノードからの枝に沿って配置されることが可能な情報の範囲とタイプを示す関連した枝キーとを含む。木と、その木の探索は、根ノードと呼ばれる単一ノードで始まって、情報項目または（より一般的には）情報項目のポインタのいずれかを含むノードに達するまで様々な枝ノードを経由して下方に進む。情報関連ノードは、「葉ノード」、または、探索がそのノードのレベルで成功するか失敗するので「失敗ノード（ｆａｉｌｕｒｅ  ｎｏｄｅ）」と呼ばれることが多い。コンピュータの木記憶構造内では、木のあらゆるノードは、そのノードに従属している全てのノードに対して親ノードであり、その親ノードに従属している木の下位構造は、親ノードに対して部分木と呼ばれることが多い。
探索時に木記憶構造内を進む際の方向または枝に関する決定は、探索キーと、探索時に遭遇する各ノードに記憶された枝キーとを比較することによって行われる。所与のノードに従属する枝に対する比較の結果に従って、その探索の次の段階を行わなければならない。この点で、探索キーは、コンピュータシステム内で探索されなければならない情報項目に関連する文字ストリングまたは数字ストリングで構成されることが一般的である。
先行技術は、コンピュータデータベースシステム用の様々な探索木データ記憶構造を含み、こうした木データ記憶構造の中には、明らかに後続の木構造の全ての開発の基礎となっている原型であり且つ当業で公知の最も一般的な探索木の形態である「Ｂ木」が含まれている（例えば、Ｋｎｕｔｈ．Ｔｈｅ  Ａｒｔ  ｏｆ  Ｃｏｍｐｕｔｅｒ  Ｐｒｏｇｒａｍｍｉｎｇ，Ｖｏｌ．３，ｐｐ．４７３−４７９を参照されたい）。Ｂ木は、データセットに対する適切な一次アクセスと優れた二次アクセスの両方を可能にする。従って、当然のことながら、こうした木は、データベース及びファイルシステムで用いられることが多いデータ記憶構造で使用されることが意図されている。しかし、データベースシステムでＢ木記憶構造を使用する場合には問題点がある。すなわち、索引付き属性値は全て、索引自体において複製されなければならない。多数の二次探索値を複製することによる累積的効果は、データベース自体のサイズを越える場合が多い索引を生じさせることである。このオーバーヘッドのために、潜在的に有効なアクセス経路をデータベース設計者が拒否せざるを得なくなる可能性がある。更に、探索キー値をＢ木のブロック内に内含させることは、ブロック・ファンアウトを著しく減少させると共に、木深さと検索時間を著しく増大させる。
コンピュータデータベースシステムで使用可能な別の木構造であるコンパクト０完全木（即ち、Ｃ0木）は、大半の実際的なキー長さ（即ち、３２バイト未満）にとってその典型的な８ビットの長さが適切である小さな代替値で索引キー値を置き換えることによって、索引から探索値を除去する。従って、実効値を任意順序でいずれかの場所に格納し、その木構造に対する索引を、索引ブロック内に格納された（代替値、ポインタ）対の階層的集合の状態のままにしておくことが可能である。この構成は、索引のサイズを約５０％から８０％縮小させることが可能であると共に、その木の枝因子を増加させることが可能であり、これによって、コンピュータデータベースシステムにおける正確一致照会１回当たりのデータベースシステムのディスクアクセス回数の低減を可能にする。（Ｏｒｌａｎｄｉｃ  ａｎｄ  Ｐｆａｌｔｚ，Ｃｏｍｐａｃｔ  ０−Ｃｏｍｐｌｅｔｅ  Ｔｒｅｅｓ，Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  １４ｔｈ  ＶＬＤＢ  Ｃｏｎｆｅｒｅｎｃｅ，ｐｐ．３７２−３８１を参照されたい。）
Ｃ0木を生成するための公知の方法はＢ木に比べて記憶利用率を５０％から８０％増大させるが、その木の最低位レベルの索引記入項目の個数が記憶レコードの実際数よりも多いダミー記入項目（代替値、ポインタ＝ＮＩＬ）の存在のために、記憶空間の無駄がある。従って、最低位木レベルにおけるＣ0木の索引記入項目の予測上の記憶利用率は、Ｂ木の場合の記憶利用率０．６９３に対して０．５６７である。
更に、Ｂ木記憶構造とＣ0木記憶構造は代表的な効率の良い値探索方法であるが、これらの方法は両方とも木データ記憶構造自体の初期生成を必要とする。これらのコンピュータ記憶構造は両方とも、その構造に固有の形態でソート順に情報を記憶する。
キーレコードをランダムな順序でソートする場合よりも、キーレコードをそのキーフィールドの順序で最初にソートする場合の方が、より効率的に木を構築することが可能である。従って、効率の高いコンピュータデータベースシステムは、キーの集まりを最初にソートし、その後で、ソート済みのキーから飛び飛びに抽出したキーに基づいて木を構築すべきである。
キー値がソート順である場合には、記憶されるべき次のキー値は、現在葉索引ブロック（ｃｕｒｒｅｎｔ  ｌｅａｆ  ｉｎｄｅｘ  ｂｌｏｃｋ）すなわち部分木のキー値の範囲内である可能性がある。これに加えて、現在索引ブロックの所与のキー区間内の全てのキーが挿入されるまで、索引ブロック分割を据え置くことが可能である。従って、目標は、可能な限り効率的な方法でキー範囲間内に順序付けた形のキーレコードまたはデータ項目を効率的に入力する、データ記憶構造とデータ記憶方法を構築することである。特に、こうしたデータ記憶構造とデータ記憶方法は、無駄になる記憶空間を減少させると共に、入力時に、コンピュータの記憶媒体またはメモリの中に記憶されたデータ項目にアクセスする探索キーをソートしなければならない。この目標は、公知のＢ木コンピュータ記憶構造とＣ0木コンピュータ記憶構造の利点を維持すると同時に、その特性を利用することによって実現されなければならない。
発明の要約
本発明の実施様態の１つでは、コンピュータシステム内の記憶データを検索するために必要な情報の量を最少化するためのデータ記憶構造が、探索キーを索引付ける（ｉｎｄｅｘ）ための項目から構成される。各々の項目は、深さ値（ｄｅｐｔｈ  ｖａｌｕｅ）と、２つの条件を有するデータ有り表示子（ｄａｔａ  ｐｒｅｓｅｎｔ  ｉｎｄｉｃａｔｏｒ）とを含み、コンピュータ内に記憶された木構造が上記記入項目の各々を相互連結し、データ記憶構造を形成する。探索キーは、データ記憶構造によって索引付けられるデータレコードの２進表現であるか、または、データレコードのルックアップに使用される他の任意の属性もしくは属性の集まりであることが可能である。このデータ記憶構造は、更に、探索キー区間範囲に関連付けられた各記入項目のカウントを記憶するための手段も含む。
本発明の上記実施様態は、木データ記憶構造によって索引付けられたデータを記憶し、アクセスし、検索するための新規の方法を含む。これらの方法は、各探索キーに対して事前定義された機能を果たすように木構造内の幾つかの探索キーを逐次処理するための方法と、木構造内の探索キーを位置指定するための方法と、木構造内の探索キーに関する情報を記憶し索引付けるための方法と、本発明の索引ブロックを分割するための方法とを含む。
本発明の実施様態の１つは、記憶利用効率の向上をもたらし、上記のようにＢ木の記憶利用率を５０％から８０％上回るＣ0木の記憶利用率を更に上回る記憶利用率を実現する。最低位レベルにおいてＣ0木によって発生させられる記憶空間の無駄を解消するために、本発明の好ましい実施様態の１つは、コンピュータの記憶手段内の２つの別々の物理構造、即ち、（１）深さ値と２つの条件を有するデータ有り表示子とを含む代替値のリストに対する索引ブロック深さ構造と、（２）あらゆる非ＮＩＬポインタ値のリストを指定するポインタ構造とで、物理的に隣接した値の対としての（代替、ポインタ）項目の記憶域を置き換える。本発明のこの好ましい実施様態では、先行技術のＣ0木データ記憶構造のＮＩＬポインタ（即ち、ダミー項目）が、代替値自体の値のデータ無し表示子ビット（ｄａｔａ  ｎｏｔ  ｐｒｅｓｅｎｔ  ｉｎｄｉｃａｔｏｒ  ｂｉｔ）によって表現される。各部分木のメタデータも、ポインタ構造中の索引付きキーの各々に関する増分辞書順位置（ｉｎｃｒｅｍｅｎｔａｌ  ｌｅｘｉｃａｌ  ｐｏｓｉｔｉｏｎ）を累算するために、各部分木に関する非ＮＩＬ項目のカウントを反映する。ポインタ構造がＮＩＬポインタを全く含まないので、ＮＩＬポインタを表示するためには１ビットの記憶だけしか必要ではなく、最小のメタデータが記憶される。従って、記憶利用率は、Ｂ木の場合に予測される記憶利用率に戻る傾向がある。
更に、多重レベル木構造走査の非効率性を排除するために、本発明の好ましい実施様態のデータ記憶構造に加えられるべきキーが、ソート順に集合または１つ以上の項目として処理される。こうして、各キーに関して、根から葉への木のノードのより高度の参照の局地性と、走査及び維持の簡略化（索引ブロック分割を含む）とが実現される。現在索引ブロックのキー区間範囲内に次のキーが含まれるかどうかを判定することによって、事前定義された機能の処理を現在索引ブロックにおいて継続することが可能であり、または、その親ブロック内で再開することが可能である。この新たな方法では、索引ブロックの分割は、現在ブロックの処理全てが完了するか、ブロックサイズが通常の閾値よりも著しく大きい極端な最大値をとるまで、索引ブロックの分割が据え置かれ、従って、適切なキー全てが部分木に加えられ終わるまでその部分木の文脈保存を可能にする。
本発明の実施に関する説明としてだけ本発明の実施様態が示され説明される以下の詳細な説明から、本発明の更に別の実施様態が当業者に容易に明らかになるだろう。後に理解されるように、本発明は他の様々な実施様態で実施されることが可能であり、その幾つかの詳細事項は、本発明の思想から逸脱することなく、様々な明らかな点で変更が可能である。従って、次に示す添付図面と詳細な説明が本発明を例示する性質のものであって、本発明を限定するものではないことを理解されたい。
【図面の簡単な説明】
本発明の上記説明と構造及び特徴の全てと、その実施様態が、以下の説明と添付図面とから明らかになるだろう。
図１ａは、本発明が実施されるコンピュータシステムの略ブロック図である。
図１ｂは、本発明を実施するためのコンピュータ上のデータベースシステムの略ブロック図である。
図２ａは、先行技術の完全２分木の概念図である。
図２ｂは、先行技術の０完全２分木の概念図である。
図３ａは、データベース中に記憶された値に関する、先行技術のＣ0木索引構造の説明図である。
図３ｂは、分割が起こる前の図３ａのＣ0木の説明図である。
図４ａは、本発明のＣ0木の具体例を示す説明図である。
図４ｂは、図４ａのＣ0木の記憶コンテナ（ｓｔｏｒａｇｅ  ｃｏｎｔａｉｎｅｒ）の内容の詳細図である。
図５は、本発明によるＣ0木の３レベル実施様態の例を示す説明図である。
図６ａは、記憶構造のノードの例を示す説明図である。
図６ｂは、ＩＮＩＴノードの例を示す説明図である。
図７は、本発明の逐次処理手続きのフローチャートである。
図８は、本発明の葉探索手続きのフローチャートである。
図９は、本発明の葉挿入手続きのフローチャートである。
図１０は、本発明の枝探索手続きのフローチャートである。
図１１は、本発明の枝挿入手続きのフローチャートである。
図１２は、本発明の深さ探索手続きのフローチャートである。
図１３は、本発明のバルク処理手続きの説明図である。
図１４は、本発明のｂＫリセット機能の説明図である。
図１５は、本発明の深さ追加手続きのフローチャートである。
図１６ａは、本発明の根分割手続きのフローチャートである。
図１６ｂは、分割前の根レベルの説明図である。
図１６ｃは、分割後の根レベルの説明図である。
図１７は、本発明の子分割手続きのフローチャートである。
図１８は、本発明の最小深さ手続きのフローチャートである。
図１９は、本発明のノード分割手続きのフローチャートである。
これらの図で使う同じ番号及び名称は、同じ要素を表す。
詳細な説明
Ａ）コンピュータシステムの概観
図１ａは、プログラム可能コンピュータと、ファイルシステムを生成するためのコンピュータプログラムと、本発明によるファイルシステム操作処理のためのコンピュータプログラムとを有するコンピュータシステムを示す。このシステムは、プログラム可能コンピュータ１、ディスプレイ装置２、コンピュータ入力装置３、及び、記憶手段を含む。記憶手段は、磁気ディスク記憶システムまたはコンピュータのデータ記憶用メモリパーティションのような記憶装置４を含む。ファイルシステムを含むハードウェア及びソフトウェアと、後述の処理操作を行うためのハードウェア及びソフトウェアは、コンピュータ１に接続されたファイルシステム５（鎖線で示す）の形で実現される。コンピュータ１に接続されたシステム５は、そのファイルシステム内のデータの表現と、記憶装置４内に記憶された１つ以上のデータファイルに対する操作の実行とに係る様々な活動を統合する。システム５は、プログラムされた汎用コンピュータ（例えば、パーソナルコンピュータ、ミニコンピュータ、メインフレームコンピュータ、または、１個以上の集積チップで形成された特定目的コンピュータ）であることが可能である。
図１ｂを参照すると、この図に示されるように、ファイルシステム５は、ファイル処理装置７とコマンドインタプリタ６を含む。コンピュータファイルシステム内に記憶された情報の特定項目にアクセスするために、ファイル処理装置７は、記憶装置４内に記憶されたデータ項目を検索するのに必要な情報量を最少化するための、図４に示す通りの新規のコンパクト０完全データ記憶構造４０を使用する。このデータ記憶構造は、探索キー１４２０を索引付けるための複数の記入項目３０、３１、８０、８１、８２、８３、８４、８５、８６、８７、８８と、これらの記入項目を相互連結するコンピュータの記憶装置４内に記憶された新規のＣ0木構造４３を有し、各記入項目が深さ値８９とデータ有り表示子９０を含み、データ有り表示子９０は例えば２つの条件を有する。このデータ記憶構造４０は、更に、探索キー区間範囲に関連付けられた非ＮＩＬ葉記入項目のカウントを記憶するための手段６６も含む。これに加えて、本発明は、木構造４３とは別であり且つ典型的な実施様態ではデータ記憶構造４０自体とは別であることが可能な、ヘッダ３６と記入項目３６ａから構成される別のポインタ構造を使用する。ポインタ構造３６、３６ａは、記憶装置４の記憶コンテナ３９内のデータ項目にアクセスする。
本発明の上記実施様態は、木データ記憶構造によって索引付けしたデータの新規の記憶方法、アクセス方法、及び、検索方法を含む。これらの方法は、事前定義された機能を各探索キーに対して行うために木構造内の幾つかの探索キーを逐次処理するための方法と、木構造内の各探索キーに関する情報を記憶し索引付けるための方法と、本発明の索引ブロックを分割するための方法とを含む。
Ｂ）先行技術の木構造
図２ａ及び図２ｂを参照すると、これらの図には、先行技術の完全２分木、先行技術の０完全２分木、及び、データを索引付けるためのこれらの木の使用方法が示されている。
１）完全２分木
図２ａを参照すると、この図に示される２分木１４０２は、１４１２及び１４１４のような弧または辺で隔てられた１４０６，１４０８及び１４１０のような点で示されるノードから成る、説明用の辺ラベル付き木データ記憶構造である。ノードはａからＺまでとＡ′の小文字と大文字で示される。末端ノードは「葉ノード」または「葉」と呼ばれ、大文字で示される。他の内側ノードは全て小文字で示される。検索対象の情報は、葉１４１６及び葉１４１８のような木の葉に位置したポインタによって指定された記憶場所内に記憶される。葉Ｈ、Ｉ、Ｖ、Ｗ、Ｌ、Ｚ、Ａ′及びＱに関して探索キー１４２０が示されており、図２ａでは、探索キー１４２０は、何らかの最大ビット長さ（例として、８ビットが使用されている）までの任意の均一な長さを有する２進数のストリングである。これらの葉ノード各々に関連付けられた探索キー１４２０は、記憶装置４内の対応する葉ノードに関する記憶位置に対するポインタを位置指定するために使用される。関連した探索キー１４２０によって示される葉ノードだけが、関連データレコードを格納する記憶位置に対するポインタを有し、従って「満杯（ｆｕｌｌ）」であると言い表される。葉Ｇ、Ｋ、Ｏ、Ｓ、Ｔ及びＹは、記憶位置に対するポインタを持たず、従って「空（ｅｍｐｔｙ）」と言い表される。
記憶装置４内のデータレコードの検索は、いずれか１つの探索キー１４２０の２進「０」記号と２進「１」記号を、根ノードａで始まり所期の葉ノードで終わる連結された点と弧の経路に沿ったノード間の各弧１４１２上の「０」または「１」辺ラベルと連続的に比較することによって実現される。２分木の各々のノードと葉は、それに入ってくる弧が「０」とラベルされている場合には、０ノードまたは０葉であり、一方、それに入ってくる弧が「１」とラベルされている場合には、１ノードまたは１葉である。コンピュータデータベース及びファイル管理システムでは、ノードに対するアクセス経路は、根ノードａから特定の該当ノードへ達する「０」及び「１」の辺ラベルを連結することによって得られる２進ストリングである。
全てのノードが葉であるか、または、正確に２つの空でない（ｎｏｎ−ｅｍｐｔｙ）直接の子孫を有するノード（即ち、従属０ノードと従属１ノードを有するノード）である場合に、２分木構造を「完全な（ｃｏｍｐｌｅｔｅ）」と言い表す。図２ａでは、ノードａからノードＡ′までの各ノードが、０完全性（０−ｃｏｍｐｌｅｔｅｎｅｓｓ）の条件を満たす。
従って、図２ａは、葉Ｈ、Ｉ、Ｖ、Ｗ、Ｌ、Ｚ、Ａ′、Ｑのデータレコードを各々に指定するために００００１０００、００１００１０１、０１００００１０、０１０００１１０、１０００００１、１０１０１０００、１０１０１０１０及び１０１１００１０を含む、探索キー１４２０を有する木記憶構造を示す。「完全」２分木要件を満たすために空の葉Ｇ、Ｋ、Ｏ、Ｔ、Ｓ、Ｙが木１４０２内に含まれる。
２）０完全２分木
図２ｂを参照すると、この図には、特に明記しない限り図２ａで使用したのと同一の構造、名称、及び、照合番号を有する０完全２分木１４３０が示してある。１）いずれかの０葉の兄弟がその木内に存在し、且つ、２）正確にδ−１個の１ノードがその木内に存在する場合に、δ個の葉を有する２分木１４３０が０完全であると言い表される。従って、図２ｂは、０葉Ｈ、Ｖ、Ｌ、Ｔ、Ｚの全てが兄弟１ノードを有し、且つ、９個の葉Ｈ、Ｉ、Ｖ、Ｗ、Ｌ、Ｔ、Ｚ、Ａ′、Ｑと８個の１ノードＩ、Ｗ、ｅ、ｃ、ｍ、Ａ′、Ｕ、Ｑが存在するので、図２ａの２分木の０完全２分木表現である。葉Ｇ、Ｋ、Ｏ、Ｓ、Ｙのような（関連探索キーの欠如によって示される）空である１葉を木１４０２から削除することによって、０完全木１４３０が図２ａの２分木１４０２から得られる。空の０葉の削除は、木１４３０内に８個の１ノードを必要とする第２の条件に違反し、従って、ノードＴが空の場合でさえ、そのノードＴが木記憶構造１４３０内に残り、必要な記憶空間を増加させる。
小文字で表される内側ノードの各々は、対応する０部分木と１部分木を有する。０完全木の「前順走査」は、その木の根ノードで開始した後に、最後ノードへのアクセスが完了するまで次の２つのステップを繰り返す。
１）現在ノードｎｎiが内側ノードである場合には、０完全性の定義によって内側コードの各々が０息子ノードを持たなければならないので、その順序における次のノードｎｎi+1は現在ノードの０息子であり、
２）現在ノードｎｎiが葉である場合には、前順での次のノードは、その０部分木がｎｎiを含み且つその深さが最大であるノードｐｐの１息子である。
こうして、前順での第１のノードは内側根ノードａである。その次のノードは、その０息子ノードｂであり、その次は０息子ノードｄが続き、更にその後に葉Ｈが続く。Ｈが葉ノードであり且つノードｄの０部分木がＨを含むので、前順でのその次のノードはノードｄの１息子であり、その深さは最大である（即ち、その０部分木がＨを含み且つその深さが１であるノードｂとは対照的に、２の深さ）であるので、図２ｂに示される木１４３０の完全前順走査は、シーケンス「ａｂｄＨＩｅｊｎｒＶＷｃｆＬｍｐＴｕｘＺＡ′Ｑ」である。
０完全木の前順走査における最終葉ノードＱを除く葉ノードＨ、Ｉ、Ｖ、Ｗ、Ｌ、Ｔ、Ｚ、Ａ′の各々に対する後継者ノード（ｓｕｃｃｅｓｓｏｒ  ｎｏｄｅ）も特に重要である。境界ノード（ｂｏｕｎｄｉｎｇ  ｎｏｄｅ）と呼ばれるこれらのノードは、図２ｂでは、各々にＩ、ｅ、Ｗ、ｃ、ｍ、ｕ、Ａ′、Ｑである。前順走査に関して境界ノードが定義されるので、最終葉ノードＱを除く葉ノードの各々がそれ自体の固有の境界ノードを有する。これに加えて、上記の前順走査の定義から、境界ノードは全て１ノードである。
２．ａ）キー区間
ノード及び境界ノードの「識別子」を、０完全木内の各々の葉に対応するキー区間を設定するために使用することが可能である。葉ノードの「識別子」は、探索キーと同じ長さであり、且つ、その高位（または最左）ビットが、０に設定された他の最左ビットの全てを有する葉にまで達する連結弧または連結経路の２進ビットである２進ストリングである。
「キー区間」は、形式的には、葉識別子（含む）とその境界ノードの識別子（含まない）との間のキー範囲と定義される。この場合も、例外は、そのキー区間の上限が常に予め知られており且つ全て１ビットから成る（即ち、１１１１１１１１）、前順走査での最終葉ノード（例えばＱ）である。
表１では、０完全木１４３０の葉ノードＨ、Ｉ、Ｖ、Ｗ、Ｌ、Ｔ、Ｚ、Ａ′、Ｑ各々のキー区間が辞書式順序にリストされている。従って、例えば、葉Ｖは０１００００００の識別子を有し、その対応する境界ノードＷは識別子０１０００１００を有する。表１に示されるように葉Ｖのキー区間は、０１００００００（含む）から０１０００１００（含まない）、または、０１００００００から０１００００１１（含む）である。
表１を考察することによって、境界ノード識別子の知識は、任意の葉の適切なキー区間を識別するのに十分であり、従って、任意の所与の探索キーを有する対応するデータレコードを識別するのに十分である。探索キー０１００００１０を使用する例では、前順走査シーケンス内の木の境界識別子を調べる探索手続きが、探索キー０１００００１０より大きい第１の境界識別子が発見される時に、探索キーに関する正しいキー区間を発見するだろう。第１の境界ノードＩ（００１０００００）は探索キー０１００００１０よりも小さい。前順の境界ノードｅの第２の境界識別子０１００００００も、その探索キーよりも小さい。第３の境界ノードＷの識別子（０１０００１００）は上記探索キーよりも大きく、葉Ｖのキー区間の非包含的上限である。葉Ｖのキー区間の包含的下限は上記境界ノードｅの識別子である。
表１では、各々のキー区間と共に、そのキー区間に関する０完全木１４３０の境界ノードの「深さ」を表す数が示されている。例えば、葉Ｖの境界ノードは、０完全２分木内で６の深さを有する葉ｗである。定義上は境界ノードを持たない最終ノードＱの場合には、その区間の上限が１１１１１１１１に設定され、０の割当て深さを有する。
境界ノードの集まりの識別子とそれらの深さとの間の関係には１つの明らかな規則性がある。境界ノードの深さがｄｄである場合には、識別子の定義によって、対応する識別子のｄｄ番目のビットが１に設定され、後続の低位ビット全てが０に設定される。
キー長さが８ビットである表１では、第１の境界ノード識別子００１０００００を得るために、初期ダミー識別子が００００００００であり、第１の境界ノードＩの深さが３であり、第１の境界ノード識別子の第３のビットが１であり、後続の低位ビットが０である。第２の境界ノード識別子０１００００００を得るために、第２の境界ノードｅの深さは２であり、第１の境界ノード識別子を使用し、第２のビットが１に設定され、全ての後続ビットが０に設定される。残りの境界ノードの識別子は同様の仕方で構成される。
３）先行技術のＣ0木
０完全２分木内の境界ノードの深さからキー区間を構成することが可能であるという知識を使用して、図２ｂの先行技術の０完全木のコンパクトな形態を図３ａに９で示す。このコンパクトな形態はＣ0木と呼ばれる。このツリー構造は、記入項目１７を伴う索引ブロック１０、１１、１２を有する。Ｃ0木を形成する場合、いずれか１つの索引ブロック内の記入項目１７の最大数は、常に、予め決められた最大索引ブロック数１４以下である。図３ａでは、予め決められた最大索引ブロック数１４が５であると仮定して、木構造９がどのように図２ｂの０完全２分木を表現するかを考察する。索引ブロック１０、１１、１２の記入項目１７の各々が、深さ値１７ａと、記憶位置１３に対するポインタ１７ｂを有する。唯一の例外は、図２ｂの空の葉ノード（例えば、葉Ｔ）を表す１７ｂ′のようなＮＩＬ記入項目だろう。この記入項目１７ｂ′は、メモリ内に記憶された対応データを持たない空のポインタ１７ｂを有し、コンピュータシステム内の記憶空間を浪費する。
例えば、表１を参照して図３ａに示されるように、葉Ｈ、Ｉ、Ｖ、Ｗに対応する境界ノードＩ、ｅ、Ｗ、ｃの深さ値３、２、６、１が索引ブロック１１内に記憶される。葉Ｌ、Ｔ′、Ｚ、Ａ′に対応する境界ノードｍ、ｕ、Ａ′、Ｑの深さ値３、５、７、４と、最終葉ノードＱの割当て深さ値０が、索引ブロック１２内に記憶される。各記入項目１７のポインタ１７ｂは、図２ｂの空の葉Ｔに対応する記入項目１７ｂ′の空ポインタ１７ｂを除いて、探索キーと、メモリまたは記憶装置内のその関連データレコードとに対応する記憶位置１３を指定する。根索引ブロック１０は、対応する葉索引ブロック１１及び１２を指定するポインタ１７ｂを有する記入項目１７を持つ。索引ブロック１０の各記入項目１７の深さ値１７ａは、葉索引ブロック１１及び１２各々の最終深さ値または最小深さ値１及び０に対応し、葉索引ブロック１１及び１２各々に関するキー区間範囲を与える。
さて、最初の６個の探索キーが辞書式順序で索引付けされている図３ｂに示す通りのコンパクト０完全木の満杯索引ブロックを分割するための公知の方法を考察する。この点で、その木構造は、探索キー００００１０００、００１００１０１、０１００００１０、０１０００１１０、１００００００１、及び、１０１０１０００を索引付ける６個の葉ノードを有する概念０完全２分木のコンパクトな表現である、６個の記入項目１７を有する単一索引ブロック１９である。６番目の探索キー１０１０１０００に対して索引付けると、５個の予め決められた完全索引ブロック数１４を超過し、索引ブロック１９の分割が生じなければならない。この分割は、索引ブロック１９の深さ値１７ａの最小深さ（１である）で生じる。この分割は、根索引ブロック２０と、３、２、６及び１の深さ値１７ａを有する葉索引ブロック２１と、３及び０の深さ値１７ａを有する葉索引ブロック２４を生じさせる。分割後には、親索引ブロック２０は２個の記入項目１７によって構成される。第１の記入項目２２は、上記と同じ６個の探索キーの入力後に概念２進０完全木内の探索キー０１００００１０を索引付ける葉ノードの境界ノード深さに対応する１の深さ値１７ａを有し、第２の記入項目２３は、常に０完全木の前順での最終葉ノードの割当て値である０の深さ値１７ａを有する。記入項目２２及び２３のポインタ１７ｂは各々に索引ブロック２１と索引ブロック２４を指定する。
Ｂ）本発明のコンパクト０完全データ記憶構造
図４を参照すると、この図には、図２ａ、図２ｂ及び図３ａの場合と同じ探索キー１４２０の集合を入力した後の、本発明の実施様態の１つのデータ記憶構造４０が示されている。より多くの個数の探索キーをこのデータ記憶構造４０内に入力することが可能であり、探索キーのより大きい集合に上記実施様態を適用することは、当業者の知識の範囲内に含まれるだろう。近接した深さ値１７ａ及びポインタ１７ｂ記入項目１７を有するブロック１０、１１及び１２を持つ図３ａのＣ0木とは対照的に、図４のデータ記憶構造は、索引ブロック記入項目４７ｃに索引付けられた索引ブロックヘッダ４７ａと部分木ポインタ４７ｂとを有する根ノード４７と、索引ブロック記入項目３４ｃに連結した索引ブロックヘッダ３４ａと部分木ポインタ３４ｂとを有するノード３４と、索引ブロック記入項目３５ｃに連結した索引ブロックヘッダ３５ａと部分木ポインタ３５ｂとを有するノード３５とから構成される木構造４３を持つ。
記入項目４７ｃ、記入項目３４ｃ、及び、記入項目３５ｃの各々は、深さ値８９とデータ有り表示子９０を含む。これに加えて、データ記憶構造４０は、非ＮＩＬである葉索引ブロック記入項目３４ｃ及び３５ｃの対応深さ値８９に関するポインタまたは参照可能索引を含む対応記入項目３６ａを有するポインタヘッダ３６から構成された別個のポインタ構造を持つ。３４ｃ及び３５ｃの深さ値８９と、ポインタ記入項目３６ａの索引は、葉Ｔのような０葉記入項目に対応する空ポインタが除外されて無駄な記憶空間が減少することを除いて、図３ａの索引ブロック１１及び１２内の深さ値１７ａとポインタ１７ｂに相当する。ノード４７の索引ブロック記入項目４７ｃは、対応する索引ブロック３４ｃ及び３５ｃ各々において最終の（即ち、最小値の）深さ記入項目を与える図３ａの索引ブロック内の記入項目に対応する、記入項目３０及び３１を含む。根レベル４１のポインタ４７ｂは、索引ブロック記入項目４７ｃの各々に対応するキー区間に関する葉レベル６４を指定する。
対応する深さ値８９を索引ブロック記入項目４７ｃ、３４ｃ及び３５ｃとポインタ記入項目３６ａとに分割することに加えて、対応記入項目６６ａを有するカウントヘッダ６６が関係付けられる。記入項目６６ａは、索引ブロック記入項目３４ｃ及び３５ｃ内の合計数Ｆまたは満杯葉（非ＮＩＬ）記入項目を各々に与えるカウント記入項目３２及び３３を含む。従って、カウント記入項目３２は、索引ブロック記入項目３４ｃ内に４個の非ＮＩＬ４記入項目（または値Ｆ）が存在することを示す値４を有する。カウント記入項目３３は、索引ブロック記入項目３５ｃ内に４個の非ＮＩＬ記入項目（または値Ｆ）が存在することを示す値４を有する。従って、データ記憶構造４０は、新規のＣ0木構造４３と、別個のポインタ構造３６及び３６ａと、記憶コンテナ３９を有する。ノード３４、３５及び４７と、カウントヘッダ６６と、カウント記入項目６６ａは、木構造４３内にあり、一方、参照可能索引またはポインタは、ヘッダ３６と記入項目３６ａから構成される別のポインタ構造内にある。
図４の木構造４３の例は、２の高さと、ルートレベル４１と、葉レベル６４とを有する。根レベル４１における索引ブロック記入項目４７ｃは、２個の記入項目３０及び３１を含み、葉レベル６４における索引ブロック記入項目構造３４ｃ及び３５ｃは、４個の記入項目８０、８１、８２、８３と５個の記入項目８４、８５、８６、８７、８８を各々に含む。Ｃ0木記憶構造の高さまたはレベル数は、木構造４３の葉記入項目内で索引付けられるべきデータ項目及び関連探索キーの数と、ファイルシステム内で設定される予め決められた最大索引ブロック数７９とに応じて変化する。上記図４の実施様態は、５の予め決められた最大索引ブロック数７９を有する。
深さ値８９は、木構造４３のノード４７、３４及び３５の索引ブロックヘッダ４７ａ、３４ａ及び３５ａの各々に連結されている索引ブロック記入項目４７ｃ、３４ｃ及び３５ｃ内に位置している。重要なことであるが、データ有り表示子ビット９０も、索引ブロック記入項目４７ｃ、３４ｃ及び３５ｃの各々の中に存在する。
表示子ビット９０の各々が、０と１で各々に表現される２つの条件ＦまたはＴのどちらか一方の状態である。葉レベル６４における深さ値８９では、条件Ｔ、すなわち、第１の条件は、対応記入項目が、図３ａのＣ0木のＮＩＬ記入項目であるか、または、図２ａと図２ｂにおける深さ値５の葉Ｔのような概念０完全２分木の空ノードであることを表す。条件Ｆ、すなわち、第２の条件は、対応記入項目が、図２ａ及び図２ｂの葉Ｈ、Ｉ、Ｖ、Ｗ、Ｌ、Ｚ、Ａ′及びＱに対応する記入項目８０から記入項目８４までと記入項目８６から記入項目８８までのように、コンピュータの記憶装置内の対応データ項目に関連付けられていることを示す。非ＮＩＬ記入項目８０から８４までと非ＮＩＬ記入項目８６から８８までは、ポインタ記入項目３６ａのいずれか１つによってアドレス指定されるコンピュータのメモリ８の記憶コンテナ３９内に、対応データ項目を有する。記入項目８５のようなＮＩＬ記入項目またはＴ記入項目は、３６ａ内のいずれかの索引記入項目または記憶コンテナ３９内のデータ項目をアドレス指定しない。ポインタ記入項目３６ａの各々は、対応する辞書順データ項目に対するポインタもしくは参照可能索引であるか、または、コンピュータの記憶装置内に記憶されたデータ項目に関連付けられている探索キー１４２０の１つに対するポインタもしくは参照可能索引である。
コンパクト０完全木４０のデータ記憶構造をその構成要素データ構造に関して考察する。図６ａは、コンピュータシステム内の各ノードの構造を例示する説明図である。ノード３４を一例として示しているが、その他は同一である。ノード３４は２つの構造によって構成される。これらの構造の各々は、記入項目３４ｃリストに対するヘッダから構成されているが、各々の構造はアレイまたは他の形態のデータ構造であることが可能である。一方の構造は、記入項目３４ｃのリストを指定するマップヘッダ３４ａを有し、他方の構造は、他のリストから構成されることが可能な要素のリストを指定する複合部分木ポインタ３４ｂである。
各索引ブロックに関連付けられた複合ヘッダＣは、（木構造４３の次の下位レベルがある場合に）木構造４３の次の下位レベルを指定する。従って、図４では、複合ヘッダ４７ｂが、枝の中の子ノード３４及び３５の部分木を指定する。各々の枝は、その木の下位レベルを指定する複合ヘッダを含んでも含まなくてもよい。ノード４７のように複合ヘッダＣが空ではない場合には、ノード４７は「内側」枝タイプまたは「根」枝タイプのノードである。木構造の葉レベルでは、子ノードまたは部分木はノードに依存せず、複合ポインタ３４ｂ及び３５ｂが各々にその木の別のレベルを指定しないノード３４及び３５に示されるように、個々の複合ヘッダは空である。複合ヘッダは、幾つかの関連情報項目を統合することによって部分木に構造を与える。図６ｂに示すような初期ＩＮＩＴタイプ構造４０′では、非ＮＩＬ値が加えられ終わる前に、ノード４７′のマップヘッダ４７ａ′が、０の深さ値８９′と、第１の条件（ＮＩＬ条件）Ｔに設定された表示子ビット９０′とを有する記入項目を指定し、これは、記憶コンテナ３９′内のこの記入項目に関する対応データ項目が無いことを示している。
この複合構造の第１の要素（例えば、図４の４２）は根レベルでは常に空であり、単に反転させられ、その結果として、根レベルの複合構造レイアウトが上記木の様々なサブレベルと類似しており、根索引ブロックヘッダ４７ａに連結した記入項目４７ｃの数が、予め決められた最大索引ブロック数７９である５よりも多い場合のように、ノード４７の根索引ブロック４７ａが多すぎる場合には、新たな根レベルが生じさせられる必要がある。上記木の根レベル以外のより深いレベルにおける第１の要素４２目的が説明されなければならない。
根レベル４１における第４の要素は、ポインタ記入項目３６ａのリストを指定するポインタヘッダ３６である。図４に示す第５の要素は、情報の実データ項目がその中に記憶されるコンピュータのメモリ８または記憶装置４内の記憶コンテナである。データ項目は、コンピュータシステムに記憶可能なあらゆる形態のデータであることが可能である。記入項目３６ａの各々は、索引ブロック記入項目３４ｃ及び３５ｃの１つに対応する。記入項目３６ａの各記入項目は、コンテナ３９内のデータに対する参照可能索引またはポインタを含む。
最後の２つの要素３６及び３９は木構造４３とは別であり、様々な別個の方法で使用することが可能である。例えば、図４の上記実施様態と対照区別して、これら２つの要素を、木構造４３に物理的に近接していない別の複合ポインタ構造の中に置くことが可能である。
探索キー１４２０とデータ記憶構造４０は、求める項目をファイルシステムが容易に且つ効率的に発見することが可能であるように構成される。図４ｂに示すように、記憶コンテナ３９は、探索キーによって表されるデータ項目を任意の順序で含む。各探索キーに関する辞書順に参照可能索引またはポインタは、ポインタ記入項目３６ａ内に置かれる。最後に、各々の索引またはポインタがコンテナ３９内のデータ項目の位置をアドレス指定する。同時挿入されるべき幾つかの項目が最初にバッファ内で辞書順にソートされ、その後で、任意の順序でコンテナ３９内でソートされる。データ値の記憶を、当業者に公知の様々な方法で行うことが可能である。
木構造４３に戻ると、表示子９０を有効利用するために、根レベル４１を除く任意のレベル（例えば、レベル６４）における複合構造の第１の要素６６は、カウント記入項目６６ａに対するカウントヘッダ６６である。記入項目３２または３３のようなカウント記入項目６６ａの各々は、複合ヘッダ４７ｂを介してノード４７に連結された部分木レベル６４内の対応する索引ブロック記入項目３４ｃ及び３５ｃ内の、Ｆに設定された表示子９０を有する非ＮＩＬ葉記入項目のカウントである。図４のレベル６４に２つのノード３４及び３５が存在するので、このカウント構造は２つの記入項目３２及び３３を有する。第１の記入項目３２は索引ブロック記入項目３４ｃのカウントに対応し、第２の記入項目３３は索引ブロック記入項目３５ｃのカウントに対応する。第１の索引ブロック記入項目３４ｃは４つの非ＮＩＬ記入項目またはＦ記入項目８０、８１、８２、８３を含むので、カウント構造の第１の記入項目３２は４のカウント値を含む。第２の索引ブロック記入項目３５ｃは４つの非ＮＩＬ記入項目８４、８６、８７、８８を含むので、第２の記入項目３３は４のカウント値を有する。各レベルの各部分木の記入項目３２及び３３のような非ＮＩＬ葉記入項目カウントは新たなデータ項目に対応する各々の新たな非ＮＩＬ記入項目が対応索引ブロック内に挿入される時に増分され、対応索引ブロックから削除された各非ＮＩＬ記入項目に関しては減分される。
データ記憶構造４０に対して操作を行う時、及び、根レベル４１から木構造４３を下降する時には、レベル６４のカウントヘッダ６６と記入項目６６ａのような各部分木の第１の要素における値の集積によって、先行部分木内の非ＮＩＬまたはＦ葉記入項目の、ポインタ索引ｐｓの形態のポインタ記入項目３６ａに対する情報アクセスが保たれる。記憶データ項目の対応ポインタ索引を得るためには、以前の部分木レベルからの先行カウントを、現在探索キーのキー区間に対応する記入項目までの現在葉索引ブロック内の処理済み非ＮＩＬ記入項目のカウントに加える。この索引ｐｓは、データ項目の辞書順位置でもあるポインタ記入項目３６ａ内のデータ項目のポインタ位置に対応する。
さて、図４ａと図４ｂを参照して、探索キーのキー区間範囲とデータ項目を判定する方法の例を説明する。こうした判定で行うべき諸ステップに関する詳細な説明は、プログラム構造、特に図１２の深さ探索手続きに関して本明細書で説明している。２進形式１０１０１０００の探索キーに対して探索を行うと仮定する。探索キーは、左から始めて値１、３及び５である探索キーの１ビットの順序値ビット位置を含むシーケンスによって表される。これに加えて、最終の値がそのシーケンス内の最後の値の後に加えられ、この最終の値は最大キー長さ（ビット単位）に１を加えた値であり、そのキーが１バイト最大値であるのでこの例では９である。結果として、探索キー１０１０１０００に関するシーケンスは１、３、５及び９である。この探索キーシーケンスは、木構造４３内の索引ブロックの深さ値と比較される。最初に、根ノード４７の索引ブロック記入項目４７ｃの深さ値８９が索引キーシーケンスの要素と比較される。深さ値がそのシーケンスの探索キー要素の順序値より小さい記入項目が発見されるまで、深さ値８９の比較が繰り返される。これに加えて、現在索引ブロック４７ｃ内の記入項目に対する索引と、探索キーシーケンス要素の順序位置に対する索引とが保持される。記入項目３０の深さ値が、探索キーシーケンスの第１の順序要素と比較される。両方が１に等しいので、探索キーシーケンス要素に対する索引が増分される。その後で、深さ値が順序値より小さくないので、索引ブロック内の記入項目に対する索引が増分される。
索引ブロック４７ｃの第２の記入項目３１の深さ値（０である）が、そのシーケンスの第２の順序要素（３である）と比較される。これら２つの値が互いに等しくなく、記入項目３１の深さ値が順序値（３である）より小さい（即ち、０＜３）ので、探索はこの索引ブロック内で終了し、更に、これが非葉ノード４７であるので、記入項目３１に対応する子索引ブロックが得られ、探索される。図４では、これは索引ブロック構造３５ａ及び３５ｃである。これに加えて、ポインタ記入項目３６ａに対するポインタ索引は、カウント記入項目６６ａの記入項目３２内に記憶された値だけ増分される。このポインタ索引は、索引ブロック記入項目３４ｃ内の（Ｆ記入項目で示される）先行の非ＮＩＬ記入項目の合計を含む。
３５ｃの記入項目の任意の部分木レベルの探索の開始時に１に初期化される現在葉索引ブロック内の非ＮＩＬ記入項目のカウントが、保持される。第１の記入項目８４が非ＮＩＬであるので、非ＮＩＬ記入項目のカウントが１だけ増分される。親ノード４７の４７ｃで探索が終わった位置と同一の位置でファイルシステムがそのシーケンスの順序値の探索を再開するので、記入項目８４の深さ値（３である）が、探索キーシーケンスの第２の順序探索値３と比較される。記入項目８４の深さ値と順序探索キー要素３は等しい。従って、３５ｃ内の次の記入項目８５がアクセスされる。更に、順序値３が探索キーの現在ビット位置に等しいので、探索キーシーケンスの次の順序値５が得られる。記入項目８５はＮＩＬ記入項目であり、従って、非ＮＩＬ記入項目のカウントは増分されない。その後で、記入項目８５の深さ値は、探索キーシーケンスの第３の順序値５と比較される。これら２つの値が等しい（５＝５）ので、索引ブロック記入項目３５ｃの次の記入項目８６が得られ、順序値シーケンスの次の要素（９である）が得られる。記入項目８６は非ＮＩＬであり、非ＮＩＬ記入項目のカウントを２に増分する。これに加えて、記入項目８６の深さ値８９が、順序値９と比較される。深さ値７が探索キーアレイ内の順序値９より小さい（７＜９）ので。探索が、この索引ブロック内で終了し、更に、これが葉ノード３４なので、図２ｂと表１における葉Ｚに対応する正しい記入項目が発見される。
この点で、４に等しいポインタ索引ｐｓが２と合算され、その結果として６が得られる。この「６」は、８であるポインタ記入項目３６ａの６番目の記入項目を選択するために使用される。この６番目の記入項目は、記憶コンテナ３９内の８番目のデータ項目に対する参照可能索引であり、図４ｂで示されるような２進形式の探索キー１０１０１０００に対応する。
従って、記憶構造４０は、Ｔ／Ｆ表示子とカウント構造でそれらを置き換える図３ａ及び図３ｂの先行技術の外側ＮＩＬ（ダミー）記入項目の記憶の必要を無くする。木構造４３と探索キー１４２０は、Ｆに設定された葉レベルにおいて表示子ビットの数のカウントを維持する記入項目６６ａと共に、ポインタ記入項目３６ａに対する索引を維持するために使用される。この場合には、ポインタ記入項目３６ａは、記憶コンテナ３９内に記憶された項目に対する索引を含む。
更に、ポインタヘッダ３６とポインタ記入項目３６ａが木構造４３の残りのものとは別であり、探索キー１４２０に対する参照可能索引を辞書順序で記憶するので、木構造４３を全く使用せずに辞書順序で探索キーまたはデータ項目をアクセスすることが可能である。位置指定されるべきデータ項目の辞書順の位置を知ることによって、記入項目３６ａだけにアクセスすることによってデータ項目の位置指定することが可能である。
本発明のＣ0木を構築するために、図６ｂに示されるようなＩＮＩＴタイプの構造が作成される。その後で、個々の探索キーを下記のプログラム構造の方法で挿入する。索引ブロックが満杯である時には、下記の方法で索引ブロックを分割する。従って、好ましい実施様態のＣ0木データ記憶構造を構築することは、既に形成された好ましい実施様態のＣ0木に中に辞書順序で新たなデータ項目またはキーを入力するために使用される、索引付け情報とノードの記憶の反復処理と索引ブロック分割方法との問題である。
Ｃ）コンパクト０完全木表現におけるキーの記憶及び検索のプログラム構造
次に、事前定義された機能を各探索キーに対して行うために木構造内の幾つかの探索キーを逐次的に処理する方法と、木構造内の探索キーを位置指定するための方法と、木構造における各探索キーに関する情報を記憶し、索引付けし、本発明の索引ブロックを分割するための方法を説明する。
幾つかの探索キーを逐次的に処理するための方法は、各探索キーに対応する索引ブロックを求めてデータ記憶構造内をくまなく探索することと、探索のような事前定義機能を行うこと、または、木構造によって索引付けられるべき探索キーを挿入することと、各索引ブロック内の記入項目の数が予め決められた総数を上回るかまたは最大数よりも大きくなる時に索引ブロックを分割することと、木構造内に挿入されるべき探索キー内の空ストリングを処理することとを含む。
Ｃ0木構造のコンピュータプログラム構造を、図７から図１９のフローチャートに概略的に示す。このプログラム構造全体に亙って使用されるマクロ定義の要約を表３に示し、この表３ではマクロ名と簡単な説明が示される。同様に、図７から図１９のフローチャートの要約が表２に示され、この表ではフローチャートの参照先とその入力と変数と出力とが示される。以下では、各々の手続きを表２と表３を参照しながら説明する。説明の便宜上、図７から図１９を参照して説明する各ステップを行うためのブロックを括弧内に示す。
１）逐次処理手続き
図７は、辞書順にソートした探索キーに対して、事前定義された機能がメモリ８（図１ｂ）内のバッファ上で実行される逐次処理手続きを示す。プログラムは最初に幾つかの探索キーをフェッチし、バッファ内で探索キーを辞書順にソートする。その後で、次に示す各ステップを行う。
プログラム制御下のコンピュータは、記憶コンテナ３９から、ポインタヘッダ３６によって指定されたポインタ記入項目３６ａの最初の記入項目に関連付けられた記憶キー（ｓｔｏｒｅｄ  ｋｅｙ）をフェッチする（１００）。記憶キーが空であるかどうかを調べるために記憶キーを検査する（１０２）。このステップは、空ストリング処理ルーチンの一部であり、ポインタ記入項目３６ａの最初の記入項目が以前に空ストリングデータ項目を索引付けたかどうかを調べるための検査を行う。
記憶キーが空である場合には、ポインタ記入項目３６ａ内に空ストリングが存在することを示すために、木構造内の非ＮＩＬ記入項目の合計であるポインタ記入項目３６ａに対する初期索引値ｐｓを１に設定する（１０４）。記憶キーが空でない場合には、初期索引値ｐｓを０に等しく設定する（１０６）。
探索キーＫをバッファからフェッチする（１０８）。その後で、空ストリングを記憶コンテナ３９に加え且つポインタ記入項目３６ａに加えるべきかどうかを判定する目的で、その探索キーが空である（即ち、空ストリングである）ことを調べるために探索キーを処理する（１１０）。
探索キーが空でない場合には、その変数の初期化が生じることになる。内側索引ブロックから部分木枝に下降する時に以前の記入項目の深さ値を記憶する後続変数ｄｉと、現在索引ブロック内の境界ノードの深さｄｊの変数を、０に初期化する。データベースシステムによって処理されている現在探索キーの現在の終端ビット位置を参照する変数ｂＫを１に初期化する（１１２）。
実行すべき実際の事前定義機能を、フラグＬＯＡＤＩＮＧを調べることによって決定する（１１４）。ＬＯＡＤＩＮＧが表示される場合には、このシステムが、各探索キーに関する索引付け情報を記憶するための挿入機能を逐次処理し、現在ノードが根タイプかＩＮＩＴタイプのどちらであるかを調べるためにノードタイプの検査を行なう（１１６）。システムがＬＯＡＤＩＮＧではない場合には、現在探索キーに対応するキー区間を位置指定するために逐次探索を行い、ノードが根タイプかＩＮＩＴタイプのどちらであるかを調べるためにノードタイプの検査を行なう（１１８）。
システムがＬＯＡＤＩＮＧであり且つノードが根タイプである場合には、「枝挿入手続き」（１２０）を行う。ノードがＩＮＩＴタイプである場合には、葉挿入手続きを行う（１２２）。ノードが根タイプであることをステップ１１８が示す場合は、枝探索手続きを行う（１２４）。ステップ１２６中に木４３の最高位のノードがＩＮＩＴタイプである場合には、葉探索手続きを行う（１２６）。
木４３が変更された可能性があるステップ１２０、１２２、１２４、１２６のいずれかを行った後に、現在索引ブロック内の記入項目の数が、予め決められた許容最大索引ブロック数７９（図４）よりも多いかどうかを調べるために、ノード・オーバーフル（ｎｏｄｅ  ｏｖｅｒｆｕｌｌ）検査を行う（１２８）。現在記入項目の数が最大索引ブロック数よりも多い場合には、後述の根分割手続き（１３０）を行う。そうでない場合には、後述するブロック１４０にプログラムが進む。
ステップ１１０に戻り、キーＫが空であり、且つ、記入項目ｐ［１］によって参照される記憶キーＫｉが空である場合には、更に別の空ストリング処理が発生し、ポインタ記入項目３６ａに対する索引ｐｓが上記のように１に等しいかどうかを調べるために検査を行う（１３２）。
ｐｓが０である場合には、ステップ１０２で行った検査が、記憶コンテナ３９内に記憶された空ストリングを発見しなかったことを、システムが認識する。ＬＯＡＤＩＮＧが真であり且つロード要求がファイルシステム上で行われているかどうかを調べるために、検査を行う。真である場合には、木構造内への探索キーのロードが行われており、１つの項目の追加（即ち、空ストリングの追加）を表示するためにポインタ記入項目３６ａに対する索引ｐｓを１に設定する（１３６）。
この点で、探索キーが空であることと、ロード要求が実行されていることの判定が完了する。従って、探索キーは空ストリングである。ポインタヘッダ３６ａに連結した第１の記入項目に１つの要素を挿入し、ポインタベクトルｐ［１］の第１の位置を記憶コンテナ３９内のキーのアドレスに設定する（１３８）。
最後に、更に別の探索キーがメモリ８のバッファから分析されることになっているかどうかを調べるために、更に別のキーの判定を行う（１４０）。そうである場合には、ステップ１０８へのループがその後に続く。更に別の探索キーの分析が不要である場合には、逐次処理手続き（１９９）の外に出る。
２）葉探索手続き
逐次処理手続きまたは枝探索手続きによって呼び出される葉探索手続きが図８に示されている。プログラム構造のこの部分は、現在探索キーに対応するキー区間を有する木構造内の記入項目を発見し、こうして、探索キーが以前に索引付け済みである場合に、木構造内の探索キーを位置指定する。次に示す各ステップが実行される。
変数ｊ及びｃを１に初期化し、ｄ′を、境界ノードの深さｄｊに等しく設定する（２００）。後述する深さ探索手続きは、現在探索キーに対応するキー区間を有する現在索引ブロック内の記入項目を位置指定する（２０２）。位置指定された記入項目ｅｊの表示子がＮＩＬ表示子である（即ち、表示子９０がＴである）かどうかを調べるための判定を行う（２０４）。
記入項目ｅｊがＮＩＬ記入項目である場合には、現在探索キーが木構造中に発見されない（２０６）。この記入項目が非ＮＩＬである（表示子９０がＦである）場合には、非ＮＩＬ記入項目の合計カウントｃ＋ｐｓで索引付けられたポインタ記入項目３６ａの記入項目ｐ［ｃ＋ｐｓ］を使用することによって、記入項目ｅｊに対応する記憶キーを記憶コンテナ３９からＫｉ内にフェッチする（２０８）。以前の索引ブロック内の非ＮＩＬ記入項目ｐｓと、深さ探索手続きによってフェッチされた現在索引ブロック内の非ＮＩＬ記入項目のカウントｃとの合計が保持されるので、この合計カウントは、ポインタ記入項目３６ａ内の正しい位置または索引を与える。これら２つの値を加算することによって、記入項目ｅｊに関連付けられたポインタ記入項目３６ａの要素が発見される。その次に、葉記入項目ｅｊに対応するキーと探索キーが同一の値であるかどうかを調べるために、フェッチされたキーＫｉを探索キーＫと比較する（２１０）。これら２つのキーが等しくない場合（ＮＥ）には、探索キーＫが発見されなかったのであり、木構造内には存在しない（２１２）。
これらのキーが等しい場合には、適切な葉記入項目とキーＫとが発見されたことになる（２１４）。その後で、次の探索キーにアクセスし、現在探索キーと、処理すべきバッファ内の次のキーとの間の区別ビットｂ′を判定するために、後述する「バルク処理手続き」を行う（２１６）。
その次に、処理すべき次の探索キーが現在索引ブロックのキー区間範囲内に含まれているかどうか（即ち、この手続きの初期化でｄ′が設定または割当てられる場合に、ｄ′＜ｂ′かどうか）に関する判定を行う（２１８）。次の探索キーが現在索引ブロックのキー区間範囲内である場合には、ｂＫリセット機能を再開する（２２０）。この好ましい実施様態では複数のキーが値の辞書順に処理されるので、各々の探索手続きまたは挿入手続きの完了時に探索がそこで終了したキービット位置を呼び戻すことによって、次の探索キーの探索の処理をそこで再開する適切なキービットを判定することが可能である。現在索引ブロックのキー区間範囲内に現在キーが含まれていない場合には、保持された区別ビットｂ′とキービット位置ｂＫの適切な値を伴って、葉探索手続きの現在の反復を呼び出したルーチンへ復帰する（２９９）。
３）葉挿入手続き
ロード要求がステップ１１４で行われている場合には、記憶装置４内に以前に存在しなかったソートされたキーのバッファからの新たなキーが、データ記憶構造に個別に加えられる。葉挿入手続きを図９に示すが、この手続きは、新たな探索キーの正しい配置を判定しキーの索引情報を記憶することによって、各々の新たな探索キーを挿入する。葉挿入手続きの各ステップを次に説明する。
この手続きの変数ｆ＝０、ｊ＝１、及び、ｄ′＝ｄｊ（境界深さ）を初期化する（３００）。現在探索キーをそのキー区間が含む記入項目を位置指定するために深さ探索手続きを行う（３０２）。その後で、深さ探索手続きによって位置指定された記入項目ｅｊがＮＩＬ記入項目である（Ｔ表示子９０を有する）かどうかを調べるために、検査を行う（３０４）。
その記入項目がＮＩＬ記入項目である場合には、挿入記入項目のポイントが発見される。非ＮＩＬ記入項目として挿入すべき新たな記入項目の追加を反映するために、及び、そのキーに対する新たに挿入されたポインタを反映するために、変数ｃと変数ｎを増分する（３０６）。要素をポインタ記入項目３６ａ内に挿入し、記憶コンテナ３９内に記憶されているそのキーとその参照データ項目とのアドレスに割り当てる（３０８）。記憶コンテナ３９内の記憶要素を有する記入項目とポインタ記入項目３６ａとの結合を反映するために、記入項目ｅｊの表示子をＮＩＬ（Ｔ）から非ＮＩＬ（Ｆ）に変化させる（３１０）。
ステップ３０４において記入項目がＮＩＬ記入項目でない場合には、ポインタ記入項目３６ａ要素ｐ［ｃ＋ｐｓ］でアドレス指定されたキーをフェッチし、Ｋｉ内にロードする（３１２）。フェッチしたキーＫｉと現在キーＫとが等しいかどうかを調べるために（即ち、現在キーが記憶コンテナ３９内に既に存在するかどうかを判定するために）フェッチしたキーＫｉと現在キーＫを比較する（３１４）。フェッチしたキーＫｉと現在キーＫとが等しい場合には、処理すべき次のキーが現在索引ブロック内にあるかどうかを判定するために、バルク処理手続きを行う（３１６）。
現在キーとフェッチしたキーとが等しくない場合には、現在キーが存在しなかったので、ポインタ記入項目３６ａに加えられた新たな記入項目のカウントｎを増分する（３１８）。その後で、何らかのダミー記入項目を加えるために、及び、その新たな記入項目の正しい配置を判定するために、後述する深さ追加手続きを行う。処理されている現在キーがフェッチされたキーＫｉ以上の大きさであるかどうかを表し（３２０）且つポインタ記入項目３６ａ内の位置または索引を表示するフラグＦを、そのルーチンが戻す。ポインタ記入項目３６ａ内に要素を挿入し、先行部分木内の非ＮＩＬ記入項目の数ｐｓと現在索引ブロックの非ＮＩＬ記入項目の数ｃとフラグｆの値との合計に対応する正しい索引付けられた配置に上記キーのアドレスとその参照データ項目を割り当てる（３２２）。
その後で、バルク処理ルーチンを行い、区別ビットｂ′を戻す（３２４）。更に、現在索引ブロック内の記入項目の数がＭＡＸより大きい（即ち、許容最大値より大きい）かどうかを調べるために検査を行う。最大値を、索引ブロックの記入項目に関して予め決められた最大索引ブロック数７９（例えば、図４の場合には４）よりもはるかに大きい非常に高い閾値に設定する（３２６）。
現在索引ブロック内の記入項目の数が最大値よりも大きくない場合には、バルク処理ルーチン中にフェッチされた処理対象の次のキーが現在索引ブロックのキー区間範囲内にあることを表示するｂ′よりｄ′が小さいかどうかに関して検査を行う（３２８）。そうである場合には、ステップ３０２に戻る前にｂＫリセット手続きを行う（３３６）。いずれにしても、最終的には、この手続きは、区別ビットｂ′の値、現在キービット位置ｂＫ、及び、ポインタ記入項目３６ａ内の新たな要素の数を伴って、上記呼出し手続きに戻る。
４）枝探索手続き
図１０の枝探索手続きが図７の逐次処理手順から呼び出される場合には、葉探索手続きを行うために正しい葉（ＬＥＡＦ）レベルと索引ブロックを位置指定する目的で、Ｃ0木データ記憶構造の枝をくまなく探索するために、次の諸ステップが行われる。
最初に、変数ｊ＝ｃ＝１及び変数ｄ′＝ｄｊ（ｄｊは境界深さである）を初期化する（４００）。現在キーを含むキー区間を有する現在内側枝索引ブロック内の適切な記入項目を位置指定するために、深さ探索手続きを行う（４０２）。システムが枝レベルにあるので、記入項目が木構造の部分木に関連付けられる。
枝の記入項目ｅｊに対応する位置指定された子ノードをフェッチし（４０４）、その後で、ノードタイプを判定するために検査する（４０６）。子ブロックのノードタイプが葉である場合には、葉探索手続きを行う（４０８）。そのノードタイプが葉でない場合には、即ち、内側タイプである場合には、枝探索手続きを行う（４１０）。
この手続きは、現在索引ブロックのキー区間範囲内に現在キーがあるかどうか（即ち、ｄ′＜ｂ′であるかどうか）を判定する（４１４）。そうである場合には、後述するｂＫリセット手続きを行い（４１６）、ステップ４０２へのループを実行する。そうでない場合には、プログラムが、区別ビットｂ′の値とキービット位置ｂＫを逐次処理手続きに戻し、枝探索の現在の反復が完了する（４９９）。
５）枝挿入手続き
バッファ内のソート済み探索キーに対して行なわれるなければならない事前定義された機能がロードであり、逐次処理手続きのステップ１１６の索引ブロックタイプが根索引ブロックであることを判定し、その後で、枝挿入手続きをステップ１２０で呼び出し、現在探索キーのキー区間を含む葉索引ブロックを位置指定するまで、図１１に示す通りのステップを後述するように行う。
現在探索キーをその区間が含む記入項目に対する索引を１に設定し（即ち、ｊ＝ｃ＝１）、現在境界深さ値を割り当て（即ち、ｄ′＝ｄｊ）、親索引ブロックに関連付けられた新たなキーのカウントをゼロに設定する（即ち、ｃｎ＝０）（５００）。その後で、現在キーをそのキー区間内に有する記入項目を位置指定するために、深さ探索手続きを行う（５０１）。探索キーの探索と、探索キーをそのキー区間が含む現在索引ブロック内の記入項目に対する索引との探索処理を再開するために、この手続きはキービット位置を戻す。
コンピュータが枝挿入手続きを行っているので、現在索引ブロックの索引ブロックタイプは、内側または根である。記入項目のキー区間内に現在キーを有する記入項目を位置指定した後に、現在索引ブロックの深さ記入項目に対する索引ｊが１より大きいならば、後続の深さ変数ｄｉを更新する（５０２）。プログラムは、位置指定記入項目が現在内側タイプ索引ブロックの最初の記入項目ではないことを認識し、後続深さ変数ｄｉを、現在索引ブロック内の位置指定記入項目に先立つ記入項目ｅｊの深さ値に更新する（５０３）。その後で、変数ｄｊを記入項目ｅｊの深さに設定する（５０４）。
この時点で、索引ブロック深さ記入項目と子索引ブロックの部分木とを含む、位置指定された記入項目に対応する、現在索引ブロック内の部分木Ｖ内のｊ番目の子である、索引付けられた子ノードをフェッチする（５０５）。このステップは、非ＮＩＬ記入項目ｐｓの更新された合計によってポインタ記入項目３６ａを索引付けするために、非ＮＩＬ記入項目ｐｓの更新された合計を戻す。更に明確に述べれば、木の現在レベルの複合構造の第１の要素（即ち、カウント構造）が、先行の部分木に関する非ＮＩＬ記入項目カウント情報を含むので、ｊの値までのカウント記入項目の要素を合算し、非ＮＩＬ記入項目のカウントの事前の合計に加え、新たな合計に達する（５０６）。
その後で、ステップ５０４からのフェッチした子ノードのタイプを判定する（５０７）。この子ノードが葉タイプである場合には、葉挿入手続きを行う（５０８）。この子ノードが内側タイプである場合には、枝挿入手続きを行う（５１０）。
枝挿入または葉挿入から処理を戻した後に、現在索引ブロックに対応するカウント記入項目ｃ［ｊ］を、「その以前の値」＋「子索引ブロックの記入項目に関連付けられた新たなキーの数ｎ」に設定する（５１４）。親索引ブロックに関連付けられた新たなキーのカウントｃｎを、子索引ブロックの記入項目に関連付けられた新たなキーのカウントｎだけ増分する（５１４）。
その後で、上記手続きが、索引ブロックがオーバーフル（ｏｖｅｒｆｕｌｌ）であるかどうかを判定することによって、現在子ノードを分割するかどうかを判定する（５２０）。索引ブロック記入項目が、索引ブロック１つ当たりに許容される記入項目の予め決められた最大索引ブロック数を越えてしまった場合には、後述する子分割手続きを行う（５２２）。
現在索引ブロックのキー区間範囲内に現在キーがある（即ち、ｄ′＜ｂ′）かどうかを調べるために検査を行う（５３４）。そうである場合には、区別ビットｂ′をゼロに設定し、これは、子分割が生じたので根レベルにまで挿入を終わらせる（５２６）。両方の場合とも、子索引ブロックの記入項目に関連付けられた新たなキーの数ｎを、現在索引ブロックに関する新たなキーのカウントに対する戻り変数として設定する（５３６）。
索引ブロックがオーバーフルでない場合には、現在索引ブロックのキー区間範囲内に現在キーがある（即ち、ｄ′＜ｂ′）かどうかを調べるための検査を行う（５３４）。現在キーが現在索引ブロックのキー区間範囲内にある場合には、ｂＫリセット手続きを行う（５３８）。いずれにしても、この手続きは、子索引ブロックに加えられた新たなキーのカウントｎ、区別ビットｂ′、及び、キービット位置ｂＫを伴って、呼出し手続きに戻る（５９９）。
６）深さ探索手続き
図１２に示すように、Ｃ0木データ記憶構造上で探索または挿入を行う毎に、キー区間が現在キーに対応する現在索引ブロック内の記入項目を位置指定するために深さ探索手続きを行なう。
索引変数ｋを１に設定し、非ＮＩＬ記入項目のカウントｃである入力変数を減分する（６００）。この手続きは、現在キーの探索を開始するために、現在キービット位置ｂＫと少なくとも同じ大きさである現在探索キーの順序要素ｂ［ｋ］を得る（６０２）。この順序要素は、分析されている現在探索キー内の２つのアルファベット文字の１ビット位置の値（即ち、０と１）から構成される。現在記入項目ｅｊがＮＩＬ記入項目であるかどうかに関して判定を行う（６０４）。この記入項目がＮＩＬ記入項目でない場合には、現在索引ブロックの非ＮＩＬ記入項目のカウントｃを増分する（６０６）。
その後で、この好ましい実施様態は、現在索引ブロックの記入項目ｅｊの深さ値ｄｊが現在順序要素ｂ［ｋ］に等しいかどうかを判定し（６１０）、等しくない場合には、現在順序要素ｂ［ｋ］より小さいかどうかを判定する（６１２）。等しい場合には、索引変数ｋを増分する（６１６）。現在順序要素ｂ［ｋ］に等しくなく、それより大きい場合には、索引ブロックの深さ記入項目に対する索引変数ｊを増分する（６１８）。現在順序要素ｂ［ｋ］より小さい場合には、現在キービット位置ｂＫを、現在順序値ｂ［Ｋ］に等しく設定する（６１４）。最後に、この手続きが呼出しルーチンに戻る（６９９）。現在キーＫのキー区間に対応する深さ記入項目を索引付けるために使用される索引変数の値、ポインタ記入項目３６ａにアクセスするために使用される現在索引ブロックの非ＮＩＬ記入項目のカウントｃ、及び、処理されている索引キーの現在キービット位置をファイルシステムが呼び戻すことを可能にする現在キービット位置ｂＫの決定が戻される。
６ａ）多重レベル探索
探索キーを探索するための適切なプログラム構造を説明してきたので、次に、２つ以上のレベルから構成されるＣ0木の探索キーのキー区間範囲とデータ項目を判定する方法のより詳細な例を、図５と表４を参照しながら説明する。データ記憶構造１５４０は、３つのレベル、即ち、根レベル、内側レベル、及び、葉レベルから構成される。この例に適していない構造１５４０内の幾つかの情報項目は図５に示されておらず、文字Ｘで置き換えられている。従って、現在表示子ビットが、１５７０のような葉レベル構造における対応データ項目の存在を表示するだけなので、根レベル１５４１と内側レベル１５６４の索引ブロック記入項目は、現在表示子ビットを表すＸを有する。更に、記入項目１５７５ｃ以外の、葉レベルにおける索引ブロック記入項目の各々の深さ値は、この探索の例では使用されていないので、Ｘとして示されている。最後に、ポインタ記入項目１５３６ａと記憶コンテナ１５３９との内容は、この例に必要でないので、特に説明していない。
表４に示される通りに、探索キー１００１１００１に対して探索を行うと仮定する。検索キーは、探索キー内の１ビットの順序値ビット位置を含むシーケンスｂ［ｋ］（左から始めて１、４、５、８である）によって表現される。上記の例の場合と同様に、最後の値９が、そのシーケンス内の最後の値の後に加えられる。従って、シーケンスはｂ［ｋ］＝＜１，４，５，８，９＞である。最初に、根ノード１５４７の索引記入項目１５４７ｃの深さ値８９を、探索キーシーケンスの要素と比較する。索引ブロック記入項目１５４７に対する索引ｊが維持され、探索キーシーケンスの順序位置に対する索引ｋが維持される。表４のステップ１では、記入項目１５３０の深さ値ｄ［ｊ］を、探索キーシーケンスの第１の順序要素ｂ［ｋ］（１に等しい）と比較する。深さ値ｄ［ｊ］がその第１の順序要素ｂ［ｋ］よりも大きいので、索引ブロック記入項目１５４７ｃに対する索引ｊを増分する。
表４のステップ２では、索引ブロック記入項目１５４７ｃの第２の記入項目１５３１の深さ値ｄ［ｊ］を、第１の順序要素ｂ［ｋ］と比較する。これらが互いに等しいので、探索キーシーケンスに対する索引ｋを増分する。その後で、索引ブロック記入項目１５４７ｃに対する索引ｊを増分する。
ステップ３においてｊ＝３でｋ＝２であるので、第３の記入項目１５３２の深さ値ｄ［ｊ］を第２の順序要素ｂ［ｋ］と比較する。これら２つの値が互いに等しくなく、且つ、記入項目１５３２の深さ値ｄ［ｊ］が順序値ｂ［ｋ］よりも小さい（即ち、０＜４）ので、探索は、１５４７ａが先頭の索引ブロック内で終わる。これは非葉ノード１５４７なので、記入項目１５３２に対応する子ノードと索引ブロックが得られ、探索される。図５では、これは、部分木１５７０と索引ブロックヘッダ１５３５ａと記入項目１５３５ｃとを有するノード１５３５である。これに加えて、コンピュータシステムが子索引ブロックにおいて容易に且つ効率的に探索手続きを再開することが可能であるように、終端キービット位置ｂＫを現在索引付け順序値ｂ［ｋ］にセットする（即ち、ｂＫ＝４）。
これに加えて、表４のステップ４に示されるように、内側レベル１５６４のカウントヘッダ１５５６の記入項目１５５７及び１５５８が、探索されるべき部分木である第３の記入項目に先行するので、ポインタ構造１５３６に対するポインタ索引ｐｓが、記入項目１５５７及び１５５８内に記憶された値だけ増分される。このポインタ索引ｐｓが、このノード１５３５の以前の兄弟の中の先行する非ＮＩＬ記入項目（Ｆ記入項目で示される）の合計を含む。従って、記入項目１５５７はノード１５３７の複合ヘッダＣに依存する非ＮＩＬ葉記入項目に対応し、記入項目１５３８はノード１５３８の複合ヘッダＣに依存する非ＮＩＬ葉記入項目に対応する。従って、８つの非ＮＩＬ葉記入項目がノード１５３７に依存し、６つの非ＮＩＬ記入項目がノード１５３８に依存するので、ポインタ索引ｐｓは、現時点では１４に等しい。
表４のステップ５では、索引変数ｊが１に初期化される。記入項目１５３５ｃの第１の深さ値ｄ［ｊ］が、第２の順序探索値ｂ［ｋ］と比較される。（図１２のステップ６０２でコンピュータシステムが索引ｋを増分し、親ノード１５４７の探索が終了した時に４に設定された終端キービット位置ｂＫより大きいかそれに等しい探索キーシーケンスにおいて順序要素を得るので、４に等しい第２の順序値が使用される。）ｄ［ｊ］がｂ［ｋ］に等しいので、探索キー配列に対する索引ｋが増分される。その後で、記入項目１５３５ｃに対する索引ｊが増分される。
ステップ６では、索引ブロック記入項目１５３５ｃの第２の記入項目１５５４の深さ値ｄ［ｊ］が、５に等しい第３の順序要素ｂ［Ｋ］と比較される。深さ値ｄ［ｊ］が順序要素ｂ［Ｋ］より小さい（即ち、２＜５）ので、１５３５ａが先頭にあるこの索引ブロック内で探索が終了する。ノード１５３５が内側ノードであるので、記入項目１５３５に対応する子ノードと索引ブロックが得られる。図５では、これはノード１５７５である。終端キービット位置ｂＫが、現在索引付け済みの順序値ｂ［ｋ］に設定される（即ち、ｂＫ＝５）。その後で、ポインタ索引ｐｓがステップ７で更新され、ノード１５７５の以前の兄弟の中の非ＮＩＬ記入項目の数を追加して含む。葉レベルでは、カウントヘッダ１５６０に連結した記入項目１５６１のような各カウント記入項目が、葉構造１５７０内の個々のノード内の非ＮＩＬ記入項目の数に対応し、第１のカウント記入項目１５６１が、葉構造１５７０内の第１のノード１５７６内の非ＮＩＬ記入項目の数に対応する。従って、ポインタ索引ｐｓは、その以前の値である１４にカウント記入項目１５６１の値（５）を加えた１９に等しい。
索引変数ｊと索引変数ｋを再び１に設定する。コンピュータシステムが索引ｋを増分し、終端キービット位置ｂＫより大きいかそれに等しい順序要素ｂ［ｋ］を得る。従って、それは、５に等しい第３の要素を得る。
記入項目１５７５ｃの探索の開始時にゼロに初期化された非ＮＩＬ記入項目のカウント索引ｃが維持される。順序要素ｂ［ｋ］がステップ８で索引ブロック記入項目１５７５ｃの記入項目１５８０の深さ値ｄ［ｊ］よりも小さいので、記入項目１５７５ｃに対する索引が増分される。記入項目ｅｊがＮＩＬ記入項目なので、記入項目１５７５ｃに対する索引ｃは増分されない。ステップ９では、順序要素が再び記入項目１５８１の深さ値ｄ［ｊ］よりも小さい。従って、索引ｊが増分される。記入項目ｅｊが非ＮＩＬ記入項目なので索引ｃが増分される。ステップ１０では、非ＮＩＬ記入項目１５８２の深さ値ｄ［ｊ］が現在順序要素ｂ［ｋ］に等しい。従って、索引ｋも増分される。
ステップ１１では、第４の非ＮＩＬ記入項目１５８３の深さ値ｄ［ｊ］が、第３の順序要素ｂ［Ｋ］と比較される。同様に、その値が等しい（即ち、８＝８）。索引ｋ、ｊ及びｃが増分される。最後に、第５の記入項目１５８４の深さ値ｄ［ｊ］が、第４の順序要素ｂ［ｋ］と比較される。この深さ値ｄ［ｊ］は順序要素ｂ［ｋ］より小さく（即ち、６＜９）、葉レベルが現在において探索されているので、探索キー１００１１００１に対応する正しい記入項目が発見されている。
この点で、ステップ１３で、ポインタ索引ｐｓがカウント索引ｃだけ増分される（即ち、１９＋４＝２３）。これは、記入項目１５８４に先立ち且つこれを含む非ＮＩＬ記入項目の合計を与える。記憶コンテナ１５３９内の正しいデータ項目に対する参照可能索引（または、ポインタ）を含むポインタ記入項目１５３６ａ内の２３番目の記入項目を選択するために、この２３が使用される。
７）バルク処理手続き
図８と図９に示されるバッファ内で処理するための次のキーを得るバルク処理手続きが、図１３に示されている。この手続きの目的は、メモリ８内のバッファ内で処理して以前のキーＫと次のキーＫｉとの間の区別ビットを判定するために、次のキーＫｉをフェッチすることである。
この手続きは、上記バッファ内に更に別のキーが存在することを判定することである（７００）。上記バッファ内に更に別のキーが存在する場合には、逐次処理するためのそのバッファ内の次のキーをＫｉ内にフェッチする（７０２）。次に、以前のキーＫと処理されるべき現在キーＫｉとが等しいかどうかに関する判定を行う（７０４）。逐次処理されるべき探査キーが上記バッファ内で辞書順にソートされるので、この好ましい実施様態は、複製キーが存在する時を判定し、この探索キーを処理しないことが可能である。従って、このステップがこれら２つのキーが互いに等しいと判定する場合に、ステップ７００へのフィードバックループが行われる。これら２つのキーが互いに等しくない（ＮＥ）と判定される場合には、これら２つのキーの区別ビットが発見される（７０６）。その後で、好ましい実施様態が現在キーを設定する。言い換えれば、プログラムは、処理されるべき新たなキーＫｉを現在キー変数Ｋに移す（７０８）。
現在バッファ内に処理されるべきキーがもう存在しない場合には、区別ビットｂ′を０に設定し、これは根レベルに対する処理を終了させる（７１０）。これを行うことによって、特にステップ２１８、３２８、４１４、５２４、５３４において次のキーが現在索引ブロックのキー区間内にあるかどうかを判定する時に、上記プログラム構造の手続きは、バッファ内に処理すべきキーがもう存在しないと判定することが可能である。最後に、この手続きが、区別ビットｂ′と新たなキーＫとを伴ってその呼出しルーチンに戻る（７９９）。
８）ｂＫリセット機能
次に、図８、図９、図１０、図１１に示したｂＫリセット機能を、図１４に詳細に示す。この手続きは、現在探索キーに関する逐次処理を再開するためにキービット位置ｂＫを判定する。逐次処理された探索キーがバッファ内で辞書順であるので、この手続きは、キービット位置を判定することが可能である。順序付けられたシーケンスのこの特性は、この好ましい実施様態が設計通りに機能することを可能にする。この手続きは、最初に、現在記入項目ｅｊに対する現在索引ｊが現在索引ブロック内で１番目であるかどうかを判定する（８００）。そうである場合には、区別ビットｂ′を現在キービット位置ｂＫと比較する（８０２）。区別ビットｂ′が少なくともキービット位置と同じ大きさである場合には、キービット位置ｂＫを後続の変数ｄｉと区別ビットｂ′とに対して比較する（８０４）。
後続変数ｄｉ、ｂＫリセット機能に対する入力変数、及び、現在キービット位置ｂＫに対して、区別ビットｂ′を比較する（８０６）。後続変数ｄｉが、現在キービット位置ｂＫより小さい区別ビットｂ′よりも小さい場合には、キービット位置ｂＫを、「後続変数ｄｉ」＋１に設定する（８０８）。
ステップ８００が、深さ記入項目に対する現在索引ｊが１でない（ＮＥ）と判定する場合には、区別ビットｂ′が現在キービット位置ｂＫより小さいかどうかに関する判定を行う（８１０）。そうである場合には、キービット位置ｂＫを区別ビットｂ′の値に設定する（８１２）。いずれにしても、キービット位置ｂＫの値を戻す（８９９）。
９）深さ追加手続き
葉挿入手続きからステップ３２０によって呼び出される深さ追加手続きを、図１５に示す。この手続きの目的は、現在索引ブロックに記入項目を加えることによって、記入項目によって定義されたキー区間内に探索キーが属する位置指定記入項目に関連した現在探索キーの索引付け情報を記憶するための、索引記入項目の正しい配置を判定することである。現在探索キーと以前の探索キーの両方が同じキー区間内に属するので、これが生じる。
正しい配置を判定するために、このプログラムは、図２ｂに示される木１４３０のような概念０完全木内の位置指定記入項目と以前に位置指定されたキーとに関連付けられた葉ノードの深さを判定しなければならない。これはＣ0木表現の中に記録されていない。境界ノードの深さだけが記入項目内に記録されている。図２ｂに示す通りに、概念０完全木内の葉ノードの深さは、コンパクト０完全木の定義によって決定することが可能である。この手続きは、最初に、現在記入項目ｅｊが索引ブロック内の１番目であるかどうかを判定する（９００）。そうでない場合には、索引ブロック内の現在記入項目の深さｄ［ｊ］を、以前の記入項目の深さｄ［ｊ−１］と比較する（９０２）。この比較に基づいて、位置指定記入項目の深さが、ＬＴ以前の記入項目の深さよりも小さい場合には、概念０完全木内の葉ノードの深さｌｉを索引ブロック内の以前の記入項目の深さｄ［ｊ−１］に等しく設定する（９０８）。位置指定記入項目の深さがＧＴより大きい場合には、概念０完全木内の葉ノードの深さｌｉを現在記入項目の深さｄ［ｊ］に等しく設定する（９０６）。最後に、位置指定記入項目が索引ブロック内の１番目である場合には、概念０完全木内の葉ノードの実深さｌｉを、親索引ブロックの以前の記入項目の深さ値である現在後続変数ｄｉに等しく設定する（９０４）。
その次に、索引変数ｉを、索引ブロック記入項目に対する現在索引ｊに設定し、処理されている現在キーＫと位置指定記入項目によって索引付けられたキーＫｉとの区別ビットｂ′を判定する（９１０）。区別ビットｂ′が概念０完全木の葉ノードの実深さｌｉより小さい場合（９１２）には、追加されるべき索引記入項目が前順シーケンス内の位置指定記入項目の後にくる。現在探索キーのアクセス経路と位置指定記入項目のキーのアクセス経路との間の区別を保存するために、更に別の記入項目を現在木構造に加えなければならない。概念木が依然として０完全であることを確保するために、表示子ビットが真に設定されるＮＩＬ記入項目を加えることが必要である可能性もある。
概念０完全木内の葉ノードの深さｌｉに１を加えた値よりも大きい探索キーの順序要素ｂ［ｋ］が得られる。その後で、現在索引付き順序要素ｂ［ｋ］を、区別ビットｂ′と比較する（９１８）。これが、ＬＴ区別ビットｂ′よりも小さい場合には、現在索引付け記入項目ｅｉの前に、記入項目を現在索引ブロック内に挿入する（９２４）。新たに挿入された索引付き記入項目ｅｉの深さ値を、現在探索キーの現在索引付き順序位置ｂ［ｋ］に設定し、現在索引付き記入項目ｅｉの表示子を、ＮＩＬ記入項目を示すＴに設定する（９３２）。現在探索キーの順序要素に対する索引ｋを増分する（９３８）。その次に、現在索引ブロックの記入項目に対する索引ｉを増分し（９４０）、ステップ９１８でループが継続する。処理されている現在キーＫが、位置指定記入項目によって以前に索引付けられたキーＫｉより大きい場合（９２０）には、フラグｆを１に設定する（９２２）。処理されている現在キーＫが、位置指定記入項目によって以前に索引付けられたキーＫｉより小さい場合には、フラグｆをゼロに設定する（９２６）。現在索引付け記入項目ｅｉの前に記入項目を挿入する（９３０）。新たに挿入された索引付き記入項目ｅｉの深さ値を区別ビットｂ′に設定し、現在索引付け記入項目の表示子を、非ＮＩＬ即ち（Ｆ）に設定し（９３４）、この手続きがフラグｆを呼出しルーチンに戻す。
１０）分割ルーチン
次に、特に、索引ブロック内の記入項目の数が予め決められた最大索引ブロック数より大きいことを判定した後での索引ブロックの分割と、記入項目の数が閾値最大数よりの大きいことを判定した後のブロックの分割とに関して、索引ブロックを分割するための方法を説明する。
１０ａ）根分割手続き
根分割手続きを図１６ａに示し、分割されている根ノードの例を図１６ｂと図１６ｃに示す。図１６ａのこの手続きの説明を参照しながら、図１６ｂと図１６ｃの例を更に詳細に説明する。この手続きの目的は、索引ブロックが予め決められた最大索引ブロック数に達した時に、または、索引ブロックが混入項目の最大閾値数ＴＨに達したとプログラムが判定する時に、根ノード及び索引ブロックを分割することである。この手続きの各ステップは次の通りである。
図１６ｂに示す古い根ノードＲを分割し、図１６ｃの索引ブロックＩ′と部分木Ｖ′とを含む新たな根ノードＲ′を生じさせる。この古い根ノードは、新たな根ノードの部分木Ｖ′に依存する。新たな根ノードＩ′、Ｖ′を生じさせ（１０００）、分割されるべき根索引ブロックＩ内の最小深さ値を有する深さ記入項目を判定するために、後述する図１８の最小深さ手続きを呼び出す（１００２）。新たな根索引ブロックＩ′の第１の記入項目ｅ１の深さ値を、古い根ノードＲの第１の索引ブロックＩの判定された最小深さ値ｄｍｉｎに設定し（１００４）、図１６ｂに示すように、第２の記入項目ｅ２の深さ値を、古い根Ｒの索引ブロックＩの最後の深さ値である０に設定する（１００６）。新たな根Ｒ′の複合部分木Ｖ′を、分割されている古い根ノードＲに連結させる（１００８）。個々の部分木の各々に依存する非ＮＩＬ記入項目の合計を判定し、カウント構造の記入項目ｃ内に配置し、この場合には、第１の記入項目ｃ［１］が第１の部分木Ｖ０に対応し（１０１０）、第２の記入項目ｃ［２］が第２の部分木Ｖ１に対応する（１０１２）。しかし、上記古い根ノードＲが現在は葉レベルである場合には、カウント構造記入項目ｃ［１］及びｃ［２］が、その個々の索引ブロックＩ0及びＩ1内の非ＮＩＬ記入項目の数を含む。後述するノード分割手続きが、古い根ノードＩ、Ｖを、２つのノードと２つの索引ブロックとに分割し、第２の索引ブロックＩ1内の記入項目の数に等しい値ｎを戻す（１０１４）。新たな根ノードＲ′に依存する２つの索引ブロックの子索引ブロック即ち第２の索引ブロックＩ1がオーバーフルである（即ち、ｎ＞ＴＨ）場合には（１０１６）、第２の子ノードを得て（１０１８）、この子ノードを分割する（１０２０）。
新たな根ノードＲ′の複合部分木Ｖ′に依存する第１の索引ブロックＩ0がオーバーフルである場合には（１０２２）、第１の子ノードが得られ（１０２４）、分割される（１０２６）。いずれにしても、この手続きから出る（１０９９）。図１６ｂと図１６ｃに示すように、以前には１つの索引ブロックＩを有した古い根ノードＲが、この時点では、部分木Ｖ0と部分木Ｖ1を各々に有する索引ブロックＩ0と索引ブロックＩ1に分割されている。
１０ｂ）子分割手続き
索引ブロックがオーバーフルであると判定される時に、子分割手続きが、ブロック１０２０とブロック１０２６とにおいて根分割手続きから呼び出され、ブロック１２１６において子分割手続きから呼び出され、ブロック５２２において枝挿入手続きから呼び出される。この手続きは図１７に示されている。この手続きは、子ノードの索引ブロックがオーバーフルであると判定される限り、ノードとその個々の索引ブロックとを分割し続ける。この手続きの各ステップは次の通りである。
索引ブロックＳＰＬＩＴＳの分割数のカウントをゼロに初期化する（１２００）。現在索引ブロックの最小深さを、後述する最小深さ手続きを呼び出すことによって判定する（１２０２）。その次に、前述のノード分割手続きによって、ｊ番目のノードの現在索引ブロックＩｊを索引ブロックＩｊと索引ブロックＩｊ＋１とに分割し、部分木Ｖｊと部分Ｖｊ＋１とに分割する（１２０４）。索引ブロックＳＰＬＩＴＳの数のカウントを増分する（１２０６）。その次に、現在分割されている索引ブロックＩｊの親索引ブロック内に、記入項目ｅｊの前に記入項目を挿入する（１２０８）。現在分割されている現在索引ブロックＩｊの親索引ブロックの記入項目ｅｊは、（最小深さ手続きによって判定される）分割されている現在索引ブロックの最小深さｄｍｉｎに設定された深さ値と、非ＮＩＬ（Ｆ）に設定されたその表示子とを有する（１２１０）。
現在索引ブロック内で分割が生じた後の記入項目の索引ｉｍｉｎが、予め決められたオーバーフル索引ブロック数ＴＨより大きいかどうかに関する判定を行う（１２１２）。そうである場合には、ｊ番目の子、即ち、現在の分割によって生じた２つのノードのうちの第１のノードを、部分木Ｖからフェッチし（１２１４）、分割する（１２１６）。分割数のカウントを、ステップ１２１６で子を分割するための呼出しの際に生じたｊ番目の子索引ブロック内のＳＰＬＩＴＳの数１ｓだけ増分し（１２１８）、同様に、分割すべき子の索引ｊを増分する（１２２０）。
その後で、新たに生じた分割ブロック内の記入項目の数ｎが最大索引ブロック数ＴＨより小さいかどうかに関して判定を行う（１２２２）。そうでない場合には、分割されるべきノードと個々の索引ブロックの索引ｊを増分し（１２２６）、分割すべき新たなｊ番目の子ノードを、以前に分割したノードと個々の索引ブロックの親部分木からフェッチする（１２２８）。そうでなく、分割後に生じた新たな索引ブロック内の記入項目の数ｎが最大索引ブロック数ＴＨより小さい場合には、この手続きは分割数ｎを伴ってその呼出しルーチンに戻る（１２９９）。
１０ｃ）最小深さ手続き
１つの索引ブロック内の最小深さ値を得ることによって後で分割するための記入項目の索引を判定するために、ブロック１１０２における根分割手続きとブロック１２０２における子分割手続きとによって使用される最小深さ手続きは、図１８に示す各ステップによって行われる。
最初に、現在記入項目に先行し且つこれを含む非ＮＩＬ記入項目のカウントｃｎｔと、最小深さ記入項目に先行し且つこれを含む非ＮＩＬ記入項目のカウントｃとを初期化する。最小記入項目の索引ｉｍｉｎと索引ブロックに対する索引ｊとを同様に１に設定する。索引ブロック内の最後の記入項目の索引ｉｌａｓｔを、現在索引ブロック内の記入項目の数に設定する。最後に、現在索引ブロックの記入項目の深さ値の中間点の索引ｉｍｉｄを、最後の記入項目の索引ｉｌａｓｔの中間点ｉｌａｓｔ／２に設定する（１３００）。最小深さ記入項目の深さ値ｄｉｍｉｎを、探索キーの最大長さ＋１（即ち、Ｍ＋１）に設定する（１３０２）。現在記入項目の深さｄｊを割り当てる（１３０４）。その後で、現在記入項目ｅｊの表示子が、ＮＩＬ記入項目に対応するＴであるかどうかに関して判定を行う（１３０６）。そうでない場合には、現在記入項目に先行し且つこれを含む非ＮＩＬ記入項目のカウントｃｎｔを増分する（１３０８）。
現在記入項目の深さ値ｄｊが最小深さ記入項目の値ｄｍｉｎより小さいかどうかに関する判定を行う（１３１０）。深さ値ｄｊが最小深さ記入項目の値ｄｍｉｎより小さい場合には、現在索引ブロックに対する索引ｊが現在索引ブロックの深さ値の中間点の索引ｉｍｉｄより大きいかどうかに関して判定を行う（１３１２）。現在索引ブロックに対する索引ｊが上記中間点の索引ｉｍｉｄより小さいかまたはこれと等しい場合には、最小記入項目の索引ｉｍｉｎを現在記入項目ｅｊの索引ｊに設定し、現在索引ブロックの最小深さ記入項目に先行し且つこれを含む非ＮＩＬ記入項目のカウントｃを、現在記入項目に先行し且つこれを含む非ＮＩＬ記入項目のカウントｃｎｔに設定する（１３１８）。最小深さ記入項目の深さ値ｄｍｉｎを現在深さ値ｄｊに設定し（１３２０）、現在索引ブロック内の記入項目に対する索引ｊを増分する（１３２２）。
ステップ１３１２において、現在索引ブロック記入項目に対する索引ｊが現在索引ブロック内の中間点の索引ｉｍｉｄより大きい場合には、中間点の索引ｉｍｉｄから最小記入項目の索引ｉｍｉｎをマイナスした値が、現在索引ブロック記入項目の索引ｊから現在索引ブロックの深さ値の中間点の索引ｉｍｉｄをマイナスした値と少なくとも同じ大きさであるかどうかに関する判定を行う（１３１４）。少なくとも同じ大きさである場合には、最小記入項目の索引ｉｍｉｎを、現在索引ブロック記入項目に対する索引ｊに設定し、最小深さ記入項目に先行し且つこれを含む非ＮＩＬ記入項目のカウントｃを、現在記入項目ｅｊに先行し且つこれを含む非ＮＩＬ記入項目のカウントｃｎｔに等しく設定する（１３１６）。
現在索引ブロック記入項目に対する索引ｊが現在索引ブロック内の最後の記入項目の索引ｉｌａｓｔに等しいかどうかに関する判定を、ステップ１３２２で行う。この索引ｊが索引ｉｌａｓｔよりも小さい場合には、ループがステップ１３０４に戻る。いずれにしても、この手続きは、最小深さ記入項目に先行し且つこれを含む非ＮＩＬ記入項目のカウントｃと、最小記入項目の索引ｉｍｉｎと、最小深さ記入項目の値ｄｍｉｎとを伴って、その呼出しルーチンに戻る（１３９９）。
１０ｄ）ノード分割手続き
ブロック１０１４における根分割手続きとブロック１２０４における子分割手続きとから呼び出されるノード分割手続きが、現在ノードと最小深さ値のその個々の索引ブロックを分割する。図１９にこの手続きが示されている。各々が１つの索引ブロックを有する２つのノードが生じさせられる。第１のノードの索引ブロックＩは、最小深さ記入項目までの分割索引ブロックの第１の記入項目を含み、第２のノードの索引ブロックＩｊ＋１が、分割された索引ブロックの最終記入項目までの最小深さ値の後で生じる記入項目を含む。
分割されるべきノードの索引ブロックＩｊと部分木Ｖｊの後に、現在レベル内にノードＩｊ＋１、Ｖｊ＋１を挿入する（１４００）。その新たなノードの新たに生じさせられた索引ブロックＩｊ＋１は、分割されるべき索引ブロック内の最終記入項目ｅilastまでの最小深さ値の後に生じる記入項目ｅimin+1から開始する、分割されるべき索引ブロックＩｊからの記入項目を含むだろう（１４０２）。分割されるべき索引ブロックＩｊを、最小深さ値を含む記入項目ｅiminまでの以前の第１の記入項目を含むように更新する（１４０４）。新たに生じさせられた索引ブロックＩｊ＋１内の記入項目の数ｎを、分割すべき現在索引ブロックＩｊ内の記入項目の数の索引ｉｌａｓｔから後で分割するための最小深さ記入項目の索引ｉｍｉｎをマイナスした値に設定する（１４０６）。
その後で、この手続きは、部分木Ｖjを検査することによって、分割されるべきノードが葉タイプであるかどうかを判定する（１４０８）。そうでなく、ノードタイプが内側タイプである場合には、分割されるべきノードの部分木Ｖｊ内のカウント要素を含むカウント構造ｃをフェッチする（１４１０）。最小深さ記入項目に先行し且つこれを含む非ＮＩＬ記入項目の数ｃｎｔを、後で分割するための記入項目の索引ｉｍｉｎによって索引付けられたカウント構造の要素までのカウント構造ｃの第１の要素の合計に等しく設定する（１４１２）。新たに生じたノードの部分木Ｖｊ＋１に関するカウント構造が、分割されている索引ブロック内の最後の記入項目の索引ｉｌａｓｔまで、後で分割すべき記入項目の索引ｉｍｉｎ＋１によって索引付けられた分割ノードのカウント構造の要素を含む（１４１４）。新たに生じさせられたノードの部分木Ｖｊ＋１を、現時点で分割されているノードの索引ブロックＩｊ内の記入項目の数の索引ｉｌａｓｔまでの、後で分割すべき記入項目の索引ｉｍｉｎ＋１によって索引付けられた分割ノードの部分木要素に設定する（１４１６）。
分割ノードの部分木Ｖｊに関連付けられたカウント構造を、そこで分割すべきノードのｉｍｉｎによって索引付けられた要素全てに関して第１の要素を含むように調節する（１４１８）。更に、分割ノードのｊ番目のノードの部分木を、そこで分割すべき記入項目の索引ｉｍｉｎまで第１の要素によって索引付けられた要素を含むように調節する（１４２０）。分割されるべきノードの現在レベルにおけるカウント構造をフェッチする（１４２２）。分割すべき部分木の索引ｊによって索引付けられた要素の後に、記入項目をカウント構造内に挿入する（１４２４）。この新たに生じた要素ｃ［ｊ＋１］に、カウント構造の先行要素内の非ＮＩＬ記入項目のカウントｃ［ｊ］から最小深さ記入項目に先行し且つこれを含む非ＮＩＬ記入項目の数ｃｎｔをマイナスした値を割り当てる（１４２６）。分割すべき部分木の索引ｊによって索引付けられたカウント構造の要素ｃ［ｊ］に、最小深さ記入項目に先行し且つこれを含む非ＮＩＬ記入項目の数ｃｎｔを割り当てる（１４２８）。その後で、この手続きが、新たに生じさせられた索引ブロック内の記入項目の数ｎを戻す。
本発明の好ましい実施様態のプログラム構造を、適切な手続きを参照しながら上記で詳細に説明してきた。本発明を、その実施様態を参照しながら特定の形で示し説明してきたが、本発明の範囲と思想とから逸脱することなく、その形態と詳細とにおける上記変更と他の変更とを行うことが可能であることが、当業者には理解されるだろう。
0003771271.tif 000002
0003771271.tif 000003
0003771271.tif 000004
0003771271.tif 000005
0003771271.tif 000006
0003771271.tif 000007
【図１ａ】
0003771271.tif 000008
【図１ｂ】
0003771271.tif 000009
【図２ａ】
0003771271.tif 000010
【図２ｂ】
0003771271.tif 000011
【図３ａ】
0003771271.tif 000012
【図３ｂ】
0003771271.tif 000013
【図４ａ】
0003771271.tif 000014
【図４ｂ】
0003771271.tif 000015
【図５】
0003771271.tif 000016
【図６ａ】
0003771271.tif 000017
【図６ｂ】
0003771271.tif 000018
【図７】
0003771271.tif 000019
【図８】
0003771271.tif 000020
【図９】
0003771271.tif 000021
【図１０】
0003771271.tif 000022
【図１１】
0003771271.tif 000023
【図１２】
0003771271.tif 000024
【図１３】
0003771271.tif 000025
【図１４】
0003771271.tif 000026
【図１５】
0003771271.tif 000027
【図１６ａ】
0003771271.tif 000028
【図１６ｂ】
0003771271.tif 000029
【図１６ｃ】
0003771271.tif 000030
【図１７】
0003771271.tif 000031
【図１８】
0003771271.tif 000032
【図１９】
0003771271.tif 000033