(57)【要約】０コンプリートバイナリツリーのコンパクト表現を使用するデータベースインデックスの格納、挿入、削除、及びサーチの方法及び装置である。Ｃ0トライと呼ばれるコンパクト表現（５００）は、コンピュータメモリ内において、レイヤ化されたベクトル（５０２、５０８、５１８）の組として表現されており、このベクトルのレイヤ化は、Ｃ0トライの深さに対応している。挿入及び削除プロセスは、それぞれの処理の終了時点において、このＣ0トライの表現を、適格性と整然性を有する状態に維持しており、この結果、コンピュータメモリ内におけるこのＣ0トライの後続の効率的な処理が提供される。
2006521623.tif 000002
【特許請求の範囲】
【請求項１】
Ｃ0トライのリーフの深さのエンコードされた深さ値を具備する深さベクトルであって、前記対応するリーフが、空のリーフノードであるかどうかを示すべくエンコードされており、任意の長さを有している深さベクトルと、
複合ベクトルとしてグループ化されたセレクタベクトルの組であって、それぞれのセレクタベクトルは、前記Ｃ0トライの１つのレベルに対応しており、それぞれのセレクタベクトルは、前記深さベクトルのエントリーを選択するべく使用されるビットベクトルであって、前記セレクタベクトルの組内の前記セレクタベクトルの数は任意である、セレクタベクトルの組と、
複合ベクトルとしてグループ化されたカウンタベクトルの組であって、それぞれのセレクタベクトルは、対応するカウンタベクトルとペアをなしており、前記カウンタベクトルは、その長さが、前記対応するセレクタベクトル内の１のビットの数に等しい、カウンタベクトルの組と、
を有するＣ0トライを表現するコンピュータ利用データ構造。
【請求項２】
前記Ｃ0トライの任意のレベルｌのサブトライＡと、そのレベルｌの先行するサブトライＢについて、前記Ａのすべてのレベルｌ−１のサブトライの深さは、前記Ａ及びＢの深さを上回っており、
前記Ｃ0トライ内の値又はストリングは、前記サブトライの前記リーフ内に空のノードを含まないことにより、最短であり得るプリフィックスによって弁別される請求項１記載のコンピュータ利用データ構造。
【請求項３】
最上位サーチレベルの下の次のレベル内のそれぞれのサブトライごとに、前記最上位−１サーチレベルのサブトライの深さをサーチする段階と、
前記最上位−１サーチレベルのセレクタベクトルによって選択された深さ値をチェックする段階と、
前記値が前記現在の最上位−１サーチレベルのサブトライの一部であると識別されない場合に、サーチ対象の残りの最上位−１レベルのサブトライが存在しているかどうかを判定する段階と、
サーチ対象の残りの最上位−１レベルのサブトライが存在しない場合には、本プロセスを終了し、サーチ対象の更なる最上位−１レベルのサブトライが存在している場合には、前記残りの最上位−１レベルのサブトライのサーチを継続する段階と、
前記サーチ対象の値を含む最上位−１サーチレベルのサブトライが識別された際に、前記現在の最上位−１サーチレベルを前記最上位サーチレベルとし、前記識別された最上位−１サーチレベルのサブトライを、識別された最上位サーチレベルのサブトライとすることにより、本プロセスを１レベル降下させる段階と、
新しい最上位サーチレベルが、リーフセレクタレベルであるかどうかを判定し、そうではない場合に、前記識別された最上位サーチレベルのサブトライの前記最上位−１サーチレベルのサブトライのサーチを継続する段階と、
を有するコンピュータ利用Ｃ0トライサーチ方法。
【請求項４】
削除対象の語彙的識別子のリストを受けとる段階と、
前記削除対象の語彙的識別子の数が閾値を上回っている場合に、前記Ｃ0トライ内の残りの語彙的識別子を使用して新しいＣ0トライを生成する段階と、
前記削除対象の語彙的識別子の数が前記閾値を上回っていない場合に、以下の段階、すなわち、
前記Ｃ0トライ内に２つのレベルのみが存在している場合に、前記語彙的識別子を含むリーフを削除し、
前記Ｃ0トライが２つを上回る数のレベルを具備している場合に、削除対象の語彙的識別子を含む前記Ｃ0トライのブランチを縦断し、前記Ｃ0トライの前記ブランチから前記語彙的識別子を削除し、
前記残りのＣ0トライが２つを上回る数のレベルを具備している場合に、前記Ｃ0トライをチェックし、前記Ｃ0トライのサブトライをマージする段階と、
を有するコンピュータ利用Ｃ0トライ削除方法。
【請求項５】
挿入対象の値を受領する段階と、
前記Ｃ0トライが２つのレベルを具備している場合に、挿入する値が存在している限り、値が属している前記Ｃ0トライの既存のリーフ内のキーインターバルを識別し、前記識別されたキーインターバル内に１つ又は複数の値を挿入する段階と、
前記Ｃ0トライのサブトライが、前記サブツリーの深さ以下の深さを具備する新しい値を含んでいる場合に、前記サブトライを分割する段階と、
すべての値の挿入が完了した後に、前記Ｃ0トライをチェックし、必要に応じて分割する段階と、
を有するコンピュータ利用Ｃ0トライ挿入方法。
【請求項６】
前記Ｃ0トライが２つを上回る数のレベルを具備している場合に、
挿入対象の値が存在している限り、
現在のレベルの直下の選択されたレベルが、リーフレベルの上のレベルでない限り、前記現在のレベルの直下のどのレベルが、キーインターバルが値を含んでいる前記Ｃ0トライのサブトライを含んでいるかを再帰的に判定し、前記判定されたサブトライを選択し、
値が属している前記Ｃ0トライの既存のリーフ内のキーインターバルを識別し、
前記識別されたキーインターバル内に１つ又は複数の値を挿入し、
前記サブトライが、前記サブツリーの深さ以下の深さを具備する新しい値を含んでいる場合に、前記サブトライを分割し、
すべての値の挿入が完了した後に、前記Ｃ0トライをチェックし、必要に応じてサブトライを分割することを
を反復して実行する段階を更に有する請求項５記載の方法。
【請求項７】
Ｃ0トライを実現するデータ処理システムであって、
プロセッサと、
前記プロセッサに接続されたメモリであって、前記メモリは、その内部に格納されたプロセッサ実行可能なプログラム命令を具備しており、
前記プログラム命令は、
Ｃ0トライのリーフの深さのエンコードされた深さ値を具備する深さベクトルを与える手順であって、前記深さベクトルは、前記対応するリーフが、空のリーフノードであるかどうかを示すべくエンコードされており、任意の長さを有している、手順と、
複合ベクトルとしてグループ化されたセレクタベクトルを与える手順であって、それぞれのセレクタベクトルは、前記Ｃ0トライの１つのレベルに対応しており、それぞれのセレクタベクトルは、前記深さベクトルのエントリーを選択するべく使用されるベクトルであって、前記セレクタベクトルの組内の前記セレクタベクトルの数は任意である、手順と、
複合ベクトルとしてグループ化されたカウンタベクトルの組を与える手順であって、それぞれのセレクタベクトルは、対応するカウンタベクトルとペアをなしており、前記カウンタベクトルは、その長さが、前記対応するセレクタベクトル内の１のビットの数と等しいベクトルである、手順と、
を含んでいるデータ処理システム。
【請求項８】
前記コンパクトＣ0トライの任意のレベルｌのサブトライＡと、そのレベルｌの先行するサブトライＢについて、前記Ａのすべてのレベルｌ−１のサブトライの深さは、前記Ａ及びＢの深さを上回っており、
前記コンパクトＣ0トライ内の値又はストリングは、前記サブトライの前記リーフ内に空のノードを含まないことにより、最短であり得るプリフィックスによって弁別される請求項７記載のデータ処理システム。
【請求項９】
Ｃ0トライサーチ方法を実現するデータ処理システムであって、
プロセッサと、
前記プロセッサに接続されたメモリであって、前記メモリは、その内部に格納されたプロセッサ実行可能なプログラム命令を具備しており、
前記プログラム命令は、
最上位サーチレベルの下の次のレベル内のそれぞれのサブトライごとに、前記最上位−１サーチレベルのサブトライの深さをサーチする手順と、
前記最上位−１サーチレベルのセレクタベクトルによって選択された深さ値をチェックする手順と、
前記値が、前記現在の最上位−１サーチレベルのサブトライの一部であると識別されない場合に、サーチ対象の残りの最上位−１レベルのサブトライが存在しているかどうかを判定する手順と、
サーチ対象の残りの最上位−１レベルのサブトライが存在しない場合には、本プロセスを終了し、サーチ対象の他の最上位−１レベルのサブトライが存在している場合には、前記残りの最上位−１レベルのサブトライのサーチを継続する手順と、
前記サーチ対象の値を含む最上位−１サーチレベルサブトライが識別された場合に、前記現在の最上位−１サーチレベルを前記最上位サーチレベルとし、前記識別された最上位−１サーチレベルのサブトライを、識別された最上位サーチレベルのサブトライとすることにより、本プロセスを１レベル降下させる手順と、
新しい最上位サーチレベルがリーフセレクタレベルであるかどうかを判定し、そうではない場合に、前記識別された最上位サーチレベルのサブトライの前記最上位−１サーチレベルのサブトライのサーチを継続する手順と、
を含んでいるデータ処理システム。
【請求項１０】
Ｃ0トライ削除方法を実現するデータ処理システムであって、
プロセッサと、
前記プロセッサに接続されたメモリであって、前記メモリは、その内部に格納されたプロセッサ実行可能なプログラム命令を具備しており、
前記プログラム命令は、
削除対象の語彙的識別子のリストを受けとる手順と、
前記削除対象の語彙的識別子の数が閾値を上回っている場合に、前記Ｃ0トライ内の残りの語彙的識別子を使用して新しいＣ0トライを生成する手順と、
前記削除対象の語彙的識別子の数が前記閾値を上回っていない場合に、
前記Ｃ0トライ内に２つのレベルのみが存在している場合に、前記語彙的識別子を含むリーフを削除し、
前記Ｃ0トライが２つを上回る数のレベルを具備している場合に、削除対象の語彙的識別子を含む前記Ｃ0トライのブランチを縦断し、前記Ｃ0トライの前記ブランチから前記語彙的識別子を削除する手順と、
前記残りのＣ0トライが２つを上回る数のレベルを具備している場合に、前記Ｃ0トライをチェックし、前記Ｃ0トライのサブトライをマージする手順と、
を実行する手順と、
を含むデータ処理システム。
【請求項１１】
Ｃ0トライ挿入方法を実現するデータ処理システムであって、
プロセッサと、
前記プロセッサに接続されたメモリであって、前記メモリは、その内部に格納されたプロセッサ実行可能なプログラム命令を具備しており、
前記プログラム命令は、
挿入対象の値を受けとる手順と、
前記Ｃ0トライが２つのレベルを具備している場合に、
挿入する値が存在している限り、値が属している前記Ｃ0トライの既存のリーフ内のキーインターバルを識別し、前記識別されたキーインターバル内に１つ又は複数の値を挿入することを反復的に実行する手順と、
前記Ｃ0トライのサブトライが、前記サブツリーの深さ以下の深さを具備する新しい値を含んでいる場合に、前記サブトライを分割する手順と、
すべての値の挿入が完了した後に、前記Ｃ0トライをチェックし、必要に応じて分割する手順と、
を含んでいるデータ処理システム。
【請求項１２】
前記プログラム命令は、
前記Ｃ0トライが、２つを上回る数のレベルを具備している場合に、
挿入対象の値が存在している限り、
現在のレベルの直下の選択されたレベルがリーフレベルの上のレベルでない限り、前記現在のレベルのサブトライの直下のどのサブトライが、値を含むキーインターバルを含んでいるかを再帰的に判定し、前記判定されたサブトライを選択する手順と、
値が属している前記Ｃ0トライの既存のリーフ内のキーインターバルを識別する手順と、
前記識別されたキーインターバル内に１つ又は複数の値を挿入する手順と、
前記サブトライが、前記サブツリーの深さ以下の深さを具備する新しい値を含んでいる場合に、前記サブトライを分割する手順と、
すべての値の挿入が完了した後に、前記Ｃ0トライをチェックし、必要に応じてサブトライを分割する手順と、
を反復的に実行する手順を更に含む請求項１１記載のデータ処理システム。
【請求項１３】
Ｃ0トライを表現するデータ構造を実現するコンピュータプログラム命令を具体化するコンピュータプログラムプロダクトであって、
前記プログラム命令は、
Ｃ0トライのリーフの深さのエンコードされた深さ値を具備する深さベクトルを提供する手順であって、前記深さベクトルは、前記対応するリーフが空のリーフノードであるかどうかを示すべくエンコードされており、任意の長さを有している、手順と、
複合ベクトルとしてグループ化されたセレクタベクトルの組を提供する手順であって、それぞれのセレクタベクトルは、前記Ｃ0トライの１つのレベルに対応しており、それぞれのセレクタベクトルは、前記深さベクトルのエントリーを選択するべく使用されるベクトルであって、前記セレクタベクトルの組内の前記セレクタベクトルの数は任意である、手順と、
複合ベクトルとしてグループ化されたカウンタベクトルの組を提供する手順であって、それぞれのセレクタベクトルは、対応するカウンタベクトルとペアをなしており、前記カウンタベクトルは、その長さが、前記対応するセレクタベクトル内の１のビットの数と等しい、手順と、
を有しているコンピュータプログラムプロダクト。
【請求項１４】
前記Ｃ0トライの任意のレベルｌのサブトライＡと、そのレベルｌの先行するサブトライＢについて、前記Ａのすべてのレベルｌ−１のサブトライの深さは、前記Ａ及びＢの深さを上回っており、
前記Ｃ0トライ内の値又はストリングは、前記サブトライの前記リーフ内に空のノードを含まないことにより、最短となり得るプリフィックスによって弁別される請求項１３記載のコンピュータプログラムプロダクト。
【請求項１５】
Ｃ0トライサーチプロセスを実現するコンピュータプログラム命令を具体化するコンピュータプログラムプロダクトにおいて、
前記プログラム命令は、
最上位サーチレベルの下の次のレベル内のそれぞれのサブトライごとに、前記最上位−１サーチレベルのサブトライの深さをサーチする手順と、
前記最上位−１サーチレベルのセレクタベクトルによって選択された深さ値をチェックする手順と、
前記値が、前記現在の最上位−１サーチレベルのサブトライの一部であると識別されない場合に、サーチ対象の残りの最上位−１レベルのサブトライが存在しているかどうかを判定する手順と、
サーチ対象の残りの最上位−１レベルのサブトライが存在していない場合には、本プロセスを終了し、サーチ対象の更なる最上位−１レベルのサブトライが存在している場合には、前記残りの最上位−１レベルのサブトライのサーチを継続する手順と、
前記サーチ対象の値を含んでいる最上位−１サーチレベルのサブトライが識別された場合に、前記現在の最上位−１サーチレベルを前記最上位サーチレベルとし、前記識別された最上位−１サーチレベルのサブトライを、識別された最上位サーチレベルのサブトライとすることにより、本プロセスを１レベル降下させる手順と、
新しい最上位サーチレベルがリーフセレクタレベルであるかどうかを判定し、そうではない場合に、前記識別された最上位サーチレベルのサブトライの前記最上位−１サーチレベルのサブトライのサーチを継続する手順と、
を有しているコンピュータプログラムプロダクト。
【請求項１６】
Ｃ0トライ削除プロセスを実現するコンピュータプログラム命令を具体化するコンピュータプログラムプロダクトにおいて、
前記プログラム命令は、
削除対象の語彙的識別子のリストを受けとる手順と、
前記削除対象の語彙的識別子の数が閾値を上回っている場合に、前記Ｃ0トライ内の残りの語彙的識別子を使用して新しいＣ0トライを生成する手順と、
前記削除対象の語彙的識別子の数が前記閾値を上回っていない場合に、
前記Ｃ0トライ内に２つのレベルのみが存在している場合に、前記語彙的識別子を含むリーフを削除し、
前記Ｃ0トライが２つを上回る数のレベルを具備している場合に、削除対象の語彙的識別子を含む前記Ｃ0トライのブランチを縦断する段階と、前記Ｃ0トライの前記ブランチから前記語彙的識別子を削除する手順と、
前記残りのＣ0トライが２つを上回る数のレベルを具備している場合に、前記Ｃ0トライをチェックし、前記Ｃ0トライのサブトライをマージする手順と、
を実行する手順と、
を有するコンピュータプログラムプロダクト。
【請求項１７】
Ｃ0トライ挿入プロセスを実装するコンピュータプログラム命令を実現するコンピュータプログラムプロダクトにおいて、
前記プログラム命令は、
挿入対象の値を受領する手順と、
前記Ｃ0トライが２つのレベルを具備している場合に、挿入対象の値が存在している限り、値が属している前記Ｃ0トライの既存のリーフ内のキーインターバルを識別し、前記識別されたキーインタバール内に１つ又は複数の値を挿入する手順と、
前記Ｃ0トライのサブトライが、前記サブトライの深さ以下の深さを具備する新しい値を含んでいる場合に、前記サブトライを分割する手順と、
を有するコンピュータプログラムプロダクト。
【請求項１８】
前記命令は、
前記Ｃ0トライが、２つを上回る数のレベルを具備している場合に、
挿入する値が存在している限り、
現在のレベルの直下の選択されたレベルがリーフレベルの上のレベルでない限り、前記現在のレベルの直下のどのレベルが、キーインターバルが値を含んでいる前記Ｃ0トライのサブトライを含んでいるかを反復的に判定し、前記判定されたサブトライを選択する手順と、
値が属している前記Ｃ0トライの既存のリーフ内のキーインターバルを識別する手順と、
前記識別されたキーインターバル内に１つ又は複数の値を挿入する手順と、
前記サブトライが、前記サブトライの深さ以下の深さを具備する新しい値を含んでいる場合に、前記サブトライを分割する手順と、
を反復的に実行する段階を更に有する請求項１７記載のコンピュータプログラムプロダクト。
【請求項１９】
コンパクト０コンプリートバイナリツリーを実現するデータ処理システムにおいて、
０コンプリートバイナリツリーのリーフの深さのエンコードされた深さ値を具備する深さベクトルを提供する手段であって、前記深さベクトルは、前記対応するリーフが空のリーフノードであるかどうかを示すべくエンコードされており、任意の長さを有している、手段と、
複合ベクトルとしてグループ化されたセレクタベクトルの組を提供する手段であって、それぞれのセレクタベクトルは、前記コンパクト０コンプリートバイナリツリーの１つのレベルに対応しており、それぞれのベクトルは、前記深さベクトルのエントリーを選択するべく使用されるベクトルであり、前記セレクタベクトルの組内の前記セレクタベクトルの数は任意である、手段と、
複合ベクトルとしてグループ化されたカウンタベクトルの組を提供する手段であって、それぞれのセレクタベクトルは、対応するカウンタベクトルとペアをなしており、前記カウンタベクトルは、その長さが、前記対応するセレクタベクトル内の１のビットの数に等しいベクトルである、手段と、
を有するデータ処理システム。
【請求項２０】
前記Ｃ0トライの任意のレベルｌのサブトライＡと、前記レベルｌのサブトライＡのレベルｌの先行するサブトライＢについて、前記Ａのすべての前記レベルｌ−１のサブトライの深さは、前記Ａ及びＢの深さを上回っており、
前記Ｃ0トライ内の値又はストリングは、前記サブトライの前記リーフ内に空のノードを含まないことにより、最短の可能なプリフィックスによって弁別される請求項１９記載のデータ処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータデータ及びファイルの格納システムに関し、更に詳しくは、０コンプリートバイナリツリーのコンパクト表現を実現する構造に対して、サーチキーの挿入及び削除を行う方法及びシステムに関するものである。
【背景技術】
【０００２】
データベースなどのデータ及びファイルの格納システム、特に、コンピュータシステム内に実現されているものは、そのデータベース内に格納されている情報の特定の項目の格納及び検索を提供するものである。通常、データベース内に格納されている情報にはインデックスが付与され、データベース内の情報の特定の項目をサーチキーを使用して検出できるようになっている。そして、通常、サーチキーを使用してインデックスをサーチし、その情報が存在する最も確率が高いデータベース内の場所に対するポインタを検出することにより、サーチが行なわれる。しかも、その格納場所がコンピュータシステムのメモリ内であるか、或いは、コンピュータシステムの格納媒体内であるかを問わない。
【０００３】
しばしば、コンピュータ内のデータベースレコードに対するインデックスは、１つ又は複数のノードから構成された「トライ（ｔｒｉｅ）」として構築され、ノードは、階層構造で接続され、コンピュータの記憶手段内に格納されている。トライは、ストリングを格納するべく設計されたツリー構造であり、共通プリフィックスごとに、１つのノードが存在している。実際のストリングは、リーフノード内のこの階層構造の「底部」に格納されている。それぞれのノードは、通常、サーチを導く情報を含む１つ又は複数のブランチフィールドを有し、このそれぞれのブランチフィールドは、通常、別のノードに対するポインタ、又はブランチと、そのノードからそのブランチに沿って検出可能な情報のレンジ又はタイプを示す関連ブランチキーと、を含んでいる。このトライ、並びにこのトライのサーチは、ルートノードと呼ばれる単一のノードから始まり、情報の項目、又は通常は、情報の項目に対するポインタを含むノードに到達するまで、様々なブランチノードを経由し、下方に進むことになる。この情報に関連しているノードは、しばしば、リーフノードと呼ばれている（或いは、このレベルが、サーチに成功又は失敗するレベルであることから、これは、失敗ノードとも呼ばれている）。そして、コンピュータのツリー格納構造内においては、トライ内のあらゆるノードは、そのノードに対して従属しているすべてのノードとの関連においては、親ノードであり、その親ノードに従属しているトライ内のサブ構造は、そのノードとの関連において、しばしば、サブトライと呼ばれている。
【０００４】
サーチの際に、ツリー格納構造内をどの方向、又はブランチに進むかに関する決定は、そのサーチにおいて遭遇するそれぞれのノード内のブランチキーとサーチキーを比較することにより、下される。所与のノードから降下しているブランチに対する比較の結果は、サーチの次の段階に継続している必要がある。この観点において、サーチキーは、最も一般的には、そのコンピュータシステム内においてサーチする対象の情報の１つ又は複数の項目に関連付けられた文字又は数字のストリングから構成されている。
【０００５】
従来技術には、コンピュータのデータベースシステム用の様々なサーチツリーデータ格納構造が存在しており、この１つが「Ｂツリー」であって、これは、これ以降に開発されたすべてのツリー構造の明白な先祖であり、当技術分野において周知のサーチツリーの最も一般的な形態である。例えば、Ｋｎｕｔｈによる「Ｔｈｅ  Ａｒｔ  ｏｆ  Ｃｏｍｐｕｔｅｒ  Ｐｒｏｇｒａｍｍｉｎｇ」（第３巻、４７３〜４７９頁）を参照されたい。Ｂツリーの場合には、データセットに対して、プライマリアクセスと、次いで、セカンダリアクセスを提供している。このため、これらのツリーは、しばしば、データベース及びファイルシステムが利用するデータ格納構造内において使用されてきた。しかしながら、このデータベースシステム内におけるＢツリー格納構造の利用に関しては、問題点が存在している。即ち、すべてのインデックス付けされた属性値をインデックス自体の内部において複製しなければならないという点である。多くのセカンダリインデックス値を複製すれば、この影響が累積された結果、生成されるインデックスのサイズが、しばしば、データベース自体のサイズを上回ることになる。そして、このオーバーヘッドのために、データベース設計者は、潜在的に有用なアクセス経路を排除することを余儀なくされる。又、Ｂツリーのブロック内にサーチキー値を包含することにより、ブロックのファンアウトが大幅に減少すると共に、ツリーの深さと検索時間が増大することにもなる。
【０００６】
そして、コンピュータデータベースシステム内において実現可能な他のツリー構造が、コンパクト・０コンプリート・バイナリツリー（即ち、Ｏツリー）であり、この場合には、小さなサロゲートによってサーチキー値を置換することにより、インデックスからサーチ値が除去されている（このサロゲートの代表的な長さである８ビットは、大部分の実際的なキー長（即ち、３２バイト未満）にとって、十分なものであろう）。このため、実際の値は、任意のオーダーで任意の場所に格納可能であり、ツリー構造に対するインデックスは、単に、インデックスブロック内に格納された（サロゲート、ポインタ）対の階層的なコレクションになっている。このような編成によれば、インデックスのサイズを５０％〜８０％削減することが可能であり、ツリーの分枝数が増大することになる。この結果、コンピュータデータベースシステム内における正確な１つのマッチクエリ当たりのシステム内のディスクアクセス数が減少する。Ｏｒｌａｎｄｉｃ及びＰｆａｌｔｚによる「Ｃｏｍｐａｃｔ  ０−Ｃｏｍｐｌｅｔｅ  Ｔｒｅｅｓ」（Ｐｒｏｃｅｅｄｉｎｇ  ｏｆ  ｔｈｅ  １４ｔｈ  ＶＬＤＢ  Ｃｏｎｆｅｒｅｎｃｅ、３７２〜３８１頁）を参照されたい。
【０００７】
但し、Ｃ0ツリーを生成する既存の方法によれば、ストレージの利用率は、Ｂツリーと比べて、５０％〜８０％増大するが、ダミーエントリー（サロゲート、ポイント＝＝ＮＩＬ）の存在のために、格納空間の浪費が依然として存在しており、ツリーの最下位レベルにおけるインデックスエントリーの数が、格納されているレコードの実際の数を上回っている。従って、最下位ツリーレベルにおけるＣ0ツリーのインデックスエントリーの予想ストレージ利用率は、Ｂツリーの場合の０．６９３に比べて、０．５６７となっている。Ｏｒｌａｎｄｉｃ及びＰｆａｌｔｚによる「Ｃｏｍｐａｃｔ０−Ｃｏｍｐｌｅｔｅ  Ｔｒｅｅｓ」（Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  １４ｔｈ  ＶＬＤＢ  Ｃｏｎｆｅｒｅｎｃｅ、３７２〜３８１頁）を参照されたい。
【０００８】
又、ＢツリーとＯツリーの格納構造は、値をサーチする効率的な方法を代表するものではあるが、いずれの方法の場合にも、ツリーデータ格納構造自体の初期生成と、これに継続する維持保守作業が必要である。これらのコンピュータ格納構造のいずれもが、本質的にソートされたオーダーで情報を格納してはいないからである。
【発明の開示】
【発明が解決しようとする課題】
【０００９】
最初に、キーレコードが、ランダムなオーダーではなく、そのキーフィールドのオーダーでソートされておれば、トライを効率的に構築することができる。従って、効率的なコンピュータデータベースシステムの場合には、まず、キーの組をソートした後に、それらのソート済みのキーからインターバルをおいて抽出されたキーに基づいて、トライを構築する必要がある。又、トライに過剰の数のキー、即ち、もはやデータベース内に存在しなくなったデータと関連するキーや、トライの構造を維持するためにもはや不要となったキーが含まれていなければ、ツリーデータ格納構造のサーチが効率的に実行されることになる。又、Ｏツリー格納構造のいくつかの実現においては、サーチキーを格納及びインデックス付けする方法が複雑であり、キーの集りを挿入及び削除する方法が非効率的なものになっている。従って、トライの構造を単純化するというニーズが存在しており、キーの集りを容易に一括削除及び挿入することが、特に、キーの大きな集りが関係している場合に、望ましい。
【課題を解決するための手段】
【００１０】
Ｏツリーを使用するデータベースインデックスの格納、挿入、削除、及びサーチを実行する方法及び装置が提供される。このＯツリーは、コンピュータメモリ内において、レイヤ化されたベクトルの組として表現されており、このベクトルのレイヤ化は、Ｏツリーの深さに対応している。尚、このＯツリーの表現を「Ｃ0トライ（Ｃ0−ｔｒｉｅ）」と呼ぶことにする。挿入及び削除プロセスにより、このＣ0トライは、それぞれの処理の終了時点において、適格であって（ｗｅｌｌ−ｆｏｒｍｅｄ）、且つ、整然とした（ｔａｕｔ）状態に維持されおり、この結果、コンピュータメモリ内におけるＣ0トライの後続の処理が効率的なものになっている。
【００１１】
本発明の一態様においては、Ｃ0トライは、Ｏツリーのリーフの深さのエンコードされた深さ値を具備する深さベクトルを含んでいる。この深さベクトルは、対応するリーフが空のリーフノードであるかどうかを示すべくエンコードされており、任意の長さを有している。複合ベクトルとしてグループ化されたセレクタベクトルの組が、このＣ0トライのレベルに対応している。それぞれのセレクタベクトルは、深さベクトルのエントリーを選択するために使用されるベクトルである。そして、深さベクトルの長さと同様に、このセレクタベクトルの組内のセレクタベクトルの数は任意である。それぞれのセレクタベクトルは、複合ベクトルとしてグループ化されているカウンタベクトルの組内の１つのカウンタベクトルとペアになっている。そして、カウンタベクトルは、その長さが、対応するセレクタベクトル内の１のビットの数に等しいベクトルである。
【００１２】
Ｃ0トライ内の値は、そのツリー内のそれぞれの位置によって参照可能である。この位置識別子は、ビットベクトルとして効率的にエンコード可能な値のサロゲートである。Ｃ0トライは、値を語彙的オーダーで編成しているため、この位置識別子は、語彙的識別子である。
【００１３】
本発明の別の態様においては、Ｃ0トライの任意のレベルｌのサブトライＡと、レベルｌの先行するサブトライＢについて、Ａのすべてのレベルｌ−１のサブトライの深さは、Ａ及びＢの深さを上回っており（これを、適格な（ｗｅｌｌ−ｆｏｒｍｅｄ）状態と表現する）、このＣ0トライ内の値又はストリングは、サブトライのリーフ内に不要な空のノードを含まないことにより、最短の可能なプリフィックスによって弁別することができる（これを、整然とした（ｔａｕｔ）状態と表現する）。
【００１４】
本発明の別の態様においては、コンピュータ利用Ｃ0トライのためのサーチ方法が提供される。このサーチ方法は、最上位サーチレベルの下の次のレベルにおけるそれぞれのサブトライごとに、最上位−１サーチレベルのサブトライの深さをサーチする段階を含んでいる。そして、最上位−１サーチレベルのセレクタベクトルによって選択された深さ値をチェックし、その値が、現在の最上位−１サーチレベルのサブトライの一部であると識別されない場合には、サーチプロセスは、サーチ対象の残りの最上位−１レベルのサブトライが存在しているかどうかを判定する。そして、サーチ対象の残りの最上位−１レベルのサブトライが存在しない場合には、本サーチプロセスは終了する。一方、サーチ対象の他の最上位−１レベルのサブトライが存在している場合には、サーチプロセスは、それらの残りの最上位−１レベルのサブトライのサーチを継続する。サーチプロセスが、サーチ対象の値を含む最上位−１サーチレベルのサブトライを識別した場合には、サーチプロセスは、現在の最上位−１サーチレベルを最上位サーチレベルとし、識別された最上位−１サーチレベルのサブトライを、識別された最上位サーチレベルのサブトライとすることにより、１レベルだけ降下する。最終的に、サーチプロセスは、新しい最上位サーチレベルがリーフセレクタレベルであるかどうかを判定し、そうではない場合に、識別された最上位サーチレベルのサブトライの最上位−１サーチレベルのサブトライのサーチを継続する。
【００１５】
本発明の別の態様においては、コンピュータ利用Ｃ0トライのための削除プロセスが提供される。この削除プロセスは、削除対象の語彙的識別子又はトークンのリストを受けとる。そして、削除対象の語彙的識別子の数が閾値を上回っている場合には、削除プロセスは、Ｃ0トライ内に残っている語彙的識別子を使用して新しいＣ0トライを生成する。一方、削除対象の語彙的識別子の数が閾値を上回っていない場合には、削除プロセスは、それらの語彙的識別子を含むＣ0トライ内のリーフを削除する。或いは、この代わりに、削除プロセスは、削除対象の語彙的識別子を含むＣ0トライのブランチを縦断し、このＣ0トライのブランチから語彙的識別子を削除する。そして、残りのＣ0トライが２つを上回る数のレベルを具備している場合には、削除プロセスは、Ｃ0トライをチェックし、そのＣ0トライのサブトライをマージする。
【００１６】
本発明の別の態様においては、コンピュータ利用Ｃ0トライのための挿入方法は、挿入対象の値を受けとる段階と、Ｃ0トライが２つのレベルを具備しているかどうかを判定する段階と、を含んでいる。そして、これらが真である場合には、挿入対象の値が存在している限り、挿入プロセスは、値が属しているＣ0トライの既存のリーフ内のキーインターバルを識別し、この識別されたキーインターバル内に１つ又は複数の値を挿入する。そして、挿入プロセスによる値の挿入が完了すると、挿入プロセスは、Ｃ0トライのサブトライが、サブトライの深さ以下の深さを具備する新しい値を含んでいる場合に、そのサブトライを分割する。
【００１７】
本発明の別の態様においては、挿入方法は、２つを上回る数のレベルを具備するＣ0トライを処理する能力を更に含んでいる。挿入対象の値が存在する限り、挿入プロセスは、以下に説明する段階を反復して実行することにより、Ｃ0トライのブランチを縦断する。即ち、現在のレベルの直下の選択されたレベルが、リーフレベルの上のレベルでない限り、挿入プロセスは、現在のレベルの直下のどのレベルが、そのキーインターバルが値を含んでいるＣ0トライのサブトライを含んでいるかを再帰的に判定し、判定されたサブトライとして選択する。そして、挿入プロセスによるＣ0トライのブランチの縦断が完了したら、挿入プロセスは、値が属している既存のリーフ内のキーインターバルを識別し、その識別されたキーインターバル内に１つ又は複数の値を挿入する。次いで、挿入プロセスは、サブトライが、サブツリーの深さ以下の深さを具備する新しい値を含んでいる場合に、そのサブトライを分割する。そして、すべての値の挿入が完了した後に、挿入プロセスは、更なる分割のためにＣ0トライをチェックする。
【発明を実施するための最良の形態】
【００１８】
本発明のこれら及びその他の特徴、態様、及び利点については、以下の説明、添付の請求項、及び添付の図面を参照することにより、更に理解することができよう。
【００１９】
図１ａは、データ処理システムを示しており、このデータ処理システムは、プログラム可能なコンピュータと、本発明の代表的な実施形態によって、ファイルシステムを生成し、このファイルシステム上における動作を処理するコンピュータプログラムと、を具備する。このコンピュータシステムは、プログラム可能なコンピュータ１を含んでおり、このコンピュータは、プロセッサとメモリ、ディスプレイ２、コンピュータ入力装置３、及びストレージ手段を具備している。ストレージ手段には、データ格納のためのコンピュータの磁気ディスクストレージシステムやメモリのパーティションなどのストレージ装置４が含まれている。そして、ファイルシステムを含むハードウェア／ソフトウェアと、説明対象の処理動作を実行するべくプロセッサによって実行可能なプログラム命令を含むハードウェア／ソフトウェアが、コンピュータ１の（破線よって示された）ファイルシステム５内に実現されている。このコンピュータ１のファイルシステム５は、ファイルシステム内におけるデータの表現と、ストレージ装置４内に格納されている１つ又は複数のデータファイルに対する処理の実行と、に関係する様々な活動を調整している。尚、コンピュータ１は、パーソナル、ミニ、又はメインフレームコンピュータなどのプログラム可能な汎用コンピュータであるか、或いは、１つ又は複数の集積チップによって形成された専用のコンピュータであってよい。
【００２０】
図１ｂを参照すれば、ファイルシステム５は、ファイル処理ユニット７と命令インタープリタ６を含んでいる。そして、このファイル処理ユニット７においては、コンピュータファイルシステム内に格納されている情報の特定の項目にアクセスする際に、ストレージ装置４内に格納されているデータの項目の検索に必要な情報の量を極小化するべく、図４ａに示されているコンパクト０コンプリートデータ格納構造４０を使用している。このデータ格納構造は、サーチキー１４２０にインデックス付けするための複数のエントリー３０、３１、８０、８１、８２、８３、８４、８５、８６、８７、８８（このそれぞれのエントリーは、深さ値８９とデータ存在インジケータ９０を有し、後者は、一例として、２つの条件を具備している）と、これらのエントリーを相互接続すると共にこのデータ格納構造４０を形成しているコンピュータのストレージ装置４内に格納された新しいＣ0トライ構造４３と、を具備している。又、このデータ格納構造４０は、サーチキーインターバルレンジと関連付けられた非ＮＩＬのリーフエントリーのカウントを格納する手段６６を更に含んでいる。又、ヘッダ３６とエントリー３６ａから構成された別個のポインタ構造も存在しており、これは、トライ構造４３とは別個であって、典型的な実施形態においては、データ格納構造４０自体と別個であってよい。このポインタ構造３６及び３６ａは、ストレージ装置４の格納コンテナ３９内のデータ項目に対してアクセスするものである。
【００２１】
図２ａを参照すれば、バイナリツリー１４０２は、辺（エッジ）にラベルが付加された説明用のツリーデータ格納構造であり、これは、１４１２及び１４１４などの弧又は辺によって分離された１４０６、１４０８、及び１４１０などの点によって表現されたノードから構成されている。そして、これらのノードは、小文字と大文字（ａ〜Ｚ及びＡ’）によって識別されており、終端ノードは、リーフノード又はリーフと呼ばれ、大文字のラベルが付加されており、すべてのその他の内部ノードには、小文字のラベルが付加されている。検索対象の情報は、リーフ１４１６及び１４１８などのツリーのリーフに配置されたポインタによってポイントされている格納場所に格納されている。リーフＨ、Ｉ、Ｖ、Ｗ、Ｚ、Ａ’、及びＱには、サーチキー１４２０が示されている。この図２ａにおいては、このサーチキー１４２０は、２値の数字のストリングであり、これは、最大ビット長までの任意の均一な長さを有し、この場合には、一例として、８ビットの最大ビット長が使用されている。これらのリーフのそれぞれに関連付けられているこのサーチキー１４２０を使用することにより、ストレージ装置４内のその対応するリーフ用の格納場所に対するポインタを検出する。なお、関連するサーチキー１４２０によって示されているリーフのみが、この関連するデータレコードを格納する格納場所に対するポインタを具備しており、このため、これらは、フル状態にあると表現される。これに対して、リーフＧ、Ｋ、Ｏ、Ｓ、Ｔ、及びＹは、格納場所に対するポインタを具備しておらず、従って、これらは、空き状態にあると表現される。
【００２２】
ストレージ装置４内におけるデータレコードの検索は、サーチキー１４２０の１つの中の２値の０及び１シンボルと、それぞれの弧１４１２上の０又は１のエッジラベルとを連続的に比較することにより、行なわれる。ここで、それぞれの弧１４１２は、ルートノードから始まって所望のリーフにおいて終了する接続された点及び弧の経路に沿ったノード間に存在する。バイナリツリーのそれぞれのノード又はリーフは、その進入側の弧に０のラベルが付加されている場合には、０のノード又は０のリーフかであり、その進入側の弧に１のラベルが付加されている場合には、１のノード又は１のリーフである。コンピュータデータベース及びファイル管理システム内においては、ノードに対するアクセス経路は、ルートノードからその対象の特定のノードに至るまでに経由する０及び１の線分ラベルを結合することによって得られる２値のストリングである。
【００２３】
そして、バイナリツリー構造は、すべてのノードが、リーフであるか、或いは、正確に２つの空ではない直接的な子孫を具備するノード（即ち、従属する０のノードと従属する１のノードを具備するノード）である場合に、「コンプリート」であると表現される。図２ａにおいては、ノードａ〜ノードＡ’のそれぞれのノードは、このコンプリート性に関する２つの条件を満足している。
【００２４】
従って、図２ａは、それぞれ、リーフＨ、Ｉ、Ｖ、Ｗ、Ｌ、Ｚ、Ａ’、及びＱにおけるデータレコードを検出するための００００１０００、００１００１０１、０１００００１０、０１０００１１０、１０００００１、１０１０１０００、１０１０１０１０、及び１０１１００１０を含むサーチキー１４２０を有するツリー格納構造を示している。空のリーフＧ、Ｋ、Ｏ、Ｔ、Ｓ、及びＹは、「コンプリート」なバイナリツリーの条件を満たすために、ツリー１４０２内に含まれている。
【００２５】
次に図２ｂを参照されたい。この図には、以下に特記する事項を除いて、図２ａに使用されている同一の構造、用語、及び参照符号を具備する従来技術による０コンプリートバイナリツリー１４３０が示されている。このδ個のリーフを有するバイナリツリー１４３０は、（１）０のリーフの兄弟がツリー内に存在し、且つ、（２）ツリー内に、正確に、δ−１個の１のノードが存在する場合に、０コンプリートであると表現される。従って、この図２ｂは、すべての０のリーフＨ、Ｖ、Ｌ、Ｔ、Ｚが、兄弟の１のノードを具備しており、９つのリーフＨ、Ｉ、Ｖ、Ｗ、Ｌ、Ｔ、Ｚ、Ａ’及びＱと、８つの１のノードＩ、Ｗ、ｅ、ｃ、ｍ、Ａ’、Ｕ、及びＱが存在しているため、図２ａのバイナリツリーの０コンプリートなバイナリツリー表現になっている。この０コンプリートバイナリツリー１４３０は、リーフＧ、Ｋ、Ｏ、Ｓ、及びＹなどの（関連するサーチキーが欠落していることによって示されている）空の１のリーフをツリー１４０２から削除することにより、図２ａのバイナリツリー１４０２から導出されたものである。尚、すべての空の０のリーフを削除すると、ツリー１４３０内に８つの１のノードを必要とするという第２の条件に違反することになるため、このツリー格納構造１４３０内には、ノードＴが、空であるにも拘らず、残っており、この結果、必要な格納空間が増大していることに留意されたい。
【００２６】
小文字によって表されているそれぞれの内部ノードは、対応する０のサブツリーと１のサブツリーを具備している。０コンプリートバイナリツリーの「プリオーダーによる縦断」は、ツリーのルートノードａから始まり、最後のノードに対するアクセスが完了するまで、（１）現在のノードｎｎiが内部ノードである場合には、０コンプリート性の定義により、すべての内部ノードは、０の子ノードを具備しなければならないため、オーダーにおける次のノードｎｎｉ＋１は、その０の子になり、（２）現在のノードｎｎiがリーフである場合には、プリオーダーにおける次のノードは、その０のサブトライがｎｎiを含み、且つ、その深さが最大であるノードｐｐの１の子になる、という２つの段階を反復することになる。
【００２７】
即ち、プリオーダーにおける第１ノードは、内部ルートノードａである。次のノードは、その０の子ノードｂであり、これには、０の子ノードｄと、次いで、リーフＨが続く。そして、プリオーダーにおける次のノードは、Ｈがリーフノードであり、ノードｄの０のサブトライがＨを含み、且つ、ツリー内におけるその深さが最大であるため（即ち、その０のサブトライがＨを含んでおり、且つ、その深さが１であるノードｂとは異なり、この深さは、２である）、ノードｄの１の子になる。この結果、この図２ｂに示されているツリー１４３０のコンプリートなプリオーダーの縦断シーケンスは、ａｂｄＨＩｅｊｎｒＶＷｃｆＬｍｐＴｕｘＺＡ’Ｑというものになる。
【００２８】
又、０コンプリートバイナリツリーのプリオーダー縦断における最後のリーフノードＱを除くそれぞれのリーフノードＨ、Ｉ、Ｖ、Ｗ、Ｌ、Ｔ、Ｚ、Ａ’の後継ノードも、特別な重要性を有している。即ち、これらのノード（これらは、バウンドノードと呼ぶ）は、それぞれ、図２ｂのＩ、ｅ、Ｗ、ｃ、ｍ、ｕ、Ａ’、Ｑである。バウンドノードは、プリオーダー縦断の観点で定義されているため、それぞれのノード（最後のものＱを除く）は、その独自の固有のバウンドノードを具備している。又、プリオーダー縦断の前述の定義から、すべてのバウンドノードは、１のノードである。
【００２９】
ノードとバウンドノードの「弁別子」を使用することにより、０コンプリートバイナリツリー内のそれぞれのリーフに対応するキーインターバルを確立可能である。リーフノードの「弁別子」は、サーチキーと同一の長さの２値ストリングであり、その上位（即ち、左側の）ビットは、リーフまで至る連結された弧、すなわち経路の２値ビットであり、その他の右側のビットは、すべて０に設定されている。
【００３０】
「キーインターバル」は、正式には、リーフ弁別子（これを含む）とそのバウンドノードの弁別子（これを含まない）間のキーレンジと定義されるものである。例外は、この場合にも、プリオーダー縦断における最後のリーフ（一例として、Ｑ）であり、このキーインターバルの上位バウンドは、常に事前に判明しており、すべて１のビットから構成されている（即ち、１１１１１１１１である）。
【００３１】
次の表１には、０コンプリートバイナリツリー１４３０のそれぞれのリーフノードＨ、Ｉ、Ｖ、Ｗ、Ｌ、Ｔ、Ｚ、Ａ’、Ｑのキーインターバルが、辞書的なオーダーにおいて一覧表示されている。即ち、例えば、リーフＶは、０１００００００という弁別子を具備しており、その対応するバウンドノードＷは、弁別子０１０００１００を具備していることから、表１に示されているように、このリーフＶのキーインターバルは、０１００００００（これを含む）〜０１０００１００（これを含まない）であり、即ち、両方を含む場合には、０１００００００〜０１００００１１となる。
【００３２】
【表１】
2006521623.tif 000003
【００３３】
この表１を検討することにより、任意のリーフの適切なキーインターバル（従って、所与のサーチキーを有する対応するデータレコード）を識別するためのバウンドノード弁別子に関する知識を十分なものにすることができる。一例として、サーチキー０１００００１０を使用すれば、プリオーダー縦断シーケンスにおいてツリーのバウンド弁別子を調べるサーチ手順により、このサーチキー０１００００１０を上回る最初のバウンド弁別子が検出された際に、このサーチキーの正しいキーインターバルが検出されることになる。即ち、第１バウンドノードＩの弁別子００１０００００は、サーチキー０１００００１０よりも小さい。そして、このプリオーダーにおける第２のバウンドノードｅのバウンディング弁別子０１００００００も、このサーチキーより小さい。しかしながら、第３のバウンドノードＷの弁別子０１０００１００は、サーチキーよりも大きくなっている。そして、これは、リーフＶのキーインターバルの非包含の上位バウンドであり、このリーフＶのキーインターバルの包含の下位バウンドは、以前のバウンドノードｅの弁別子になっている。
【００３４】
この表１には、それぞれのキーインターバルと共に、そのキーインターバルの０コンプリートバイナリツリー１４３０内におけるバウンドノードの「深さ」を表す数値が示されている。例えば、リーフＶのバウンドノードは、０コンプリートバイナリツリー内において６の深さを具備するリーフＷである。最後のノードＱの場合には、定義によってバウンドノードを具備しておらず、このインターバルの上位バウンドは、１１１１１１１１と設定されており、０の深さが割り当てられている。
【００３５】
バウンドノードの組の弁別子とそれらの深さの間の関係には、１つの明白な規則性を存在している。即ち、バウンドノードの深さがｄｄの場合には、弁別子の定義により、対応する弁別子のｄｄ番目のビットが、１に設定されており、後続のすべての下位ビットは０である。
【００３６】
キー長が８ビットである表１の場合には、初期ダミー弁別子は、００００００００であり、第１バウンドノードＩの深さは、３であって、第１バウンドノード弁別子の第３ビットは１であり、すべての後続の下位ビットは０であって、この結果、第１バウンドノード弁別子００１０００００が得られる。又、第２バウンドノードｅの場合には、深さが２であり、第１バウンドノード弁別子を使用することにより、第２ビットが１に設定され、すべての後続のビットが０に設定されることにより、第２のバウンドノード弁別子０１００００００を得ている。残りのバウンドノードの弁別子も、同様に構築されている。
【００３７】
０コンプリートバイナリツリーの場合には、バウンドノードの深さからキーインターバルを構築可能であるというこの知識を使用することにより、図３ａの９に、図２ｂの０コンプリートバイナリツリーデータ構造の従来技術によるコンパクトな形態が表されている。このコンパクトな形態をＯトライと呼ぶ。このトライ構造は、エントリー１７を有するブロック１０、１１、及び１２を具備している。
【００３８】
次に、図４ａを参照すれば、図２ａのサーチキー１４２０の組を入力した後のデータ格納構造４０の表現が示されている。更に大きな数のサーチキーをデータ格納構造４０内に入力することも可能であり、前述の実施形態を更に大きなキーの組に適用する方法については、当業者には明らかであろう。隣接する深さ値１７ａとポインタ１７ｂ（エントリー１７）を有するブロック１０、１１、及び１２を具備した図３ａのＣ0トライとは異なり、この図４ａのデータ格納構造は、インデックスブロックエントリー４７ｃ及びサブトライポインタ４７ｂにインデックス付けされたインデックスブロックヘッダ４７ａを有するルートノード４７と、インデックスブロックエントリー３４ｃ及びサブトライポインタ３４ｂにリンクされたインデックスブロックヘッダ３４ａを有するノード３４と、インデックスブロックエントリー３５ｃ及びサブトライポインタ３５ｂにリンクされたインデックスブロックヘッダ３５ａを有するノード３５と、から構成されたトライ構造４３を具備している。
【００３９】
参照符号４７ｃ、３４ｃ、及び３５ｃ内のそれぞれのエントリーは、深さ値８９とデータ存在インジケータ９０を含んでいる。又、この構造４０は、別個のポインタ構造を具備しており、これは、非ＮＩＬのリーフインデックスブロックエントリー３４ｃ及び３５ｃの対応する深さ値８９のポインタ又は参照可能インデックスからなる対応するエントリー３６ａを有するポインタヘッダ３６から構成されている。３４ｃ及び３５ｃ内の深さ値８９とポインタエントリー３６ａのインデックスは、０のリーフエントリーに対応する空のポインタを除いて、図３ａのインデックスブロック１１及び１２内の深さ値１７ａとポインタ１７ｂを表しており、この結果、格納空間の浪費を低減している。ノード４７のインデックスブロックエントリー４７ｃは、エントリー３０及び３１を含んでおり、これらは、それぞれ、３４ｃ及び３５ｃの対応するインデックスブロック内の最後の（すなわち、最小値）深さエントリーを付与する図３ａのインデックスブロック１０内のエントリーに対応している。ルートレベル４１のポインタ４７ｂは、インデックスブロックエントリー４７ｃのそれぞれに対応するキーインターバルのリーフレベル６４を指示している。
【００４０】
そして、対応する深さ値８９をインデックスブロックエントリー４７ｃ、３４ｃ、及び３５ｃとポインタエントリー３６ａに分離したことに加え、対応するエントリー６６ａを有するカウントヘッダ６６が関係付けられている。このエントリー６６ａは、それぞれ、インデックスブロックエントリー３４ｃ及び３５ｃ内のＦ又はフルリーフ（非ＮＩＬ）エントリーの合計数を付与するカウントエントリー３２及び３３を含んでいる。従って、カウントエントリー３２は、４の値を具備しており、インデックスブロックエントリー３４ｃ内に４つの非ＮＩＬの４つのエントリー（すなわち、Ｆ値）が存在していることを示しており、カウントエントリー３３も、４の値を具備しており、インデックスブロックエントリー３５ｃ内に４つの非ＮＩＬのエントリー（すなわち、Ｆ値）が存在していることを示している。この結果、このデータ格納構造４０は、新しいＯトライ構造４３、別個のポインタ構造３６及び３６ａ、並びに、格納コンテナ３９を具備している。そして、ノード３４、３５、及び４７と、カウントヘッダ６６、カウントエントリー６６ａが、トライ構造４３内に位置しており、参照可能インデックス又はポインタが、ヘッダ３６とエントリー３６ａから構成された別個のポインタ構造内に位置している。
【００４１】
この図４ａの例におけるトライ構造４３は、ルートレベル４１とリーフレベル６４という２の高さをもっている。そして、ルートレベル４１におけるインデックスブロックエントリー４７ｃは、２つのエントリー３０及び３１を含んでおり、リーフレベル６４におけるインデックスブロックエントリー構造３４ｃ及び３５ｃは、４つのエントリー８０、８１、８２、８３と５つのエントリー８４、８５、８６、８７、８８をそれぞれ含んでいる。Ｏトライ格納構造の高さ又はレベルの数は、データ項目及びトライ構造４３のリーフエントリー内においてインデックス付けされる関連するサーチキーの数と、ファイルシステム内において設定される既定のフルインデックスブロック数７９に応じて変化することになる。前述の図４ａの説明用の実施形態の場合には、既定のフルインデックスブロック数７９は５である。
【００４２】
深さ値８９は、トライ構造４３のそれぞれノード４７、３４、及び３５内においてインデックスブロックヘッダ４７ａ、３４ａ、及び３５ａによってリンクされたインデックスブロックエントリー４７ｃ、３４ｃ、３５ｃ内に配置されている。ポインタエントリー３６ａは、ポインタヘッダ３６により、トライ構造４３にリンクされている。そして、重要なことに、インデックスブロックエントリー４７ｃ、３４ｃ、及び３５ｃのそれぞれの内部には、データ存在インジケータビット９０も位置している。
【００４３】
このそれぞれのインジケータビット９０は、ＦＡＬＳＥとＴＲＵＥという２つの条件のいずれかを有しており、これらは、それぞれ、０及び１によって表されている。リーフレベル６４における深さ値８９内においては、ＴＲＵＥ、又は第１条件は、対応するエントリーが概念的０コンプリートバイナリツリーのＣ0トライのＮＩＬエントリー、又は空のノードであることを示している。一方、ＦＡＬＳＥ、又は第２条件は、対応するエントリーが、コンピュータのストレージ装置内の対応するデータ項目と関連付けられていることを示している。非ＮＩＬのエントリー８０〜８４及び８６〜８８のそれぞれは、ポインタエントリー３６ａの１つによって指定されたコンピュータのメモリ８の格納コンテナ３９内の対応するデータアイテムをもっている。一方、８５などのＮＩＬ又はＴＲＵＥエントリーは、３６ａ内のインデックスエントリー（又は、格納コンテナ３９内のデータアイテム）を指定してはいない。ポインタエントリー３６ａのそれぞれは、コンピュータのストレージ装置内に格納されている対応する語彙的に順序付けられたデータ項目に対する、又はこのデータ項目と関連付けられたサーチキー１４２０の１つに対するポインタ又は参照可能インデックスである。
【００４４】
図５は、本発明の代表的な実施形態によるＣ0トライを表現するのに使用されるデータ構造を示す図である。Ｃ0トライデータ構造５００は、（１）深さベクトル５０２、（２）セレクタベクトルの組５０８、及び（３）カウンタベクトルの組５１８という３つの部分をもつ。
【００４５】
深さベクトルは、実現されたＣ0トライのリーフの深さに対するエンコードされた深さ値（例：エンコードされた深さ値５０４）を含むベクトルであって、対応するリーフがダミーであるかどうかを示すべくエンコードされている。例えば、深さベクトルのｎ番目のエントリーは、ｎ番目のリーフのエンコードされた深さである。ｄがリーフの深さであるとすれば、エンコードされた深さは、そのリーフがダミーリーフでない場合には、２ｄであり、そのリーフがダミーリーフである場合には、２ｄ＋１である。この深さベクトルは、省略符号５０６によって示されているように、任意の長さを有している。
【００４６】
このＣ0トライデータ構造は、セレクタベクトルの複合ベクトル５０８（以下、セレクタ親と呼ぶ）を更に含んでいる。セレクタベクトル５１０などのそれぞれのセレクタベクトルは、Ｃ0トライの１つの「レベル」に対応している。それぞれのセレクタベクトルは、深さベクトルのエントリーを選択するべく使用されるベクトルであって、省略符号５１１に示されているように、任意の長さを有している。そして、セレクタ親内におけるセレクタベクトルの数も、省略符号５１６に示されているように、任意である。セレクタベクトル５１４などの最下位のセレクタベクトルを、以下、「リーフセレクタベクトル」と呼ぶ。そして、セレクタベクトル５１７などの最上位のセレクタベクトルを、以下、「最上位セレクタベクトル」と呼ぶことにする。尚、セレクタ親が任意の長さを有しているため、セレクタベクトルの数も任意であり、従って、任意の深さのＣ0トライを表現することが可能である。
【００４７】
又、このＣ0トライデーア構造は、カウンタベクトルの複合ベクトル５１８を更に含んでおり、以下、これをカウンタ親と呼ぶ。それぞれのセレクタベクトル（したがって、Ｃ0トライ内のそれぞれのレベル）は、カウンタベクトル５２０などの対応するカウンタベクトルと関連付けられている。セレクタベクトルの数が任意であるため、カウンタベクトルの数と、したがってカウンタ親の長さも、省略符号５１９によって示されているように、任意である。カウンタベクトルは、その長さが、対応するセレクタベクトル内の「１のビット」の数に等しいベクトルである。セレクタベクトルのサイズが任意であるため、省略符号５２１によって示されているように、カウンタベクトルのサイズも任意である。そして、エントリー５２２などのカウンタベクトルのｎ番目のエントリーは、そのセレクタベクトルによって表されているｎ番目のサブトライ内に含まれている空ではないリーフの数である。
【００４８】
このＣ0トライデータ構造内に維持されている特性には、２つのものが存在している。即ち、（１）任意のレベルｌのサブトライＡと、そのレベルｌの先行するサブトライＢについて、Ａのすべてのレベルｌ−１のサブトライの深さは、Ａ及びＢの深さを上回っている。換言すれば、ＡのサブトライがＣ0トライを形成している。このような特性を有するＣ0トライデータ構造を、以下、「適格性を有している（ｗｅｌｌ−ｆｏｒｍｅｄ）」と表現することにする。（２）インデックス内の値又はストリングが、最短の可能なプリフィックスによって弁別される必要がある。これは、インデックス内のそれぞれの値を有効なものにすることによって実現されるが、換言すれば、不要な空の値又は「ダミー」をなくす必要があるということである。このような特性を有するＣ0トライデータ構造を、以下、「整然性を有している（ｔａｕｔ）」と表現することにする。
【００４９】
図６は、本発明の代表的な実施形態によるＣ0トライの選択ベクトルの説明用の例を示す図である。セレクタベクトルのセレクタ親６５０は、表現されているＣ0トライのリーフのすべてを選択するレベル１のセレクタベクトル６０２を含んでおり、従って、これは、対応する深さベクトルと同一の長さであるが、すべてが「１のビット」から構成されたビットベクトルである。レベル２のセレクタベクトル６０４は、レベル１のサブトライの最後の要素に対応する位置に１のビットをもつことにより、リーフのレベル２のサブトライを選択する。それぞれのレベル内のサブトライは、そのレベル内におけるその位置によってインデックス付けされている。例えば、第２レベルのセレクタベクトル内に設定されているビット６０６は、レベル１のサブトライの組６０８を選択する。このビット用のインデックスは、このビットの下の参照符号６０９の「４」として示されている。レベル３のセレクタベクトル６１０は、同様に、レベル２のサブトライの中のサブトライを選択する。例えば、レベル３のセレクタベクトル内のビット６１２は、レベル２のサブトライ６１４を選択する。このレベルの積層配置は、省略符号６１６によって示されているように、任意のサイズのＣ0トライを表現するのに必要な数のレベルだけ反復可能である。この例の場合には、レベル３が最上位レベルである。
【００５０】
サブトライは、上位レベルのサブトライ内のそれぞれのインデックスによって選択可能である。例えば、レベル３のサブトライ６１４の第３サブトライ６１８は、インデックス「３」６２２に設定されているビット６２０によって選択されるレベル２のサブトライ６１８である。そして、このレベル２のサブトライ６１８は、それぞれ、インデックス「４」６２８とインデックス「５」６２２におけるレベル１のサブトライ（リーフ）６２４及び６２６を含んでいる。
【００５１】
前述のＣ0トライ用のサーチアルゴリズムにおいては、適格性を有すると共に整然性を有するＣ0トライの特性を利用している。適格性と整然性を有するサブトライの場合には、サブトライの深さは、その最後のエントリーの深さ、すなわちそのサブトライを表すレベル１のセレクタベクトル内の設定ビットに対応する深さである。
【００５２】
図８は、本発明の代表的な実施形態による値ストアデータ構造を示す図である。値ストア構造８００には、（１）格納対象の実際の値又はデータを含む格納ページ８０２のコレクション、（２）バイトオフセットベクトル８０６、及び（３）値識別子ベクトル８１０という３つの部分が含まれている。
【００５３】
格納ページ８０２には、格納対象の実際の値又はデータが含まれている。格納ページの数は、省略符号８０４によって示されているように、任意である。そして、格納ページには、バイトオフセットベクトル８０６によってインデックス付けされており、ｎ番目のオフセットは、格納ページの組内におけるｎ番目のストリングの始まりの位置（単位：バイト）である。このバイトオフセットベクトル内の値の数は、省略符号８０８によって示されているように、格納ページの組内に格納されている値の数と同一である。そして、値識別子ベクトル８１０は、語彙的識別子（ＬＩＤ）によって、バイトオフセットベクトルに対してインデックス付けするベクトルである。この値識別子ベクトル内の値の数は、省略符号８１２によって示されているように、バイトオフセットベクトル内の数と同一である。従って、ＬＩＤは、値の辞書的順序におけるインデックスであり、例えば、辞書的順序において５番目に位置するストリング値は、ＬＩＤ５に対応している。
【００５４】
図７は、本発明の代表的な実施形態によるＣ0トライサーチプロセスのプロセスフローチャートである。このプロセスは、Ｃ0トライの最上位レベルから始まる（７００）（以下、これを「最上位サーチレベル」と呼ぶ）。そして、この最上位サーチレベルの下の次のレベル内のそれぞれのサブトライごとに（７０２）（以下、これを「最上位−１サーチレベル」と呼ぶ）、本プロセスは、最上位−１サーチレベルのサブトライの深さをサーチする（７０４）。前述のように、このＣ0トライは、適格性を有しているため、チェックする必要があるのは、最上位−１サーチレベルのセレクタベクトルによって選択された深さ値のみである。そして、その値が、現在の最上位−１サーチレベルのサブトライの一部として識別されない場合には（７０６）、プロセスは、残りの最上位−１レベルのサブトライのサーチを継続する（７０８）。
【００５５】
一方、サーチ対象の値を含む最上位−１サーチレベルのサブトライが識別された場合には（７０６）、プロセスは、１レベル降下し、現在の最上位−１サーチレベルを最上位サーチレベルとし、識別された最上位−１サーチレベルのサブトライを、識別された最上位サーチレベルのサブトライとする（７１４）。そして、本プロセスは、その新しい最上位サーチレベルが、前述のリーフセレクタレベルであるかどうかを判定する（７１６）。そして、リーフセレクタレベルでない場合には、プロセスは、サーチを実行し（７１８）、その識別された最上位サーチレベルサブトライの最上位−１サーチレベルのサブトライをサーチすることになる。従って、サーチは、サーチレベルごとに１つのサブトライのみに限定されている。
【００５６】
図９は、本発明の代表的な実施形態による削除プロセスのプロセスフローチャートである。削除プロセスにおいては、Ｃ0トライから値を削除し、Ｃ0トライが適格性を有した状態に維持されるように、マージプロセスによって、そのＣ0トライを再構築する。まず、削除プロセスは、削除対象のＬＩＤのリストを受領する（９００）。そして、削除プロセスは、空きのストリングを削除するべきかどうかを判定する（９０２）。削除プロセスが、多数のＬＩＤを短いセグメントで削除する必要があると判定した場合には（９０４）、削除プロセスは、古いＣ0トライ内の残りの値を使用して新しいＣ0トライを再構築する（９０６）。尚、値を削除して残りの古いＣ0トライとマージせずに、新しいＣ0トライの生成を選択するための閾値は、それぞれのアプリケーションに固有のものであり、削除プロセスと挿入プロセスの相対的な速度によって左右されることになる。
【００５７】
一方、少数のＬＩＤ又はいくつかの大きなセグメントのみの削除を要する場合には、削除プロセスは、その処理対象のＣｏトライが、２つのレベルのみを具備しているかどうかを判定する（９０８）。そして、２つのレベルのみが存在している場合には、削除対象のＬＩＤを含むリーフを容易に削除可能である。一方、Ｃ0トライが２つを上回る数のレベルを具備している場合には、ブランチ削除プロセスを呼び出し、削除対象のＬＩＤを含むＣ0トライのブランチを縦断し、Ｃ0トライのそれらのブランチからＬＩＤを削除することになる（９１２）。
【００５８】
ＬＩＤのＣ0トライからの削除が完了したら、削除プロセスは、その残りのＣ0トライが、２つを上回る数の残りのレベルを具備しているかどうかを判定する（９１４）。そして、２つを上回る数のレベルを具備している場合には、削除プロセスは、Ｃ0トライ全体をチェックし、可能な場合には、サブトライをマージする（９１６）。そして、この値のＣ0トライからの削除と必要に応じたＣ0トライのマージが完了したら、実際の値を前述のデータストアから削除することになる（９１８）。
【００５９】
図１０は、本発明の代表的な実施形態によるＣ0トライマージ制御プロセスのプロセスフローチャートである。このマージ制御プロセスにおいては、まず、処理対象のＣ0トライから、多数のＬＩＤと多数の一連のＬＩＤが削除されているかどうかを判定する（１０００）。そして、これが真である場合には、マージ制御プロセスは、リーフレベルを除いて、既存のＣ0トライを破棄し、そのＣ0トライのレベルを再構築する（１００２）。
【００６０】
一方、マージ制御プロセスが、処理対象のＣ0トライからは、少数のＬＩＤ又は少数の一連のＬＩＤが削除されていると判定した場合には、マージ制御プロセスは、削除プロセスにおいて生成されたＣ0トライ内の重複したレベルを除去する（１００４）。次いで、マージ制御プロセスは、Ｃ0トライの最上位レベルから始めて、それぞれの変化したサブトライをターゲットレベルまで縦断して下る（１００６）。そして、ターゲットレベルに到達したら、マージ制御プロセスは、必要に応じて、サブトライをマージするマージプロセスを呼び出す（１００８）。次いで、マージ制御プロセスは、マージが、実際にマージプロセスによってターゲットレベル上において実行されたかどうかを判定する（１０１２）。そして、実際に実行されている場合には、マージ制御プロセスは、そのマージプロセスにおいて生成された重複したレベルを削除することになる（１０１４）。
【００６１】
図１１は、本発明の代表的な実施形態において使用されるＣ0トライマージプロセスのプロセスフローチャートである。このマージプロセスは、サブトライをターゲットレベルまで縦断した後に、ターゲットレベルにおいて、そのサブトライをマージするべく、前述のマージ制御プロセスによって呼び出されるものである。サブトライは、その先行する隣のＬＩＤが前述の削除プロセスにおいて削除されているＬＩＤを含んでいる場合に（従って、ＬＩＤが孤立している場合に）、マージ処理の候補となる（この孤立したＬＩＤを、以下、「残存」ＬＩＤと呼ぶことにする）。マージプロセスにおいては、サブトライ内における現在の作業レベルであるレベルｌと、マージプロセスがサブトライの縦断を中止して孤立したＬＩＤをマージ可能になるために前進を要するレベル（Ｌｅｖｅｌｓ−ｔｏ−ｇｏ）数のカウンタと、を引数として受領する。そして、マージプロセスは、そのサブトライのレベルｌ内の削除された一連のＬＩＤに後続するＬＩＤが存在しているかどうかを判定する（１１００）。そして、削除された一連のＬＩＤに後続する少なくとも１つのＬＩＤが存在している限り、マージプロセスは、この「Ｌｅｖｅｌｓ−ｔｏ−ｇｏ」変数をチェックすることにより、ターゲットレベルまでサブトライを縦断して下ったかどうかを判定する（１１０２）。そして、マージプロセスが更なる「Ｌｅｖｅｌｓ−ｔｏ−ｇｏ」を具備している場合には、マージプロセスは、孤立したＬＩＤを有する現在のレベルｌの下のレベル内のサブトライを判定した後に（１１０４）、「ｌｅｖｅｌｓ−ｔｏ−ｇｏ」カウンタをデクリメントし（１１０６）、その新しいレベル設定とデクリメントされた「Ｌｅｖｅｌｓ−ｔｏ−ｇｏ」カウンタにより、自分自身を再帰的に呼び出すことになる。そして、マージプロセスが、「ｌｅｖｅｌｓ−ｔｏ−ｇｏ」カウンタをチェックすることにより、ターゲットレベルに到達していると判定したら（１１０２）、マージプロセスは、可能な場合に、残存ＬＩＤを含むサブトライと、そのサブトライの先行サブトライをマージする（１１０８）。このマージプロセスは、すべての残存ＬＩＤの処理が完了するまで継続される（１１１０）。そして、ターゲットレベル上のすべてのサブトライの処理が完了したら、ターゲットレベルを１レベルだけ上昇させ、処理を継続する。
【００６２】
図１２は、本発明の代表的な実施形態によるブランチ削除プロセスのプロセスフローチャートである。このブランチ削除プロセスは、まず、ブランチ削除を呼び出した現在のレベルｌのサブトライ内に削除を要するＬＩＤが存在しているかどうかを判定する（１２００）。そして、削除対象のＬＩＤが存在している限り、ブランチ削除プロセスは、現在のレベルの直下のレベル内のどのサブトライがそのＬＩＤを含んでいるかを識別する（１２０２）。そして、ブランチ削除プロセスが、その識別されたサブトライを削除することが可能であると判定した場合に（１２０４）（例：識別されたサブトライに、単一のＬＩＤのみ、又はいくつかの一連の削除対象ＬＩＤが含まれている場合）、ブランチ削除プロセスは、そのサブトライ全体を削除し、サブトライを更に縦断することなしに、終了する。
【００６３】
一方、その識別されたサブトライを削除することができない場合には、ブランチ削除プロセスは、現在のレベルの下のレベルが、Ｃ0トライの前述のレベル２であるかどうかを判定する（１２０８）。そして、それがレベル２である場合には、ブランチ削除プロセスは、削除プロセスの要求どおりに、そのＣ0トライの一連のリーフを削除する。一方、レベル２でない場合には、ブランチ削除プロセスは、自分自身を再帰的に呼び出すことにより、現在のレベルの直下のレベル内のサブトライの処理を継続することになる（１２１２）。
【００６４】
図１３は、本発明の代表的な実施形態による挿入プロセスのプロセスフローチャートである。挿入プロセスが、Ｃ0トライ内に挿入する値を具備している限り（１３００）、挿入プロセスは、Ｃ0トライが２つのレベルのみを具備しているかどうかを判定する（１３０２）。そして、２つのレベルのみを具備している場合には、挿入プロセスは、どの既存のリーフが、値が属しているキーインターバルを含んでいるかを判定する（１３０４）。既存のリーフが識別されたら、挿入プロセスは、その識別されたキーインターバル内に、可能な限り多くの値を挿入する。一方、Ｃ0トライが２つを上回る数のレベルを具備している場合には、挿入プロセスは、後述するブランチ挿入プロセスを呼び出すことにより、Ｃ0トライを縦断し、値を適切なレベルにおいてＣ0トライ内に挿入する１３０８。サブトライは、そのサブトライ又はそのサブトライの特定レベル内におけるその先行のサブトライの深さ以下の深さを具備する新しい値を包含したために適格性を喪失した場合に、分割されることになる。
【００６５】
すべての値の挿入が完了した後に（１３１０）、挿入プロセスは、新しい値が挿入されたかどうかを判定する（１３１２）。そして、挿入されている場合には、挿入プロセスは、効率的な処理のためには、Ｃ0トライが大きくなりすぎており、従って、Ｃ0トライのサブトライのいずれかを分割する必要があるかどうかを判定する。そして、挿入プロセスは、後述するナビゲート及び分割関数をＣ0トライの最上位レベルから呼び出すことにより、サブトライを分割する（１３１６）。そして、Ｃ0トライの処理が完了した後に（１３１８）、挿入プロセスは、新しい値を実際の値ストアに追加することになる（１３２０）。
【００６６】
図１４は、本発明の代表的な実施形態によるブランチ挿入プロセスのプロセスフローチャートである。まず、挿入する値が存在している限り（１４００）、ブランチ挿入プロセスは、現在のレベルの直下のどのレベルが、キーインターバルがその値を含んでいるサブトライを含んでいるかを判定する（１４０２）。そして、ブランチ挿入プロセスが、その現在のレベルの直下のレベルが、リーフレベルの上のレベルではないと判定した場合には（１４０４）、ブランチ挿入プロセスは、その現在のレベルの直下のレベルを処理するべく、自分自身を再帰的に呼び出すことになる。
【００６７】
一方、ブランチ挿入プロセスが、その現在のレベルの直下のレベルが、リーフレベルの上のレベルであると判定した場合には（１４０４）、ブランチ挿入プロセスは、どのリーフキーインターバルが、挿入対象の値のキーを含んでいるかを判定し（１４０８）、そのキーインターバル内に可能な限り多くの値を挿入する（１４１０）。次いで、ブランチ挿入プロセスは、現在のサブトライ内に次の値が存在しているかどうかを判定する（１４１１）。そして、現在のサブトライ内に次の値が存在していない場合には、ブランチ挿入プロセスは、１レベル上のトライに上昇し（１４１２）、そのＣ0トライが、依然として、適格性を有しているかどうかを判定する（１４１４）。そして、適格性を有していない場合には、ブランチ挿入プロセスは、値が挿入されたサブトライに対して分割を実行する（１４１６）。プランチ挿入プロセスは、すべての値の挿入が完了するまで、以上の処理を継続する（１４１７）。そして、値の挿入が完了したら、ブランチ挿入プロセスは、終了することになる（１４１８）。
【００６８】
図１５は、本発明の代表的な実施形態によるＣ0トライ再構築プロセスのプロセスフローチャートである。このＣ0トライ再構築プロセス１５００においては、Ｃ0トライの表現が、整然性を有すると共に、適格性を有しているという事実を活用している。このＣ0トライ再構築プロセスは、前述の深さベクトルとカウンタベクトルを使用することにより、Ｃ0トライの残りのサブトライを使用してＣ0トライを再構築する。このＣ0トライの再構築に所要する時間は、削除プロセスの後にＣ0トライ全体を再生成する場合よりも少ない。そして、この再構築プロセスにおいては、前述のＬＩＤを使用して、トライ内の要素を追跡している（但し、空のストリングが値ストア内に存在している場合には、その空のストリングは、ＬＩＤ１ではあるが、その空のストリングはトライ内には存在しておらず、この場合には、そのトライ内の第１要素は、ＬＩＤ２となる）。即ち、このＣ0トライ再構築プロセスにおいては、まず、現在の残存ＬＩＤを第１残存ＬＩＤと等しく設定する（１５０２）。そして、処理対象の更なる残存ＬＩＤが存在している限り（１５０４）、このＣ0トライ再構築プロセスは、次の残存ＬＩＤを取得し（１５０４）、その次の残存ＬＩＤが、以前の残存ＬＩＤ及び現在の残存ＬＩＤと連続しているかどうかを判定する（１５０８）。そして、この条件が充足された場合には、この３つの残存ＬＩＤが連続して存在しているということであり、現在の残存ＬＩＤの深さとこれに先行するダミーエントリーは、古い深さと同一である。この場合には、Ｃ0トライ再構築プロセスは、以前の残存ＬＩＤの位置と現在の残存ＬＩＤの位置の間に位置している古い深さの要素を複写する（１５１０）。以前の残存ＬＩＤの深さと現在の残存ＬＩＤの深さが変わっておらず、古い深さベクトル内の深さの位置も変わっていないため、これは可能である。
【００６９】
一方、Ｃ0トライ再構築プロセスが、次の残存ＬＩＤが以前の残存ＬＩＤ及び現在の残存ＬＩＤと連続していないと判定した場合には、Ｃ0トライ再構築プロセスは、Ｃ0トライの最上位レベルの下のレベルから始めて（１５１２）、現在の残存ＬＩＤと次の残存ＬＩＤが同一レベルのサブトライ内にあるかどうかを判定する。そして、同一レベルのサブトライ内にある場合には、Ｃ0トライ再構築プロセスは、Ｃ0トライ内において１レベル降下し（１５１６）、再度、この判定を行う。一方、Ｃ0トライ再構築プロセスが、現在の残存ＬＩＤと次の残存ＬＩＤが、同一レベルのサブトライ内にないと判定した場合には、Ｃ0トライ再構築プロセスは、図１６に示されているように、現在の残存ＬＩＤの深さを判定する（１５１８）。次いで、Ｃ0トライ再構築プロセスは、そのＣ0トライが、現在の残存ＬＩＤの深さにおいて、新しいダミーエントリーを必要としているかどうかを判定する（１５２０）。そして、必要としている場合には、Ｃ0トライ再構築プロセスは、図１７に示されているように、その必要とされているダミーを挿入する（１５２２）。一方、新しいダミーエントリーを必要としていない場合には（或いは、必要なダミーを生成した後に）、Ｃ0トライ再構築プロセスは、そのＣ0トライ内において１レベル上昇し（１５２４）、Ｃ0トライ再構築プロセスが、そのＣ0トライの最上位に戻っているかどうかを判定する（１５２６）。そして、最上位に戻っている場合には、Ｃ0トライ再構築プロセスは、次の残存ＬＩＤを取得することにより（１５０６）、処理を継続する。一方、最上位に戻っていない場合には、Ｃ0トライ再構築プロセスは、Ｃ0トライ内においてレベルを上昇することにより、そのＣ0トライの処理を継続し、そのＣ0トライが、それぞれのレベルにおいて新しいダミーエントリーを必要としているかどうかを判定することになる（１５２０）。
【００７０】
図１６は、本発明の代表的な実施形態によるＣ0トライ再構築プロセスによって使用されるサブトライ深さ判定プロセスのプロセスフローチャートである。Ｃ0トライ再構築プロセスにおいては、このサブトライ深さ判定プロセス１５１８を使用することにより、ＬＩＤが属しているサブトライの最小深さを判定している。このサブトライ深さ判定プロセスは、前述した深さベクトルをチェックし、現在の残存ＬＩＤのサブトライと次の残存ＬＩＤのサブトライ間におけるサブトライの最小深さを検出することにより、これを実行している。まず、サブトライ深さ判定プロセスは、現在の最小深さを現在の残存ＬＩＤのサブトライの深さに設定する（１６００）。次いで、サブトライ深さ判定プロセスは、処理対象のサブトライを取得し（１６０２）、その選択されたサブトライをインクリメントする（１６０３）。そして、サブトライ深さ判定プロセスは、そのサブトライが、次の残存ＬＩＤのサブトライであるかどうかを判定する（１６０４）。そして、次の残存ＬＩＤのサブトライである場合には、サブトライ深さ判定プロセスは、現在の残存ＬＩＤのサブトライの深さを現在の最小値に設定する（１６０８）。一方、そうでない場合には、サブトライ深さ判定プロセスは、そのサブトライの深さが、現在の最小深さを下回っているかどうかを判定する（１６１０）。そして、現在の最小深さを下回っている場合には、サブトライ深さ判定プロセスは、現在の最小深さをそのサブトライの深さに設定する。尚、いずれの場合にも、サブトライ深さ判定プロセスは、処理対象の別のサブトライを取得することにより、処理を継続することになる（１６０２）。
【００７１】
図１７は、本発明の代表的な実施形態によるダミー配置プロセスの擬似コードである。ダミー配置プロセス１５２２が、サブトライの現在のレベル内にダミーを配置する必要があると判定すると（１７００）、ダミー配置プロセスは、そのＣ0トライの再構築のために維持されている（図示されてはいない）一時的深さ値ベクトル内の最後の深さ値に現在の最小値を設定する（１７０１）。この一時的深さ値ベクトルは、新しい深さベクトル内に現在のＬＩＤに必要な深さを含んでおり、これは、そのＣ0トライが再構築される際に生成される新しい深さベクトルへの挿入とは逆に充填されている。従って、現在の最小値は、図１５及び図１６の現在のＬＩＤの深さ、又はこのダミー配置プロセスによってサブトライ内に挿入された最新のダミーの深さのいずれかである。次いで、このダミー配置プロセスは、このレベルにおいて、現在のＬＩＤのサブトライ−１から始めて、サブトライ内を逆方向にチェックする（１７０２）。そして、ダミー配置プロセスが、サブトライの位置が以前の位置よりも大きいと判定し（１７０４）、且つ、サブトライの深さが、現在の最小値を下回っていると判定した場合には（１７０６）、ダミー配置プロセスは、一時的深さベクトルの末尾にサブトライの深さのダミーを挿入し（１７０８）、現在の最小値をサブトライの深さに設定する（１７１０）。一方、サブトライの位置が、以前の位置を上回っていない場合には、ダミー配置プロセスは、ループの処理を停止する（１７１２）。
【００７２】
以上、特定の実施形態において、本発明について説明したが、当業者には、多数の更なる変更及び変形が明らかであろう。従って、本発明は、具体的に説明したもの以外の方法によって実施可能であることを理解されたい。即ち、本発明の実施形態は、すべての面において、例示を目的とするものであって、限定を意図するものではないと見なす必要がある。本発明の範囲は、本出願によって支持されている添付の請求項と、その等価物によって規定されているとおりである。
【図面の簡単な説明】
【００７３】
【図１ａ】本発明の代表的な実施形態によるデータ処理システムのブロックダイアグラムである。
【図１ｂ】本発明の代表的な実施形態によるデータベースシステムの概略ブロックダイアグラムである。
【図２ａ】コンプリートバイナリツリーの概念図である。
【図２ｂ】０コンプリートバイナリツリーの概念図である。
【図３ａ】データベース内に格納された値のＯツリーインデックス構造の図である。
【図４ａ】Ｏツリーのインスタンス化を示している。
【図５】本発明の代表的な実施形態によるＣ0トライを表現するのに使用されるデータ構造を示すブロックダイアグラムである。
【図６】本発明の代表的な実施形態によるＣ0トライの選択ベクトルの説明用の例を示すブロックダイアグラムである。
【図７】本発明の代表的な実施形態によるＣ0トライサーチプロセスのプロセスフローチャートである。
【図８】本発明の代表的な実施形態による値ストア構造のブロックダイアグラムである。
【図９】本発明の代表的な実施形態による削除プロセスのプロセスフローチャートである。
【図１０】本発明の代表的な実施形態によるＣ0トライマージ制御プロセスのプロセスフローチャートである。
【図１１】本発明の代表的な実施形態において使用されるＣ0トライマージプロセスのプロセスフローチャートである。
【図１２】本発明の代表的な実施形態によるブランチ削除プロセスのプロセスフローチャートである。
【図１３】本発明の代表的な実施形態による挿入プロセスのプロセスフローチャートである。
【図１４】本発明の代表的な実施形態によるブランチ挿入プロセスのプロセスフローチャートである。
【図１５】本発明の代表的な実施形態によるＣ0トライ再構築プロセスのプロセスフローチャートである。
【図１６】本発明の代表的な実施形態によるＣ0トライ再構築プロセスが使用するサブトライ深さ判定プロセスのプロセスフローチャートである。
【図１７】本発明の代表的な実施形態によるＣ0トライ再構築プロセスが使用するダミー配置プロセスのプロセスフローチャートである。
【図１ａ】
2006521623.tif 000004
【図１ｂ】
2006521623.tif 000005
【図２ａ】
2006521623.tif 000006
【図２ｂ】
2006521623.tif 000007
【図３ａ】
2006521623.tif 000008
【図４ａ】
2006521623.tif 000009
【図５】
2006521623.tif 000010
【図６】
2006521623.tif 000011
【図７】
2006521623.tif 000012
【図８】
2006521623.tif 000013
【図９】
2006521623.tif 000014
【図１０】
2006521623.tif 000015
【図１１】
2006521623.tif 000016
【図１２】
2006521623.tif 000017
【図１３】
2006521623.tif 000018
【図１４】
2006521623.tif 000019
【図１５】
2006521623.tif 000020
【図１６】
2006521623.tif 000021
【図１７】
2006521623.tif 000022
【国際調査報告】
2006521623.tif 000023