(57)【要約】【課題】  Ｂツリーを使用した位置アクセスを提供すること。【解決手段】  情報を格納しているｂツリーが、ｂツリーのリーフに格納された要素の位置アクセスを容易にするために利用される。ｂツリーは、各非リーフレベル値について、カウントがすぐ左側に位置し、値がすぐ右側に位置するように構造化される。この左カウントおよび右カウントは、値のすぐ左側および値のすぐ右側のサブツリーのリーフに配置されたリーフレベル値の数を示す。左カウントおよび右カウントは、特定の位置のサーチにおいてｂツリーを下降する際に辿るべきパスを決定するのに使用される。また、カウントは、ｂツリーのリーフレベルにある値の総数を特定するためにも利用することができる。【選択図】  図４
2004362574.tif 000002
【特許請求の範囲】
【請求項１】
所定の順序位置に配置された要素についてバランスツリー（ｂツリー）をサーチするための方法であって、
前記ｂツリーのルートノードの要素を左から右に評価する動作と、
前記ルートノードのサブツリーのそれぞれに収容されたリーフレベル要素の数を示すリーフレベルカウントに基づいて前記サブツリーを選択し、前記選択したサブツリーの前記ルートノードまで下降する動作と、
評価する前記動作、選択する前記動作、および下降する前記動作を、前記ｂツリーのリーフノードに遭遇するまで繰り返す動作と、
前記リーフノード内の要素の相対位置、および前記リーフノードに先行する他のリーフノードに格納された要素の総数に従って、前記リーフノードにおいて、前記所定の順序位置にある前記要素を探し出す動作と
を備えることを特徴とする方法。
【請求項２】
前記所定の順序位置を表す数が前記ｂツリーの前記ルートノードの中のすべてのリーフレベルカウントの合計より大きいかどうかを判定する動作と、
前記所定の位置の前記値が前記合計より大きい場合、前記所定の位置の値が範囲外であることを示す動作と
をさらに備えることを特徴とする請求項１に記載の方法。
【請求項３】
選択する前記動作は、
前記ルートノードの要素毎に、前記所定の順序位置を表す数が、
前記遭遇した値あり要素に隣接して左側に位置するリーフレベルカウントの値と、
すべての以前に遭遇した右リーフレベルカウントおよび左リーフレベルカウントの累積値を示すスキップカウントカウンタの値と
の第１の合計以下であるかどうかを判定する動作と、
前記数が前記第１の合計以下である場合、サブツリーを選択する動作と、
前記数が前記第１の合計より大きい場合、
最も最近遭遇した左リーフレベルカウントの値だけ前記スキップカウント値を増分する動作と、
前記数が、
前記遭遇した値あり要素に隣接して右側に位置する右リーフレベルカウントの値と、
前記スキップカウント値と
の第２の合計以下であるかどうかを判定する動作と、
前記数が、前記第２の合計より大きい場合、
最も最近トラバースした右リーフレベルカウントの値だけ前記スキップカウント値を増分する動作と、
次に遭遇する値あり要素まで左から右に移動する動作と、
前記数が前記第２の合計以下であるかどうかを判定する前記動作を繰り返す動作と、
前記数が前記第２の合計以下である場合、サブツリーを選択する動作と
を備えることを特徴とする請求項１に記載の方法。
【請求項４】
前記数が前記第１の合計以下である場合、前記遭遇した値あり要素に隣接して左側に位置するリーフレベルカウントに対応するサブツリーが選択され、
前記数が前記第１の合計より大きい場合、前記遭遇した値あり要素に隣接して右側に位置するリーフレベルカウントに対応するサブツリーが選択される
ことを特徴とする請求項３に記載の方法。
【請求項５】
前記ｂツリーの前記リーフレベルにおいて前記要素の前記所定の位置を探し出す前記動作は、
前記所定の順序位置を表す数と、すべてのトラバースしたリーフレベルカウントの値の合計との差を算出する動作
を備えることを特徴とする請求項１に記載の方法。
【請求項６】
前記ｂツリーの非リーフレベルにおけるノードの各値あり要素について、左リーフレベルカウント要素は、非リーフレベルの各値あり要素に隣接して右側に位置し、
前記左リーフレベルカウントのそれぞれは、
前記ｂツリーの左サブツリーのリーフレベルにある値あり要素の総数と、
前記左サブツリーのそれぞれのルートノードを示し、
右リーフレベルカウント要素は、非リーフレベルの各値あり要素に隣接して左側に位置し、
各右リーフレベルカウント要素は、
前記ｂツリーの右サブツリーのリーフレベルにある値あり要素の総数と、
前記右サブツリーのそれぞれのルートノードを示す
ことを特徴とする請求項１に記載の方法。
【請求項７】
各左サブツリーは、前記左リーフレベルカウント要素によって示されるそれぞれのルートノードから開始して前記ｂツリーから分岐するすべての要素を備え、
各右サブツリーは、前記右リーフレベルカウント要素によって示されるそれぞれのルートノードから開始して前記ｂツリーから分岐するすべての要素を備える
ことを特徴とする請求項６に記載の方法。
【請求項８】
前記ｂツリーは、
前記ｂツリーの前記リーフレベルにおいて各値あり要素に隣接して左側に位置する左リーフレベルカウント要素と、
前記ｂツリーの前記リーフレベルにおいて各値あり要素に隣接して右側に位置する右リーフレベルカウント要素と
をさらに備えることを特徴とする請求項１に記載の方法。
【請求項９】
前記ルートノードの各要素は、第１のリーフレベルカウントおよび第２のリーフレベルカウントに関連し、前記第１のリーフレベルカウントは、前記要素のすぐ左側のサブツリーを下降することによって到達可能なリーフレベルの値あり要素の数を示し、前記第２のリーフレベルカウントは、前記要素のすぐ右側のサブツリーを下降することによって到達可能なリーフレベルの値あり要素の数を示すことを特徴とする請求項１に記載の方法。
【請求項１０】
前記選択する動作は、
（ｉ）カウンタを初期化する動作と、
（ｉｉ）前記ルートノードの左端の要素から開始して、（ａ）前記要素の第１のカウントと（ｂ）前記カウンタの合計が、前記所定の順序位置を表す数より大きいかどうかを判定する動作と、
（ｉｉｉ）前記第１のカウントが前記数より大きい場合、前記要素のすぐ左側のサブツリーを下降する動作と、
（ｉｖ）前記第１のカウントが前記数より大きくない場合、前記第１のカウントを前記カウンタに加算し、前記ルートノードの次の要素まで右側に移動する動作と、
（ｖ）前記ルートノードの右端の要素に到達するまで、またはサブツリーを下降しきるまで、前記ルートノードの各要素について動作（ｉｉ）、（ｉｉｉ）、および（ｉｖ）を繰り返す動作と、
（ｖｉ）サブツリーを下降しきることなく前記ルートノードの右端の要素に到達した場合、前記ルートノードの右端の要素のすぐ右側のサブツリーを下降する動作と
を備えることを特徴とする請求項９に記載の方法。
【請求項１１】
前記探し出す動作は、
前記数から前記カウンタを引いて差を算出する動作と、
前記リーフノードの左端の要素から前記差に等しい数の位置だけ右側に現れる要素を前記リーフノードにおいて探し出す動作と
を備えることを特徴とする請求項１０に記載の方法。
【請求項１２】
１つまたは複数の非リーフノードと
１つまたは複数のリーフノードと
を備えているｂツリーデータ構造を格納したコンピュータ可読媒体であって、
前記リーフノードのそれぞれは、
複数の順序付け可能な値の１つまたは複数を格納しているか、または関連付けらており、
前記非リーフノードのそれぞれは、
前記複数の順序付け可能な値の１つまたは複数と、
リーフノードまたは他の非リーフノードに対する１つまたは複数の参照と、
１つまたは複数のカウントデータであって、該カウントデータのそれぞれが前記参照の１つに対応し、該対応する参照を辿ることによって到達可能なリーフノードに格納されるか、または関連する値の数をそれぞれが示す１つまたは複数のカウントデータと
を格納するか、または関連付けられた
ことを特徴とするコンピュータ可読媒体。
【請求項１３】
各リーフノードの前記順序付け可能な値は、順序に従って編成され、
各非リーフノードの前記順序付け可能な値は、前記順序に従って編成され、
各非リーフノードの前記参照は、前記順序で編成され、所与の参照から到達可能なノードに格納されるか、または関連付けられている前記所与の参照内のすべての値が、前記順序で前記所与の参照の後に続くすべての参照から到達可能なノードに格納された値に先行するように編成された
ことを特徴とする請求項１２に記載のコンピュータ可読媒体。
【請求項１４】
非リーフノードの前記順序付け可能な値のそれぞれは、前記非リーフノードの前記参照の第１の参照および第２の参照に関連づけられ、
前記順序において前記順序付け可能な値に先行する値だけが前記第１の参照から到達可能であり、
前記順序において前記順序付け可能な値に進むか、または前記順序において前記順序付け可能な値と同じ位置にある値だけが前記第２の参照から到達可能であるように
関連付けられたことを特徴とする請求項１３に記載のコンピュータ可読媒体。
【請求項１５】
バランスツリー（ｂツリー）の所定の位置に配置された要素を探し出すようにコンピュータプロセッサに指示するためのコンピュータプログラムコードでエンコードされたコンピュータ可読媒体であって、前記プログラムコードは、
前記コンピュータプロセッサに前記ｂツリーのルートノードの要素を左から右にトラバースさせるためのトラバースｂツリーコードセグメントと、
前記コンピュータプロセッサに値を有するそれぞれの遭遇した要素（値あり要素）において、前記所定の位置の値を左リーフカウント要素によって示される値および右リーフカウント要素によって示される値と比較させるための比較コードセグメントと、
前記コンピュータプロセッサに比較する前記動作の結果に従って前記ｂツリーのサブツリーを選択させるための選択コードセグメントと、
前記コンピュータプロセッサに前記選択したサブツリーのルートノードの要素を左から右にトラバースさせるためのトラバースサブツリーコードセグメントと、
前記コンピュータプロセッサに前記ｂツリーの前記リーフレベルに遭遇するまで、比較する前記動作、選択する前記動作、および選択したサブツリーのルートノードの要素をトラバースする前記動作を繰り返させるための繰り返しコードセグメントと、
前記コンピュータプロセッサに前記所定の位置の前記値と、
トラバースした左リーフカウント要素と
に従って前記ｂツリーの前記リーフレベルにおける前記要素の前記所定の位置を探し出させるための探索コードセグメントと
を備えたことを特徴とするコンピュータ可読媒体。
【請求項１６】
前記プログラムコードは、
前記コンピュータプロセッサに前記所定の位置の前記値が前記ｂツリーの前記ルートノードのすべての左リーフレベルカウント要素値と前記ｂツリーの前記ルートノードのすべての右リーフレベルカウント値との合計より大きいかどうかを判定させるための判定コードセグメントと、
前記コンピュータプロセッサに前記所定の位置の前記値が前記合計より大きい場合、前記所定の位置の値が範囲外であることを示させるための指示コードセグメントと
をさらに備えたことを特徴とする請求項１５に記載のコンピュータ可読媒体。
【請求項１７】
比較する前記動作は、
前記所定の位置の値が、
前記遭遇した値あり要素に隣接して左側に位置する左リーフレベルカウント要素の値と、
すべての以前にトラバースした右リーフレベルカウント要素および左リーフレベルカウント要素の累計値を示すスキップカウントカウンタの値であって、左リーフレベルカウント要素の最初のトラバースに先立ってゼロに初期化されるスキップカウントカウンタの値と
の第１の合計以下であるかどうかを判定する動作と、
前記所定の位置値が前記第１の合計以下である場合、サブツリーを選択する動作と、
前記所定の位置値が前記第１の合計より大きい場合、
最も最近トラバースした左リーフレベルカウント要素の値だけ前記スキップカウント値を増分する動作と、
前記所定の位置の値が、
前記遭遇した値あり要素に隣接して右側に位置する右リーフレベルカウント要素の値と
前記スキップカウント値と
の第２の合計以下であるかどうかを判定する動作と、
前記所定の位置の値が前記前記第２の合計以下である場合、
最も最近トラバースした右リーフレベルカウント要素の値だけ前記スキップカウント値を増分する動作と、
次に遭遇する値あり要素まで左から右にトラバースする動作と、
前記所定の位置の値が前記第２の合計以下であるかどうかを判定する前記動作から開始して比較する前記動作を繰り返す動作と
を備えたことを特徴とする請求項１５に記載のコンピュータ可読媒体。
【請求項１８】
選択する前記動作は、
前記所定の位置の値が前記第１の合計以下である場合、前記遭遇した値あり要素に隣接して左側に位置する左リーフレベルカウント要素によって示されるサブツリーを選択する動作と、
前記所定の位置の値が前記第２の合計より大きい場合、前記遭遇した値あり要素に隣接して右側に位置する右リーフレベルカウント要素によって示されるサブツリーを選択する動作と
を備えたことを特徴とする請求項１７に記載のコンピュータ可読媒体。
【請求項１９】
前記ｂツリーの前記リーフレベルにおいて前記要素の前記所定の位置を探し出す前記動作は、
前記所定の位置の値と、すべてのトラバースした左リーフレベルカウント要素の値の合計との差を算出する動作
を備えたことを特徴とする請求項１５に記載のコンピュータ可読媒体。
【請求項２０】
前記ｂツリーの非リーフレベルにおけるノードの各値あり要素について、左リーフレベルカウント要素は、非リーフレベルの各値あり要素に隣接して右側に位置し、
各左リーフレベルカウント要素は、
前記ｂツリーの左サブツリーのリーフレベルにある値あり要素の総数と、
前記左サブツリーのそれぞれのルートノードを示し、
右リーフレベルカウント要素は、非リーフレベルの各値あり要素に隣接して左側に位置し、
各右リーフレベルカウント要素は、
前記ｂツリーの右サブツリーのリーフレベルにある値あり要素の総数と、
前記右サブツリーのそれぞれのルートノードを示す
ことを特徴とする請求項１５に記載のコンピュータ可読媒体。
【請求項２１】
各左サブツリーは、前記左リーフレベルカウント要素によって示されるそれぞれのルートノードから開始して前記ｂツリーから分岐するすべての要素を備え、
各右サブツリーは、前記右リーフレベルカウント要素によって示されるそれぞれのルートノードから開始して前記ｂツリーから分岐するすべての要素を備えた
ことを特徴とする請求項１５に記載のコンピュータ可読媒体。
【請求項２２】
前記ｂツリーは、
前記ｂツリーの前記リーフレベルにおいて各値あり要素に隣接して左側に位置する左リーフレベルカウント要素と、
前記ｂツリーの前記リーフレベルにおいて各値あり要素に隣接して右側に位置する右リーフレベルカウント要素と
をさらに備えたことを特徴とする請求項１５に記載のコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に、データ処理に関し、より具体的には、ｂツリーにおける要素の位置アクセスに関する。
【背景技術】
【０００２】
バランスツリー（ｂツリー）は、ソート順にデータを格納するのによく使用されるデータ構造である。ｂツリーは、ソート順の大量のデータへのアクセスが、通常、必要とされるデータベース操作に特に適用される。ｂツリーを使用してデータを格納することにより、ｂツリーのデータをソート順に容易に取り出すことができるようになる。また、ソート順を使用してソート順内での順序位置に基づいて、ｂツリーの個々のデータ項目（例えば、ソートされたデータセットの第ｎ番の項目）にアクセスすることも可能である。このタイプのアクセスは、位置アクセスとして知られている。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
ｂツリーを利用する位置アクセスは、従来、ｂツリーのデータ項目の位置を計算するか、または近似することを含む。例えば、ｂツリーがそのリーフに２ｎ個の異なる値を格納する場合、ｂツリーが左から右までほぼ均等にデータを配分するという想定を使用して、第ｎ番のソートされた項目はｂツリーのリーフレベルのほぼ中間に現れるものと推定することができる。しかし、ｂツリーの正確なサイズ、およびｂツリーにわたるデータの正確な配分は、サーチが開始される時点では、通常、分からない。つまり、ｂツリーのリーフノードの値の正確な数、ならびにどれだけ均等にそれらの値が配分されているかは、分からない場合ある。このように、探索される項目について分かっていることがソート順の第ｎ番の項目であることだけである場合、その項目を正確に探し出すことは依然として困難である可能性がある。さらに、推定がどれだけ正確であるかを確認することさえ困難である。というのは、一般に、所与のデータ項目が第ｎ番のデータ項目であるかどうかを判定することは、ツリーをそのリーフまで下にトラバースして、どれだけの数のデータ項目がこの所与のデータ項目に先行しているかを明らかにすることを伴うからである。それゆえ、上記の欠点を抱えていないｂツリーを利用した位置アクセスのための技術が望まれる。
【課題を解決するための手段】
【０００４】
本発明によるｂツリーは、特定の順序位置にある値またはデータ項目を探し出し易くしたり、または他の位置アクセス操作を実行したりするのに使用することができる情報を格納するように構成される。ｂツリーは、非リーフレベルノードにある各インデックス値が左カウントおよび右カウントに関連付けられるように構造化される。この左カウントおよび右カウントは、インデックス値のそれぞれすぐ左側およびすぐ右側のサブツリーで特定されるリーフレベル値の数を示す。左値および右値は、特定の順序位置を有するデータ項目のサーチにおいてｂツリーを下降する際に辿るべきパスを判定するために使用される。
【０００５】
ｂツリーの所定の位置に配置された要素をサーチするための方法は、ｂツリーのルートノードにあるインデックス値を左から右に評価することを含む。探索されるデータ項目の順序位置が、遭遇した最初の左カウント以下である場合、ルートの最も左側のサブツリーが選択される。それ以外の場合、左カウントが実行カウント（ｒｕｎｎｉｎｇ  ｃｏｕｎｔ）に加算される。探索されるデータ項目の順序位置が実行カウントと右カウントの合計以下である場合、現在のインデックス値のすぐ右側のサブツリーが選択される。しかし、探索されるデータ項目の順序位置が上記の合計より大きい場合、右カウントが実行カウントに加算され、インデックス値が左から右に検討され、探索データ項目の順序位置が新たな合計以下であるかどうかが判定される。実行カウントに各インデックス値の右カウントを加算し、探索される順序位置が実行カウントと現在のインデックス値の右カウントの合計以下であるかどうかを判定するプロセスは、その条件に合うインデックス値が見つかるまで繰り返される。その後、そのインデックス値のすぐ右側のサブツリーが選択される。
次に、選択されたサブツリーを下降し、このプロセスは、ｂツリーのリーフレベルに遭遇するまで再度繰り返される（実行カウントが、繰り返しの間、維持されている状態で）。実行カウントは、現在のノードの左側のリーフノードに格納されているデータ項目に対応する。このように、ｂツリーのリーフレベルにある要素の所定の位置は、探索されるデータ項目の順序位置から実行カウントを引き、その差を使用して現在のリーフレベルノード内の特定の項目を選択することによって探し出される。
【０００６】
本発明のその他の特徴を以下に説明する。
【０００７】
本発明の特徴および利点は、付随する図面と併せて以下の説明を検討するとよく理解されることになろう。
【発明を実施するための最良の形態】
【０００８】
本明細書で説明するバランスツリー（「ｂツリー」）の要素の位置アクセスにより、ｂツリーベースのインデックスに関する効率的で正確な位置アクセス操作が提供される。本発明の一実施形態では、ｂツリーにおいて特定の要素を探し出すことなど、位置アクセス操作を効率的にサポートするために使用することができるカウント情報が、基礎となるｂツリーデータ構造の中に格納される。ｂツリーの各非リーフレベルインデックス値について、カウントがインデックス値の左側と右側に格納される。これらの左カウントおよび右カウントは、それぞれ、左リーフカウント（または「左カウント」）および右リーフカウント（または「右カウント」）と呼ばれる。左リーフカウント要素は、インデックス値のすぐ左側のサブツリーのリーフレベルにおけるデータ項目の数を示す。右リーフカウント要素は、ｂツリーの右サブツリーのルートノードを示し、この右サブツリーのリーフレベルにおける値の数も示す。カウント情報は、所与のノードを検査することにより、ノードのどのサブツリーが特定の順序位置を有するデータ項目を収容するかを特定できるようにすることによって、位置アクセスを助ける。また、カウント情報は、ルートノードにおけるカウントのすべてを合計することにより、ｂツリーのリーフレベルにおける値あり要素の総数を判定するために使用することもできる。
【０００９】
（適したコンピューティングシステム環境の概要）
図１は、ｂツリーを使用した位置アクセスのための方法およびシステムを実施することができる適切なコンピューティングシステム環境１００の一例を示している。コンピューティングシステム環境１００は、適切なコンピューティング環境の一例に過ぎず、表示要素を動的にそして個々に制御するための方法およびシステムの用法または機能の範囲について何ら限定をも示唆するものではない。コンピューティング環境１００が、例示的な動作環境１００に示したコンポーネントの任意の１つ、または組み合わせに関していかなる依存関係または要件を有するものと解釈すべきでもない。
【００１０】
ｂツリーを使用した位置アクセスのための方法およびシステムは、数多くの他の汎用、または専用のコンピューティングシステム環境またはコンピューティングシステム構成で動作可能である。表示要素を動的にそして個々に制御するための方法およびシステムとともに使用するのに適する可能性がある周知のコンピューティングシステム、コンピューティング環境、および／またはコンピューティング構成の例には、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドデバイスまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、セットトップボックス、プログラム可能な民生用電子機器、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、これらのシステムまたはデバイスのいずれかを含む分散コンピューティング環境などが含まれるが、これらには限定されない。
【００１１】
ｂツリーを使用した位置アクセスのための方法およびシステムは、コンピュータによって実行される、プログラムモジュールなどのコンピュータ実行可能命令の一般的なコンテキストにおいて説明することができる。一般に、プログラムモジュールには、特定のタスクを実行するか、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれる。ｂツリーを使用した位置アクセスのための方法およびシステムは、通信ネットワークまたは他のデータ伝送媒体を通してリンクされている遠隔の処理デバイスによってタスクが実行される分散コンピューティング環境において実施することもできる。分散コンピューティング環境では、プログラムモジュールおよびその他のデータは、メモリ記憶デバイスを含むローカルおよび遠隔の両方のコンピュータ記憶メディアに配置することができる。
【００１２】
図１を参照すると、ｂツリーを使用した位置アクセスのための方法およびシステムを実施するための例示的なシステムが、コンピュータ１１０の形態で汎用コンピューティングデバイスを含んでいる。コンピュータ１１０のコンポーネントには、処理ユニット１２０、システムメモリ１３０、ならびにシステムメモリ１３０を含む様々なシステムコンポーネントを処理ユニット１２０に結合するシステムバス１２１が含まれるが、これらには限定されない。システムバス１２１は、様々なバスアーキテクチャのいずれかを使用するメモリバスまたはメモリコントローラ、周辺バス、およびローカルバスを含むいくつかのタイプのバス構造のいずれであってもよい。限定としてではなく、例として、そのようなアーキテクチャには、ＩＳＡ（Ｉｎｄｕｓｔｒｙ  Ｓｔａｎｄａｒｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＭＣＡ（Ｍｉｃｒｏ  Ｃｈａｎｎｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＥＩＳＡ（Ｅｎｈａｎｃｅｄ  ＩＳＡ）バス、ＶＥＳＡ（Ｖｉｄｅｏ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｓｔａｎｄａｒｄｓ  Ａｓｓｏｃｉａｔｉｏｎ）ローカルバス、および（メザニン（Ｍｅｚｚａｎｉｎｅ）バスとしても知られる）ＰＣＩ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）バスが含まれる。
【００１３】
コンピュータ１１０は、通常、様々なコンピュータ可読メディアを含む。コンピュータ可読メディアは、コンピュータ１１０によってアクセスすることができる任意の利用可能なメディアであることがあり、揮発性および不揮発性メディア、リムーバブルおよび非リムーバブルメディアがともに含まれる。限定としてではなく、例として、コンピュータ可読メディアは、コンピュータ記憶メディアおよび通信メディアを含むことがある。コンピュータ記憶メディアには、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータなどの情報の格納のための任意の方法または技術で実装された揮発性および不揮発性メディア、リムーバブルおよび非リムーバブルメディアがともに含まれる。コンピュータ記憶メディアには、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリもしくは他のメモリ技術、ＣＤ−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）もしくは他の光ディスクストレージ、磁気カセット、磁気テープ、磁気ディスクストレージもしくは他の磁気記憶デバイス、または所望の情報を格納するために使用することができ、コンピュータ１１０によってアクセスすることができる任意の他のメディアが含まれるが、これらには限定されない。通信メディアは、通常、搬送波などの変調されたデータ信号、または他のトランスポート機構でコンピュータ可読命令、データ構造、プログラムモジュール、または他のデータを実体化し、任意の情報配信メディアを含む。「変調されたデータ信号」という用語は、信号内に情報をエンコードするような仕方で特性の１つまたは複数が設定または変更された信号を意味する。限定としてではなく、例として、通信メディアには、有線ネットワークまたは直接配線接続などの有線メディア、ならびに音響、ＲＦ、赤外線、およびその他の無線メディアなどの無線メディアが含まれる。また、これらメディアのいずれかの組み合わせも、コンピュータ可読メディアの範囲内に含まれることを理解されたい。
【００１４】
システムメモリ１３０は、ＲＯＭ１３１およびＲＡＭ１３２などの揮発性メモリおよび／または不揮発性メモリの形態のコンピュータ記憶メディアを含む。起動時などにコンピュータ１１０内の要素間で情報を転送する助けとなる基本ルーチンが入っている基本入出力システム１３３（ＢＩＯＳ）は、通常、ＲＯＭ１３１に格納されている。ＲＡＭ１３２は、通常、処理ユニット１２０によって即時にアクセス可能であり、そして／または現在、操作されているデータおよび／またはプログラムモジュールを収容する。限定としてではなく、例として、図１は、オペレーティングシステム１３４、アプリケーションプログラム１３５、その他のプログラムモジュール１３６、およびプログラムデータ１３７を示している。
【００１５】
また、コンピュータ１１０は、他のリムーバブル／非リムーバブル、揮発性／不揮発性のコンピュータ記憶メディアを含むこともできる。単に例として、図１は、非リムーバブルで不揮発性の磁気メディアとの読み取りまたは書き込みを行うハードディスクドライブ１４１、リムーバブルで不揮発性の磁気ディスク１５２との読み取りまたは書き込みを行う磁気ディスクドライブ１５１、およびＣＤ−ＲＯＭ、ＣＤ−ＲＷまたは他の光メディアなどのリムーバブルで不揮発性の光ディスク１５６との読み取りまたは書き込みを行う光ディスクドライブ１５５を示している。例示的な動作環境において使用することができる他のリムーバブル／非リムーバブル、揮発性／不揮発性のコンピュータ記憶メディアには、磁気テープカセット、フラッシュメモリカード、デジタル多用途ディスク、デジタルビデオテープ、半導体ＲＡＭ、半導体ＲＯＭなどが含まれるが、これらには限定されない。ハードディスクドライブ１４１は、通常、インターフェース１４０のような非リムーバブルメモリインターフェースを通してシステムバス１２１に接続され、磁気ディスクドライブ１５１および光ディスクドライブ１５５は、通常、インターフェース１５０のようなリムーバブルメモリインターフェースによってシステムバス１２１に接続される。
【００１６】
前述し、図１に示したドライブおよび関連するコンピュータ記憶メディアにより、コンピュータ１１０にコンピュータ可読命令、データ構造、プログラムモジュール、およびその他のデータのストーレッジが提供される。図１では、例えば、ハードディスクドライブ１４１が、オペレーティングシステム１４４、アプリケーションプログラム１４５、他のプログラムモジュール１４６、およびプログラムデータ１４７を格納しているのを示している。これらのコンポーネントは、オペレーティングシステム１３４、アプリケーションプログラム１３５、他のプログラムモジュール１３６、およびプログラムデータ１３７と同じであっても、異なっていてもよいことに留意されたい。オペレーティングシステム１４４、アプリケーションプログラム１４５、他のプログラムモジュール１４６、およびプログラムデータ１４７に、ここでは、少なくともそれらが異なるコピーであることを示すために異なる符号を付けている。ユーザは、キーボード１６２や、マウス、トラックボール、またはタッチパッドと一般に呼ばれるポインティングデバイス１６１などの入力デバイスを通して、コマンドおよび情報をコンピュータ１１０に入力することができる。その他の入力デバイス（図示せず）には、マイクロフォン、ジョイスティック、ゲームパッド、衛星アンテナ、スキャナ等が含まれることがある。これらの入力デバイス、およびその他の入力デバイスは、システムバス１２１に結合されたユーザ入力インターフェース１６０を通して処理ユニット１２０に接続されることが多いが、パラレルポート、ゲームポート、またはユニバーサルシリアルバス（ＵＳＢ）などの他のインターフェースおよびバス構造によって接続することもできる。また、モニタ１９１、または他のタイプのディスプレイデバイスも、ビデオインターフェース１９０などのインターフェースを介してシステムバス１２１に接続される。モニタに加えて、コンピュータは、出力周辺インターフェース１９０を通して接続することができるスピーカ１９７やプリンタ１９６などの他の周辺出力デバイスを含むこともできる。
【００１７】
コンピュータ１１０は、遠隔コンピュータ１８０のような１つまたは複数の遠隔コンピュータに対する論理接続を使用してネットワーク化された環境において動作することができる。遠隔コンピュータ１８０は、パーソナルコンピュータ、サーバ、ルータ、ネットワークＰＣ、ピアデバイス、または他の一般的なネットワークノードであることができ、通常、コンピュータ１１０に関連して前述した要素の多く、またはすべてを含むが、メモリ記憶デバイス１８１だけを図１に示している。図１に示した論理接続は、ローカルエリアネットワーク（ＬＡＮ）１７１およびワイドエリアネットワーク（ＷＡＮ）１７３を含むが、その他のネットワークを含むこともある。そのようなネットワーキング環境は、オフィス、企業全体のコンピュータネットワーク、イントラネット、およびインターネットで一般的である。
【００１８】
ＬＡＮネットワーキング環境で使用される場合、コンピュータ１１０は、ネットワークインターフェースまたはネットワークアダプタ１７０を通してＬＡＮ１７１に接続される。ＷＡＮネットワーキング環境で使用される場合、コンピュータ１１０は、通常、インターネットなどのＷＡＮ１７３を介して通信を確立するためのモデム１７２、またはその他の手段を含む。内蔵であることも、外付けであることもあるモデム１７２は、ユーザ入力インターフェース１６０、またはその他の適切な機構を介してシステムバス１２１に接続することができる。ネットワーク化された環境では、コンピュータ１１０に関連して示したプログラムモジュール、またはその部分は、遠隔のメモリ記憶デバイスに格納されることがある。限定としてではなく、例として、図１は、遠隔のアプリケーションプログラム１８５がメモリデバイス１８１上に存在するように示している。図示したネットワーク接続は、例示であり、コンピュータ間で通信リンクを確立する他の手段を使用することができることが認められるであろう。
【００１９】
パーソナルコンピューティングおよびインターネットの収束に照らして、様々な分散コンピューティングフレームが開発済みであり、また開発中である。個人ユーザにもビジネスユーザにも等しく、アプリケーションおよびコンピューティングデバイスのためのシームレスな相互運用が可能なＷｅｂ対応のインターフェースが提供されており、コンピューティング活動がますますＷｅｂブラウザ指向またはネットワーク指向になっている。
【００２０】
例えば、マイクロソフト（登録商標）の．ＮＥＴプラットフォームは、Ｗｅｂベースのデータストレージやダウンロード可能なデバイスソフトウェアなどのサーバ、ビルディングブロックサービスを含む。一般的に言って、．ＮＥＴプラットフォームにより、（１）全範囲のコンピューティングデバイスを協働させ、すべてのコンピューティングデバイス上でユーザ情報を自動的に更新し、同期する能力、（２）ＨＴＭＬではなくＸＭＬのより大幅な使用により可能となるＷｅｂサイトのより高いインタラクティブな能力、（３）例えば、電子メールなどの様々なアプリケーション、またはＯｆｆｉｃｅ．ＮＥＴのようなソフトウェアの管理のために中央の開始点からユーザに対する製品およびサービスのカスタマイズされたアクセスおよびデリバリを特徴とするオンラインサービス、（４）情報に対するアクセスの効率および容易さ、ならびにユーザ間およびデバイス間での情報の同期を高める集中データストレージ、（５）電子メール、ファックス、および電話などの様々な通信メディアを統合する能力、（６）開発者にとって、再使用可能なモジュールを作成し、これにより、生産性を高め、プログラミングエラーの数を減少させる能力、ならびに（７）他の多くのクロスプラットフォーム統合機能が提供される。
【００２１】
本明細書の例示的な実施形態は、コンピューティングデバイス上に存在するソフトウェアに関連して説明するが、表示要素を動的に、そして個々に制御するための方法およびシステムの１つまたは複数の部分を、．ＮＥＴの言語およびサービスのすべて、同様に他の分散コンピューティングフレームワークにおいてサービスを実行し、サポートし、アクセスできるようにオペレーティングシステム、アプリケーションプログラムインターフェース（ＡＰＩ）、またはコプロセッサと要求側オブジェクト間の「ミドルマン（ｍｉｄｄｌｅ  ｍａｎ）」オブジェクトを介して実装することができる。
【００２２】
（カウント情報を使用したＢツリーにおける位置アクセス）
ｂツリーは、ソート順で値の集合を保持するために使用されるデータ構造である。各値は、ｂツリーのリーフレベルにおける要素の中に格納されるか、または参照される。ｂツリーの各ノードは、通常、ｎ個の値（例えば、ｎ＝４）に対する空間を収容する。値のいくつかは、未使用であるか、または「空」である場合がある。本明細書の用法では、値を含む空間または要素は、「値あり要素」と呼び、空である空間または要素は、「値なし要素」と呼ぶ。図２は、例示的なｂツリー構造２００を示している。ｂツリー２００は、レベル１２、１４、および１６で示すレベルを備える。最上レベル１２は、ルートレベルと呼ばれる。最下レベル１６は、リーフレベルと呼ばれる。リーフレベル１６以外のどのレベルも、非リーフレベルと呼ばれる。レベル１４は、非リーフレベルであり、ルートレベル１２も同様である。ツリーは、多くの非リーフレベルを有することが可能である。ｂツリーは、１つだけのレベルを有することがある（それゆえ、これはルートレベルであり、リーフレベルである）。各レベルが１つまたは複数のノード２１を有し、各ノード２１が１つまたは複数の要素１８を含むことができる。ルートレベル１２は、ルートノードと呼ばれ、単一のノードだけを有する。リーフレベル１６のノードはリーフノードと呼ばれ、非リーフレベルのノードは非リーフノードと呼ばれる。実際には、リーフレベルに格納された値は、アプリケーションによって探索することができる実際の値であり、非リーフレベルに格納された値は、実際の値がリーフレベルのどこに配置されているかを識別するのに使用される「インデックス値」である。（ただし、インデックス値と実際の値は、通常、同じドメインを有することを理解されたい。例えば、文字Ａ〜Ｚを格納するのにツリーが使用されている場合、リーフレベルと非リーフレベルの要素の両方が、Ａ〜Ｚの範囲の文字を格納するが、非リーフレベルにそのような文字を格納する目的は、通常、探索中の文字が非リーフレベルノードのどのサブツリーに収容されているかを識別するためである。）
【００２３】
例示的なツリー２００は、３つの非リーフノードおよび６つのリーフノードを有する。ノードは、１つまたは複数の要素１８を有することがある。明瞭にするために、ルートレベル１２におけるルートノードの中の１つの要素１８だけに要素１８とマークを付けている。要素は、ツリー内で何らかの位置順序に配置されることが可能な値を収容する。各要素１８は、図２に文字Ａ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ、Ｈ、Ｉ、Ｊ、Ｋ、およびＬで示す値を収容することができる。図２の例では、要素１８は、値なし要素であり（値が入っていないため）、ノード２１の左端の要素は、値あり要素である（値Ｇが入っているため）。ツリー構造は、値の編成を表しており、このため、そのような値が文字どおり一緒に格納される必要はなく、単にツリー構造２００と整合する形で論理的に関連付けられているだけであることを理解されたい。このように、ツリーに「含まれる」値または「格納されている」値という言い方は、ツリー構造に従って値が互いに関連付けられているか、または編成されているどのような状況をも表すものと理解されたい。
【００２４】
例示的なｂツリー２００は、値「Ｇ」を含む（レベル１２における）ルートノードから始まる。非リーフノードに格納された５つの値（Ｇ、Ｃ、Ｅ、Ｉ、およびＫ）と、リーフノードに格納された１２の値（Ａ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ、Ｈ、Ｉ、Ｊ、Ｋ、およびＬ）とが存在する。非リーフノードおよび値は、特定の値または位置を探す際にリーフノードに対するサーチを容易にするディレクトリとして使用される。ｂツリーを使用するほとんどのサーチアルゴリズムは、探索される値を見つけるためにツリーをリーフに至るまで下降することを要求するが、他のタイプのサーチ技術はｂツリーのすべてのレベルにおける値を利用して、マッチが見つかった場合、探索を完了し、リーフノードに到達する前に終了することができるようにすることができる。
【００２５】
Ｂツリーを使用して様々なアプリケーションについての位置アクセスを実行することができる。位置ベースの操作には、次の操作が含まれる。すなわち、指定された順序位置における値を探し出すこと、新しい値を挿入した際にその値が挿入された位置を獲得すること、および値を削除した際に値が削除された位置を獲得することである。指定された位置で値を探し出すことの例には、特定の順序位置で単一の項目（例えば、ソートされたセットの第ｎ番の項目）を探し出すこと、または多数の順序付けされた項目が入っているリストの中で項目のサブシーケンス（例えば、何らかの順序にソートされた多数の電子メールが入っているリストの中のｍからｎの番号が付けられた電子メール）を探し出すことが含まれる。図３は、大きな値のリスト２６から小さいグループの項目、グループ２２および２４が何らかのアプリケーション（例えば、電子メールアプリケーション）によってディスプレイ２８上に表示されることを示す図である。この例示的なアプリケーションは、ディスプレイ２８上に電子メールメッセージのリスト２６などの値リストを表示することを含む。例えば、リスト２６の中の項目のそれぞれが、電子メールメッセージの要約であることができ、グループ２２および２４がそれぞれ、ディスプレイウインドウに収まること電子メールメッセージの要約を収容することができる。このタイプのリストが、極めて大きい（例えば、１００００個の値より多い）ことも珍しくない。パフォーマンス上の悪影響を緩和し、利用されるメモリの量を少なくするため、リスト全体２６を一度にメモリにロードして表示することはしない。むしろ、リストの部分をメモリにロードして表示する。図３に示したとおり、ディスプレイ２８は、どの時点においてもリスト２６から４つの項目だけを表示する。この例では、リスト２６の４つの値だけが、一度にメモリに格納され、そして／または表示される。２つのグループの項目２２および２４により、ユーザが最初にグループ２２を見て、次にリスト２６を２項目だけ前にスクロールした場合にユーザが見ることができるものが示されている。最初、グループの項目２２が表示され、続いて、グループの項目２４が表示される。グループの項目２２は、位置０に関連する値Ａ、位置１に関連する値Ｂ、位置２に関連する値Ｃ、および位置３に関連する値Ｄを含む。グループの項目２４は、位置２に関連する値Ｃ、位置３に関連する値Ｄ、位置４に関連する値Ｅ、および位置５に関連する値Ｆを含む。位置アクセスを利用する前述のアプリケーションは、単に例示であり、位置アクセスを利用したアプリケーションの他のいくつかの例も想像できることを理解されたい。
【００２６】
図４は、本発明の例示的な実施形態によるリーフレベルカウント要素をからなるｂツリーを示す図である。これらのリーフレベルカウント要素は、図５に関連して以下に説明する技術を使用して、要素をその順序位置で識別するために使用することができる。リーフレベルカウント要素（例えば、３８および４０）の形で情報が基礎となるｂツリーデータ構造に格納される。リーフレベルカウント要素は、非リーフの各値あり要素の左右に配置される。（ツリーは、通常、論理的な左右の編成を有するものとみなされ、要素の「左」および「右」へのカウント要素の配置は、この論理的な左右の編成に対応しているものと理解されるべきである。つまり、本発明は、データの物理的な左右の編成を必要としない。）図４に示すとおり、左リーフカウント３８は、値あり要素３０（値Ｇ）に隣接して左側に位置するように示されている。右リーフレベルカウント要素４０は、値あり要素３０に隣接して右側に位置するように示されている。（本発明は、各値あり要素３０が左カウントおよび右カウントを有する限り、左カウントおよび右カウントが値あり要素に「隣接して」配置されることを必要としないことが理解されるであろう。）通常、リーフレベルカウント要素（左端のカウントおよび右端のカウント以外）は、ある値あり要素の左カウントとしても、別の値あり要素の右カウントとしても機能する。例えば、リーフレベルカウント４６は、値あり要素４３の右リーフレベルカウント要素としても、値あり要素４５の左リーフレベルカウント要素としても機能する。リーフレベルカウントは、他の様々なやり方で実施することもできる。
【００２７】
各リーフレベルカウント要素は、ノードのサブツリーの内の１つのリーフレベルにおけるデータ項目の総数を示す値を備える。詳細には、値あり要素の左カウントおよび右カウントがそれぞれ、ｎおよびｍである場合、その値あり要素のすぐ左側のサブツリーは、そのリーフレベルにおいてｎ個のデータ項目を収容し、その値あり要素のすぐ右側のサブツリーは、そのリーフレベルにおいてｍ個の要素を収容する。例えば、左リーフカウント３８は、ルートノード４４を有するサブツリー４２に対応する。また、左リーフカウント要素３８は、サブツリー４２のリーフレベルにおけるデータ項目（例えば、値あり要素）の数を示す値６を収容する。図４に示すとおり、サブツリー４２は、リーフレベルにおいて６つの値あり要素（Ａ、Ｂ、Ｃ、Ｄ、Ｅ、およびＦ）を有し、これは、左リーフカウント３８に配置された値と一致する。このサブツリーは、リーフレベルにおけるすべてのノードを含み、ｂツリーのリーフレベルに至るまで分岐するすべての要素を含んでいる。図４で見て取ることができるように、各リーフレベルカウント要素（「０」とマーク付けされたもの以外）が、それぞれのサブツリーに対応する。例えば、左リーフレベルカウント要素４１は、２つの値あり要素（値ＡおよびＢ）および２つの値なし要素からなるノードだけを収容するサブツリー４７をポイントする。図４では明瞭にするため、すべてのサブツリーにはサブツリーとしてのラベルを付けていない。
【００２８】
図５は、ｂツリーのリーフレベル上の所定の順序位置に配置された要素を特定するための例示的なプロセスの流れ図である。一般に、左リーフレベルカウント要素および右リーフレベルカウント要素は、ｂツリーを下降するのにどのパスを辿るかを決定するためと、現在位置の左側にどれだけの数の値が現れるかを判定するために用いられる。ｂツリーのリーフレベルに達すると、（ａ）現在のリーフノードの左側のリーフレベル値の数と、（ｂ）探索されている順序位置との差を使用して所定の位置を探し出す。ｂツリーは、通常、左から右にトラバース（ｔｒａｖｅｒｓｅ）されるが、図５に示したプロセスの向きを逆にして、プロセスを右から左に実行してもよいことを理解されたい。左から右への向きは、論理的であり、物理的ではないことをさらに想い起こされたい。このように、何をもって「左」および「右」とするかは、ツリーの設計者の定義による。（通常、ツリーは、論理的に「左」の値が、論理的に「右」の値に先行するように構成される。）図５に示したプロセスの以下の説明は、図４の例が含まれており、図４を参照してより容易に理解することができる。以下の省略形を図５で使用している。
【００２９】
ＰＰ−探索されるデータ項目の所定の順序位置
ＬＬ−左リーフカウント要素値
ＲＬ−右リーフカウント要素値
ＶＥ−値あり要素
【００３０】
ｂツリーのトラバースを開始する前に、所定の順序位置が範囲内にある、すなわち、ｂツリーのリーフレベルにおける値あり要素の数を越えていないことを確認することができる。オプションのステップ５０で、所定の位置の値がｂツリーのルートノードにあるリーフレベルカウント要素の値の合計より大きいかどうかが判定される。ｂツリーのルートノードのすべてのリーフレベルカウント要素の値の合計は、ｂツリーのリーフレベルの値あり要素の総数に等しいため、所定の位置がこの合計より大きい場合、その所定の順序位置は範囲外である。所定の順序位置がこの合計より大きい場合（ステップ５０）、サーチはステップ５４で終了することができ、所定の位置が範囲外であるという指示を与えることができる。ステップ６０で、スキップカウント（ＳｋｉｐＣｏｕｎｔ）というカウンタが初期化される。このカウンタは、ゼロなどの適切な値に初期化することができる。スキップカウントは、ｂツリーのトラバース中にスキップされたリーフの値あり要素（すなわち、現在のノードの左側にあることが分かっている要素）の値を累計するカウンタである。ｂツリーのリーフレベルに到達すると、この累計値を使用して所定の位置を探し出す。
【００３１】
ｂツリーのルートノードの左端の値あり要素（例えば、図４の値あり要素３０）から開始して、ステップ５２で、ルートノードが左から右に調べられる。所定の位置が、現在の値あり要素（例えば、３０）に隣接して右側に位置する左リーフカウント要素（例えば、値あり要素３０）の値（例えば、６）と現在のスキップカウント値との合計と比較される。所定の位置の順序番号がこの合計以下である場合、ステップ７６で、左リーフレベルカウント要素（例えば、３８）によって参照されるノードまでｂツリーをトラバースする。このノードは、ｂツリーの次に低いレベルにおいて見出される。ステップ６６で、現在のレベルがリーフレベルであるかどうかが判定される。現在のレベルがリーフレベルである場合、ステップ６８で、所定の位置からスキップカウント値を引いた差が算出される。探索される所定の位置は、リーフレベルにおける左端の値あり要素から開始して、この差に等しい数の値あり要素だけ右に移動することによって見出される。ステップ６６で、現在のレベルがリーフレベルではない場合、現在のレベルの左端の値あり要素からトラバースプロセスが再び開始される（ステップ５２）。
【００３２】
ステップ５８に戻ると、所定の位置が左リーフレベルカウント要素値とカウンタスキップカウントの合計より大きいと判定された場合、ステップ５６で、左リーフレベルカウント要素の値だけスキップカウントが増分される。このように左から右に各左リーフレベルカウント要素と遭遇するにつれ、スキップカウントは、遭遇した左リーフレベルカウント要素値の移動合計（ｒｕｎｎｉｎｇ  ｓｕｍ）（累積値）を保持し、これによりツリーの特定のブランチをトラバースすることによって「スキップ」されたリーフレベル値要素の総数が表される。ステップ６２で、所定の位置が右リーフレベルカウント要素値にスキップカウント値を足した合計以下であるかどうかが判定される。この合計以下である場合、ステップ６４で、右リーフレベルカウント要素によって参照されるノードまでｂツリーをトラバースする。ステップ６６で、現在のレベルがリーフレベルであるかどうかが判定される。このステップ（６６）以降、プロセスは、前述したとおりである。ステップ６２で、所定の位置が右リーフレベルカウント要素値より大きい場合、ステップ７３で、現在の右リーフカウント要素の値だけスキップカウントが増分され、ステップ７４で、次の値あり要素まで右から左に現在のノードレベルをトラバースする。プロセスは、ステップ６２に進み、前述したとおり継続される。
【００３３】
サーチプロセス例を図４と５の両方を参照して以下に説明する。この例では、探索されているデータは、ｂツリーのリーフに格納されたすべてのソートされたデータの第１０番の順序位置に現れるものと想定し、これは、図４の値Ｊに相当する。最初、値１０が、６＋６の合計と比較される（ステップ５０）。６＋６＝１２であり、１０より大きいため、カウンタ、スキップカウントが、０に初期化され、プロセスは、ステップ５２に進み、そこでサーチプロセスが値あり要素３０から開始される。ステップ５８で、値１０が６（すなわち、値あり要素３０の左側に現れるカウント）と比較される。１０は６より大きいので、プロセスは、ステップ５６に進み、カウンタ、スキップカウントが、６だけ増分され、スキップカウントが６に等しくなる。次に、ステップ６２で、値１０が値６＋６と比較される。１０は１２より小さいため、プロセスは、ステップ６４に進む。次に、リーフレベルカウント４０によって参照されるノードから開始してｂツリーがトラバースされ（ステップ６４）、このノードは、非リーフレベル３４における右端のノード（値ＩおよびＫが入っているノード）である。現在のレベル（レベル３４）はリーフレベルではないため（ステップ６６）、プロセスは、ステップ５２に進む。値Ｉが入っている値あり要素から開始して（ステップ５２）、値１０が、値２＋６＝８と比較される（ステップ５８）。１０は８より大きいため、ステップ５６で、スキップカウントが、６＋２＝８に増分される。ステップ６２で、値１０が、２（右リーフレベルカウント値）＋８（スキップカウントの現在値）の合計と比較される。１０（合計）は１０（探索される所定の位置の順序番号）と等しいため、プロセスは、ステップ６４に進み、リーフレベル３６におけるリーフノード（ＩおよびＪが入っている）から開始してｂツリーがトラバースされる。これはリーフレベルであるため（ステップ６６）、スキップカウントの値（８）が、所定の位置の値（１０）から引かれて、２がもたらされる（ステップ６８）。ステップ６８によれば、サーチプロセスは、次に、現在のリーフノードの中の左端の値あり要素（値Ｉ）に進み、計算された差の数（２）を左から右にカウントする。これにより、値Ｊが入っている値あり要素にある所定の位置が探し出されることになる。
【００３４】
別の実施形態では、本明細書で説明するｂツリーのルートノードに左リーフカウント要素および右リーフカウント要素が入っているｂツリーにより、ｂツリーのリーフレベルにある値あり要素の総数を算出する能力が提供される。これは、ｂツリーのルートノードに位置する左リーフレベルカウント要素の値と右リーフレベルカウント要素の値とを合計することによって達成される。
【００３５】
前述したとおり、位置ベースの操作には、指定された位置における値を探し出すこと、新しい値が挿入された際にその値が挿入された位置を獲得すること、値が削除された際にその値が削除された位置を獲得することが含まれる。値あり要素が挿入された場合、および／または削除された場合、すべての適切なレベルにおいて適切な左リーフレベルカウント要素および右リーフレベルカウント要素の中の値を更新することによってｂツリーが更新される。リーフレベルカウント要素値の実際の変更は、ｂツリーを更新するための任意の適切な手段によって達成することができる。リーフレベルカウント要素値は、ｂツリーの要素値が更新されるのと同時に更新することができる。
【００３６】
値あり要素が追加され、そして／または削除されるのにつれ、ｂツリーが拡大し、そして／または縮小することがある。ｂツリーは、通常、レベルを分割し、より多くのノードを有することにより拡大する。ｂツリーは、通常、ノードを結合することにより縮小する。ｂツリーにおけるノードは、ノード中の値の数が指定された閾値（多くの場合、分割閾値と呼ばれる）を超えた場合に分割される。ｂツリーにおけるノードは、ノード中の値の数が指定された閾値（多くの場合、縮小閾値と呼ばれる）を下回った場合に縮小される。通常、ノードがその縮小閾値に達した場合、ノードをそのノードの左または右の兄弟と結合しようとする試みがまず行われる。しかし、ノードを兄弟と結合することができない場合、値が左または右の兄弟から再配分される。挿入された要素および削除された要素を有するｂツリーの例を以下に説明する。これらの例には、リーフレベルのルートノードを分割すること、非リーフレベルのルートノードを分割すること、リーフレベルノードを左の兄弟ノードと結合すること、非リーフレベルノードを左の兄弟ノードと結合すること、リーフレベルノードから値を再配分すること、および非リーフレベルノードから値を再配分することが含まれる。実際には、ｂツリーを分割したり、縮小したりするためのアルゴリズムは、使用されるｂツリー構造の特定のタイプに応じて多種多様である。
【００３７】
図６は、リーフレベルルートノード６９が、値「Ｅ」を有する値あり要素を挿入して、リーフレベルノード７０および７１、ならびに非リーフレベルノード７２をもたらすように分割されることを示す図である。値「Ｅ」を挿入しようとする試みがいっぱいのノード６９に対して行われる。図６に示すとおり、２つの新たなリーフノード７０および７１が割り振られ、これら２つの新たなリーフノード７０および７１の間で均等に値が配分される。中央値「Ｃ」は、新たなルートノード７２の中に昇格され、左リーフカウント６１の値および右リーフカウント６３の値が、それに応じて更新されて、「Ｃ」の左側に２つのリーフレベル値と、「Ｃ」の右側に３つのリーフレベル値とがあることが反映される（リーフレベル値「Ｃ」は、ルートノードの「Ｃ」の右側にあるサブツリーに格納され、慣例により、インデックス以上である値は、右側に格納される）。図６に示すとおり、更新済みのｂツリー構造は、リーフノードにある値の数を示す左カウント値および右カウント値を備え、各左／右のリーフカウント値は、サブツリーのルートノードを表すか、または示す。例えば、ノード７２は２および３のリーフカウント値を備え、それぞれＡＢおよびＣＤＥの値あり要素を有するノードを示している。
【００３８】
図７は、非リーフレベルルートノード７５が、ｂツリーのリーフレベルに値「Ｍ」を挿入するために２つのノード７６および７７に分割されることを示す図である。図７に示したｂツリーは、最初、２レベルの深さである。ルートノード７５はいっぱいであり、「Ｍ」という新しい値が挿入されることになるリーフノード７８もいっぱいである。このｂツリーに「Ｍ」を挿入することにより、２つのノード分割がもたらされる。ルートノード７５がノード７６および７７に分割され、ノード７８がノード７９および８０に分割される。いっぱいのルートノード７５からの値は、２つの新しいノード７６と７７の間で均等に配分され、ノード７６および７７はそれぞれ、この時点で、「Ｃ」、「Ｅ」、および「Ｉ」、「Ｋ」を収容する。値「Ｇ」は、新しいルートノード８１の中に昇格される。ルートノード８１に格納されたリーフレベルカウント要素値は、リーフノードにある値の数を表す。「Ｍ」が挿入されることになる所望のリーフノードは、いっぱいである。新しいノード８０が作成される。値「Ｉ」、「Ｊ」、「Ｋ」、「Ｌ」、および「Ｍ」が、２つのノード７９および８０に均等に配分される。中央値「Ｋ」は、親ノード７７の中に昇格され、親ノード７７のリーフカウントが、例えば、図１２に関連して以下に説明するプロセスにより、この分割を反映するように更新される。図７に示すとおり、更新済みｂツリー構造は、リーフノードにある値の数を示す左リーフカウント値および右リーフカウント値を備え、各左／右のリーフカウント値は、サブツリーのルートノードを表すか、または示す。例えば、ノード７６は２、２、および２のリーフカウント値を備え、それぞれがＡＢ、ＣＤ、およびＥＦの２つの値を有する要素を有するノードを示している。
【００３９】
図８は、リーフノード８２と８３をノード８２に結合して、それに応じてリーフレベルカウント要素値を更新することを示す図である。ノードを結合することは、ノードの値をそのノードの左または右の兄弟に移動することができる場合（例えば、左または右の兄弟に十分な空き空間が存在する場合）、適切である。以下の例は、ノードを左の兄弟ノードと結合することを表現している。ノードを右の兄弟ノードと結合することは、ノードを左の兄弟ノードと結合することと同様であり、以下に説明することはしない。図８に示すとおり、ノード８３を右の兄弟と結合することはできない。というのは、右の兄弟にはスペースが全くないからである。値「Ｃ」を、左の兄弟ノード８２の中に移動し、そしてノード８３を削除する。親ノードの中のそのノード（８３）の参照項目が削除される（例えば、値「Ｃ」を有する項目が親ノードから削除される）。最後に、ノード８４の左リーフカウントおよび右リーフカウントが、例えば、図１２で以下に説明するプロセスによって、更新される。図８に示すとおり、更新済みのｂツリー構造は、リーフノードにある値の数を示す左リーフカウント値および右リーフカウント値を備え、各左／右のリーフカウント値は、サブツリーのルートノードを表すか、または示す。例えば、ノード８４は２および４のリーフカウント値を備え、それぞれがＡＢＣの値を有する要素を有するノード、およびＥＦＧＨの値を有する要素を有するノードを示している。
【００４０】
図９は、非リーフノード８６をその左の兄弟８５と結合して結合ノード８７を形成することを示す図である。値「Ｉ」が入っているノード８６は、右の兄弟を有さず、そのため、左の兄弟ノード８５と結合される。値「Ｇ」が、ルートノードから左の兄弟ノード８５の中に降格され、値「Ｉ」が左の兄弟ノード８５に付加され、「Ｇ」、「Ｈ」、および「Ｉ」、「Ｊ」を含む子ノードに対するポインタが、左の兄弟ノード８５の中に移動される。値「Ｇ」がルートノードから削除されたので、ルートノードは、この時点で空であり、削除される。元の左の兄弟ノード８５は、ツリーの新しいルートノード８７になる。ルートをつぶすことは、ルートノードにもはや値が存在しない場合に適切である。図９に示すとおり、更新済みｂツリー構造は、リーフノードにある値の数を示す左リーフカウント値および右リーフカウント値を備え、各左／右のリーフカウント値は、サブツリーのルートノードを表すか、または示す。例えば、ノード８７は２、２、２、２、および２というリーフカウント値を備え、それぞれが値ＡＢを有する要素を有するノード、値ＣＤを有する要素を有するノード、値ＥＦを有する要素を有するノード、値ＧＨを有する要素を有するノード、および値ＩＪを有する要素を有するノードを示している。
【００４１】
ノードの値を再配分する２つの例を以下に説明する。ノードとノードの兄弟の間で値を再配分する多くのやり方が存在する。左の兄弟だけからいくつかの値を移動するか、または右の兄弟だけからいくつかの値を移動するか、あるいは両方の兄弟から値を移動することができる。以下の２つの例は、兄弟からの１つの値の再配分を説明し、提示されるプロセスは、複数の値の配分を実行するように一般化することができるものと理解されるであろう。
【００４２】
図１０は、リーフレベルノードに値を再配分することを示す図である。リーフレベルノード８８は、１つの値「Ｅ」を有する。ノード８８がその縮小閾値（例えば、１つの値）に達したものと想定し、ノード８８が縮小される。ノード８８の兄弟は両方ともいっぱいであるため、ノード兄弟の一方から値が再配分される。この例では、左の兄弟と値が共有されるが、それが右の兄弟であることも同じく容易である。値を再配分するために、値「Ｄ」が、左の兄弟からシフトされ、値「Ｅ」を収容するノードの中に挿入される。次に、親ノードの値が値「Ｄ」により更新されて、値の正しいシフトを反映する。これにより、親ノードがリーフノードの中の正しいソート順を反映するようになる。最後に、親／ルートノードのリーフカウントが更新される。図１０に示すとおり、更新済みｂツリー構造は、リーフノードにある値の数を示す左リーフカウント値および右リーフカウント値を備え、各左／右のリーフカウント値は、サブツリーのルートノードを表すか、または示す。例えば、再分配済みのｂツリーのルートノードは３、２、および４というリーフカウント値を備え、それぞれが値ＡＢＣを有する要素を有するノード、値ＤＥを有する要素を有するノード、および値ＦＧＨＩを有する要素を有するノードを示している。
【００４３】
図１１は、非リーフレベルノードから値を再配分することを示す図である。非リーフレベルノード８９が、１つの値「Ｍ」を有する。このノード８９がその縮小閾値に達しているものと想定し、ノード８９は左の兄弟と結合することができず、右の兄弟が存在しないため、左の非リーフ兄弟から値が再配分される。値「Ｋ」が、ルートノードから「Ｍ」を収容する非リーフノード８９の中に降格される。次に、左の兄弟の最後の値「Ｉ」が、ルートノードの中に昇格される。最後に、「Ｋ」および「Ｍ」を収容するノードの中で子ノードポインタが更新され、影響を受けるノードのすべてにおいてリーフカウントのすべてが更新される。図１１に示すとおり、更新済みｂツリー構造は、リーフノードにある値の数を示す左リーフカウント値および右リーフカウント値を備え、各左／右のリーフカウント値は、サブツリーのルートノードを表すか、または示す。例えば、ノード１１０１は２、２、２、および２というリーフカウント値を備え、それぞれが値ＡＢを有する要素を有するノード、値ＣＤを有する要素を有するノード、値ＥＦを有する要素を有するノード、および値ＧＨを有する要素を有するノードを示している。
【００４４】
図１２は、ｂツリーにおけるリーフレベルカウント要素の中の値を更新するための例示的なプロセスの流れ図である。図１２に示したプロセスは、値あり要素が既に挿入されたか、または削除されており、前述したように左カウントおよび右カウントを収容するｂツリーに適用される。ステップ９０で、値あり要素が追加されるか、または削除される。そして、ステップ９１で、すぐ上の親リーフレベルカウント要素に戻るようにｂツリーがトラバースされる。つまり、プロセスは、値あり要素が削除されたか、または追加された現在のノードを参照するリーフレベルカウント要素に進む。ステップ９２で、値あり要素が追加されたか、あるいは削除されたかが判定される。値あり要素が追加されている場合、ステップ９３で、現在のリーフカウントの値を１だけ増分する。ステップ９３および９４で参照される現在のリーフカウントは、ステップ９１で参照されるすぐ上の親リーフレベルカウント要素であることに留意されたい。値あり要素が削除されている場合、ステップ９４で、現在のリーフカウント要素を１だけ減分する。次に、ステップ９５で、上位のノードが存在するかどうかが判定される。つまり、現在のリーフレベルカウント要素が、親リーフレベルカウント要素によって参照されているかどうかが判定される。参照されている場合、プロセスは、ステップ９１に進み、前述したように実行される。上位のノードが存在しない場合、プロセスは、ステップ９６で完了する。
【００４５】
本明細書で説明したｂツリーの位置アクセスのための方法は、コンピュータに実装したプロセス、およびそのプロセスを実施するためのシステムの形態で実現することができる。また、本明細書で説明したｂツリーの位置アクセスのための方法は、フロッピー（登録商標）ディスケット、読み取り専用メモリ（ＲＯＭ）、ＣＤ−ＲＯＭ、ハードドライブ、高密度ディスク、または任意の他のコンピュータ可読記憶媒体などの実体のあるメディアに実施されたコンピュータプログラムコードの形態で実現してもよく、このコンピュータプログラムコードがコンピュータにロードされ、実行されると、コンピュータが本発明を実施するためのシステムとなる。また、本明細書で説明したｂツリーの位置アクセスのための方法は、例えば、記憶媒体に格納されるか、コンピュータにロードされ、そして／または実行されるか、あるいは電気配線もしくはケーブル配線、光ファイバ、または電磁放射を介してなど、何らかの伝送媒体を介して伝送されるかに関わらず、コンピュータプログラムコードの形態で実現されてもよく、このコンピュータプログラムコードがコンピュータにロードされ、実行されると、コンピュータが本発明を実施するためのシステムとなる。汎用プロセッサ上に実装される場合、コンピュータプログラムコードセグメントによりプロセッサが設定構成されて、特定の論理回路を作成する。
【００４６】
本明細書で説明した様々な技術は、ハードウェアまたはソフトウェアに関連して実装することができ、適切な場合、ハードウェアとソフトウェアの組み合わせで実装することができる。このように、本発明の方法および装置、または本発明のいくつかの態様または部分は、フロッピー（登録商標）ディスケット、ＣＤ−ＲＯＭ、ハードドライブ、または任意の他のコンピュータ可読記憶媒体などの実体のあるメディアに実施されたプログラムコード（すなわち、命令）の形態をとることが可能であり、このプログラムコードがコンピュータなどのマシンにロードされ、実行されると、そのマシンが本発明を実施するための装置となる。プログラム可能なコンピュータ上のプログラムコード実行の場合、コンピューティングデバイスは、一般に、プロセッサ、プロセッサによって読み取り可能な記憶媒体（揮発性および不揮発性のメモリおよび／または記憶要素を含む）、少なくとも１つの入力デバイス、および少なくとも１つの出力デバイスを含む。例えば、データ処理ＡＰＩなどの使用を通じて、本発明の信号処理サービスを利用することができる１つまたは複数のプログラムが、好ましくは、ハイレベルの手続きプログラミング言語またはオブジェクト指向プログラミング言語で実装されてコンピュータと通信する。ただし、プログラムは、所望される場合、アセンブリ言語または機械語で実装することもできる。いずれにしても、言語は、コンパイルされた言語、またはインタープリートされた言語である場合があり、ハードウェア実装と組み合わせる場合がある。
【００４７】
また、本発明の方法および装置は、電気配線もしくはケーブル配線、光ファイバ、または任意の他の形態の伝送を介するなど、何らかの伝送媒体を介して伝送されるプログラムコードの形態で実現される通信を介して実施することもでき、このプログラムコードが、ＥＰＲＯＭ、ゲートアレイ、プログラマブル論理デバイス（ＰＬＤ）、クライアントコンピュータ、ビデオレコーダもしくは同類のもの、または例示的な実施形態で前述した信号処理能力を有する受信側マシンなどのマシンによって受信され、ロードされ、実行されると、本発明を実施するための装置となる。汎用プロセッサ上に実装された場合、プログラムコードはプロセッサと一体になって、本発明の機能を呼び出すように動作する固有の装置を提供する。さらに、本発明に関連して使用されるいかなる記憶技術も、常に、ハードウェアとソフトウェアの組み合わせである。
【００４８】
本発明の実施形態を様々な図の好ましい実施形態に関連して説明してきたが、本発明から逸脱することなく、本発明と同じ機能を実行するために、他の同様の実施形態を使用したり、または説明した実施形態に変更または追加したりすることが可能であることが理解されるべきである。さらに、特に数多くの無線でネットワーク化されたデバイスが普及しつづけている中で、ハンドヘルドデバイスのオペレーティングシステム、およびその他のアプリケーション特有のオペレーティングシステムを含め、様々なコンピュータプラットフォームが企図されていることを強調しておかなければならない。それゆえ、本発明は、いずれの単独の実施形態に限定されるものではなく、むしろ添付の特許請求の範囲の広がりおよび範囲において解釈されなければならない。
【図面の簡単な説明】
【００４９】
【図１】本発明の一例によるｂツリーを使用した位置アクセスのための方法およびシステムを実施することができる適切なコンピューティングシステム環境の一例を示す図である。
【図２】例示的なｂツリー構造を示す図である。
【図３】本発明の例示的な実施形態によるｂツリーの位置アクセスを利用して比較的小さいグループの項目が選択される比較的大きい項目リストを示す図である。
【図４】本発明の例示的な実施形態による左および右のリーフレベルカウント要素からなるｂツリーの図である。
【図５】本発明の例示的な実施形態によるｂツリーの所定の位置に配置された要素を探し出すための例示的なプロセスの流れ図である。
【図６】本発明の例示的な実施形態により、リーフレベルのルートノードを分割して値あり要素を挿入し、リーフレベルカウント要素を更新することを示す図である。
【図７】本発明の例示的な実施形態により、非リーフレベルのルートノードを２つのノードに分割して値を挿入し、リーフレベルカウント要素を更新することを示す図である。
【図８】本発明の例示的な実施形態により、リーフノードを結合し、リーフレベルカウント要素値を更新することを示す図である。
【図９】本発明の例示的な実施形態により、非リーフノードをその左の兄弟と結合して結合ノードを形成し、リーフレベルカウント要素を更新することを示す図である。
【図１０】本発明の一例により、リーフレベルノードに対して値を再配分し、リーフレベルカウント要素を更新することを示す図である。
【図１１】本発明の例示的な実施形態により、非リーフレベルノードからの値を再配分し、リーフレベルカウント要素を更新することを示す図である。
【図１２】本発明の例示的な実施形態により、ｂツリーのリーフレベルカウント要素の中の値を更新することについての流れ図である。
【符号の説明】
【００５０】
１２  ルートレベル
１４、３４  レベル
１６、３６  リーフレベル
１８  要素
２１、６９  ノード
２２、２４  グループの項目
２６  リスト
２８  ディスプレイ
３０、４３、４５  値あり要素
３８、４１、６１  左リーフカウント
４０、４６、６３  右リーフカウント
４２、４７  サブツリー
４４、７５  ルートノード
７０、７１、７８、８２、８３  リーフノード
７２、８１  ルートノード
７６、７７、７９、８０、８４、８５、８６、８７、８８、８９、１１０１  ノード
２００  ｂツリー
【図１】
2004362574.tif 000003
【図２】
2004362574.tif 000004
【図３】
2004362574.tif 000005
【図４】
2004362574.tif 000006
【図５】
2004362574.tif 000007
【図６】
2004362574.tif 000008
【図７】
2004362574.tif 000009
【図８】
2004362574.tif 000010
【図９】
2004362574.tif 000011
【図１０】
2004362574.tif 000012
【図１１】
2004362574.tif 000013
【図１２】
2004362574.tif 000014