本発明の実施形態を、以下に図面に従って説明する。以下の図を通して、特に断らない限り、同一の符号は同一の対象を指す。本発明の実施形態は、本発明の好適な態様を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。
本発明の実施態様において使用されうる「コンピュータ」は、予め決められた複数のビット幅のデータに対して操作を行う命令を使用してツリーの検索を行う処理を実行可能なコンピュータであれば特に限定されない。当該コンピュータは例えば、例えば、デスクトップ・コンピュータ、ノート・コンピュータ、一体型パソコン若しくはタブレット端末、又は、サーバ・コンピュータでありうる。
本発明の実施態様において、「予め決められた複数のビット幅のデータに対して操作を行う命令」とは、予め決められたビット幅の複数のデータに対して同じ処理を1命令で適用可能な命令である。当該命令は例えば、予め決められたビット幅の複数のデータに対して同じ処理を1命令で同時に適用可能であってもよく又は同時に適用可能でない命令であってもよい。予め決められたビット幅の複数のデータに対して同じ処理を1命令で同時に適用可能な命令は例えば、SIMD命令である。SIMD命令には、SSEやNEONと呼ばれるSIMD命令も含まれる。
本発明の実施態様において、「キーの値を表現可能な最小のビット幅ビット幅」は例えば、8ビット幅、16ビット幅、32ビット幅、64ビット幅、128ビット幅、又は、256ビット幅である。
本発明の実施態様において、「ツリー」(木とも表現される)とは、複数の子ノードと当該子ノードそれぞれに関連付けられたキーを持つ中間ノードを有するツリー構造であればよい。当該ツリーは例えば、B+−ツリー、B−ツリー、B*ツリー、2−3ツリー、2−3−4ツリーである。
B+−ツリー、B−ツリー、B*ツリー、2−3ツリー、2−3−4ツリーはいずれも、キーを指定することで挿入、検索、又は削除が行えるツリー構造の一種である。
B+−ツリーは、動的な階層型インデックスであり、各インデックスセグメント(「ブロック」とも呼ばれ、ツリー構造におけるノードに相当する)にはキー数の上限と下限がある。B+−ツリーはB−ツリーとは異なり、全てのレコードは木の最下層(葉ノード)に格納され、中間ノード(内部ノード)にはキーの代表のみが格納される。B+−ツリーでは、中間ノードが複数のキーと子ノードペアを持ち、葉ノードが検索されるキーの値を持つ。
B−ツリーは、単純な2分木に比べて、一つのブロックに複数のデータエントリを格納するので、データエントリの追加があっても木構造の形の変化が波及する範囲を狭くできる。
B*ツリーは、B−ツリーから派生した木構造の一種であり、根ノード以外のノードは、B−ツリーのように1/2ではなく、2/3まで埋まった状態になる。
図1は、本発明の実施態様において使用されうるコンピュータの一例を示した図である。
コンピュータ(101)は、1つ又は複数のCPU(102)とメイン・メモリ(103)とを備えており、これらはバス(104)に接続されている。CPU(102)は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものである。当該CPU(102)は例えば、インテル社のCore(商標) iシリーズ、Core(商標)シリーズ、Atom(商標)シリーズ、Xeon(登録商標)シリーズ、Pentium(登録商標)シリーズ若しくはCeleron(登録商標)シリーズ、AMD(Advanced Micro Devices)社のAシリーズ、Phenom(商標)シリーズ、Athlon(商標)シリーズ、Turion(登録商標)シリーズ若しくはSempron(商標)、又は、インターナショナル・ビジネス・マシーンズ・コーポレーションのPower(商標)シリーズでありうる。
バス(104)には、ディスプレイ・コントローラ(105)を介して、ディスプレイ(106)、例えば液晶ディスプレイ(LCD)が接続されうる。また、液晶ディスプレイ(LCD)は例えば、タッチパネル・ディスプレイ又はフローティング・タッチ・ディスプレイであてもよい。ディスプレイ(106)は、コンピュータ(101)上で動作中のソフトウェア(例えば、本発明の実施態様に従うコンピュータ・プログラム又は当該コンピュータ(101)上で動作中の各種コンピュータ・プログラム)が稼働することによって表示されるオブジェクトを、適当なグラフィック・インタフェースで表示するために使用されうる。
バス(104)には任意的に、例えばSATA又はIDEコントローラ(107)を介して、ディスク(108)、例えばハードディスク又はソリッド・ステート・ドライブ(SSD)が接続されうる。
バス(104)には任意的に、例えばSATA又はIDEコントローラ(107)を介して、ドライブ(109)、例えばCD、DVD又はBDドライブが接続されうる。
バス(104)には、周辺装置コントローラ(110)を介して、例えばキーボード・マウス・コントローラ又はUSBバスを介して、任意的に、キーボード(111)及びマウス(112)が接続されうる。
ディスク(108)には、オペレーティング・システム、例えばWindows(登録商標),Mac OS(登録商標) X,Linux(登録商標),Android(登録商標),iOS、J2EEなどのJava(登録商標)処理環境、Java(登録商標)アプリケーション、Java(登録商標)仮想マシン(VM)、Java(登録商標)実行時(JIT)コンパイラを提供するプログラム、本発明の実施態様に従うコンピュータ・プログラム、及びその他のプログラム、並びにデータが、メイン・メモリ(103)にロード可能なように記憶されうる。
ディスク(108)は、コンピュータ(101)内に内蔵されていてもよく、当該コンピュータ(101)がアクセス可能なようにケーブルを介して接続されていてもよく、又は、当該コンピュータ(101)がアクセス可能なように有線又は無線ネットワークを介して接続されていてもよい。
ドライブ(109)は、必要に応じて、CD−ROM、DVD−ROM又はBDからプログラム、例えばオペレーティング・システム、アプリケーション又は本発明の実施態様に従うコンピュータ・プログラムをディスク(108)にインストールするために使用されうる。
通信インタフェース(114)は、例えばイーサネット(登録商標)・プロトコルに従う。通信インタフェース(114)は、通信コントローラ(113)を介してバス(104)に接続され、コンピュータ(101)を通信回線(115)に有線又は無線接続する役割を担い、コンピュータ(101)のオペレーティング・システムの通信機能のTCP/IP通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は例えば、無線LAN接続規格に基づく無線LAN環境、IEEE802.11a/b/g/nなどのWi−Fi無線LAN環境、又は携帯電話網環境(例えば、3G又は4G環境)でありうる。
下記図2、並びに下記図3A〜図3Cそれぞれにおいて、本発明の実施態様に従う検索手法において使用するために構築されたツリー構造の例を示す。本発明の実施態様に従う検索手法には2態様あり、以下において、検索手法1及び検索手法2という。図2は上記検索手法1において使用するために構築されたツリー構造(201)を示したものであり、図3A〜図3Cそれぞれは上記検索手法2において使用するために構築されたツリー構造(301,302及び303)を示したものである。
本発明の実施態様に従う検索手法1において使用するために構築されたツリー構造(201)において、或る中間ノードAは、当該中間ノードAが属するグループと異なるグループ(すなわち、当該中間ノードAが属するグループのビット幅よりも小さい又は大きいビット幅のキーを持つグループ)の中間ノードBを子ノードとして有する場合がある。上記検索手法1は、上記ツリー構造におけるノード決定操作でキーを比較する際に、子ノードを辿って、与えられたキー値とノードが持つキー値とを比較する際に、当該ノードが属するグループを調べて、当該ノードが持つキーのグループ(すなわち、当該キーが持つキーの値の範囲)に応じた、命令レベル並列度をより適切に利用できるSIMD比較命令を用いて比較を行うことを可能にする手法である。
本発明の実施態様に従う検索手法2において使用するために構築されたツリー構造(301,302及び303)において、或る中間ノードAは、当該中間ノードAが属するグループと同じグループ(すなわち、当該中間ノードAが属するグループのビット幅と同じビット幅のキーを持つグループ)の中間ノードBだけを子ノードとして有することが保証されている。
図2は、本発明の実施態様に従う検索手法1において使用するために構築されたツリー構造の例を示した図である。
ツリー(201)は、根ノード(211)、中間ノード(212〜216)、及び、葉ノード(221〜231)を有するとする。
根ノード(211)はツリー(201)の頂点にあるノードであり、従って、根ノード(211)は親ノードを持たない。根ノード(211)は、エントリとして、複数(図示の例では、4個)のキーを持つことができるとする。根ノード(211)は、中間ノード(212〜216)と直接的に又は間接的にエッジによって接続されている。根ノード(211)の各エントリは、当該根ノード(211)と直接的にエッジによって接続されている中間ノード(212、213、214及び215)それぞれの左端にあるエントリ内のキー値を持つ。
中間ノード(212〜216)は子ノードを持つノードであり、且つ、根ノード(211)及び葉ノード(221〜231)以外のノードである。中間ノード(212〜216)はそれぞれ、エントリとして、1又は複数個(図示の例では、4個)のキーを持つことができるとする。中間ノード(212〜216)はそれぞれ、根ノード(211)及び葉ノード(221〜231)それぞれと直接的に又は間接的にエッジによって接続されている。中間ノードは内部ノードとも呼ばれる。
葉ノード(221〜231)は、ツリー(201)の最底辺にあるノードであり、従って、葉ノード(221〜231)は子ノードを持たない。葉ノード(221〜231)はそれぞれ、エントリとして、1又は複数個(図示の例では、2個)のキーを持つことができるとする。また、葉ノード(221〜231)にデータが格納されている。
根ノード(211)及び中間ノード(212〜216)はそれぞれ、キーの値を表現可能な最小のビット幅を有するグループとして、下記3つのグループのノードに分類される:
(1)32ビット幅以下のキーを持つノード(すなわち、全てのビット幅のキーを持ちうる);
(2)16ビット幅以下のキーを持つノード;及び、
(3)8ビット幅のキーだけを持つノード。
なお、図2に示すツリー(201)の例では3つのグループのノードに分類する場合を示したが、キーの値を表現可能な最小のビット幅に応じて、その他の数のグループに例えば、4つのグループ(64ビット幅以下のキーを持つノード;32ビット幅以下のキーを持つノード;16ビット幅以下のキーを持つノード;及び、8ビット幅のキーだけを持つノード)、5つのグループ(128ビット幅以下のキーを持つノード;64ビット幅以下のキーを持つノード;32ビット幅以下のキーを持つノード;16ビット幅以下のキーを持つノード;及び、8ビット幅のキーだけを持つノード)、又は、6つのグループ(256ビット幅以下のキーを持つノード;128ビット幅以下のキーを持つノード;64ビット幅以下のキーを持つノード;32ビット幅以下のキーを持つノード;16ビット幅以下のキーを持つノード;及び、8ビット幅のキーだけを持つノード)の各ノードに分類することも可能である。
(1)32ビット幅以下のキーを持つノードは、32ビット幅のキー、並びに任意的に、16ビット幅のキー及び/又は8ビット幅のキーを有しうる。ツリー(201)のうち、32ビット幅以下のキーを持つノードは、根ノード(211)及び中間ノード(215)である。根ノード(211)は、32ビット幅のキー(70000)、16ビット幅のキー(500)、及び8ビット幅のキー(0,50)を有している。中間ノード(215)は、32ビット幅のキー(70000,71000,80000)だけを有している。
(2)16ビット幅以下のキーを持つノードは、16ビット幅のキー、及び任意的に、8ビット幅のキーを有しうる。ツリー(201)のうち、16ビット幅以下のキーを持つノードは、中間ノード(213)及び中間ノード(214)である。中間ノード(213)は、16ビット幅のキー(400)、及び8ビット幅のキー(50)を有している。中間ノード(214)は、16ビット幅のキー(500,510)だけを有している。
(3)8ビット幅のキーだけを持つノードは、ツリー(201)のうち、中間ノード(212)及び中間ノード(216)である。中間ノード(212)は、8ビット幅のキー(0,10,20)だけを有している。中間ノード(216)は、8ビット幅のキー(50,60)だけを有している。
ツリー(201)中、中間ノード(213)は16ビット幅以下のキーを持つノードであるが、その子ノードとして中間ノード(216)を有しており、当該中間ノード(216)は、8ビット幅のキーだけを持つノードである。すなわち、本発明の実施態様に従う検索手法1において使用するために構築されたツリー構造において、或る中間ノードAは、当該中間ノードAが属するグループと異なるグループ(すなわち、当該中間ノードAが属するグループのビット幅よりも小さい又は大きいビット幅のキーを持つグループ)の中間ノードBを子ノードとして有しうる。
ツリー(201)において、データを検索する場合には、(1)32ビット幅以下のキーを持つノード、(2)16ビット幅以下のキーを持つノード、及び(3)8ビット幅のキーだけを持つノード毎に、キー幅(32ビット幅、16ビット幅、又は8ビット幅)に応じたSIMD命令を用いて、同時にデータの比較をすることが可能である。従って、検索の速度が向上する。
また、ツリー(201)は、上記したとおり、或る中間ノードAは、当該中間ノードAが属するグループと異なるグループの中間ノードBを子ノードとして有する場合がある。例えば、16ビット幅以下のキーを持つ中間ノード(213)はその子ノードとして、上記16ビット幅と異なる8ビット幅のキーだけを持つ中間ノード(216)を有する。従って、コンピュータは、検索キーの値を有効数とする最小ビット幅のグループに対応する命令(例えば、SIMD命令)を使用して、当該ツリー(201)中のデータの検索を行う場合に、子ノードである中間ノードを辿る度に、当該中間ノードの種類を判断する(すなわち、上記(1)〜(3)のどのグループに属するかを判断する)必要がある。
図3Aは、本発明の実施態様に従う検索手法2において使用するために構築されたツリー構造の例を示した図である。
ツリー(301)は、根ノード(311)、中間ノード(312〜317)、及び、葉ノード(321〜331)を有するとする。
根ノード(311)はツリー(301)の頂点にあるノードであり、従って、根ノード(311)は親ノードを持たない。根ノード(311)は、エントリとして、複数(図示の例では、4個)のキーを持つことができるとする。根ノード(311)は、中間ノード(312〜317)と直接的に又は間接的にエッジによって接続されている。根ノード(311)の各エントリは、当該根ノード(311)と直接的にエッジによって接続されている中間ノード(312、313及び314)それぞれの左端にあるエントリ内のキー値を持つ。
中間ノード(312〜317)は子ノードを持つノードであり、且つ、根ノード(311)及び葉ノード(321〜331)以外のノードである。中間ノード(312〜317)はそれぞれ、エントリとして、1又は複数個(図示の例では、4個)のキーを持つことができるとする。中間ノード(312〜317)はそれぞれ、根ノード(311)及び葉ノード(321〜331)それぞれと直接的に又は間接的にエッジによって接続されている。中間ノードは内部ノードとも呼ばれる。
葉ノード(321〜331)は、ツリー(301)の最底辺にあるノードであり、従って、葉ノード(321〜331)は子ノードを持たない。葉ノード(321〜331)はそれぞれ、エントリとして、1又は複数個(図示の例では、2個)のキーを持つことができるとする。また、葉ノード(321〜331)にデータが格納されている。
根ノード(311)及び中間ノード(312〜317)はそれぞれ、キーの値を表現可能な最小のビット幅を有するグループとして、下記4つのグループのノードに分類される:
(1)32ビット幅以下のキーを持つノード(すなわち、全てのビット幅のキーを持ちうる);
(2)32ビット幅のキーだけを持つノード;
(3)16ビット幅のキーだけを持つノード;及び、
(4)8ビット幅のキーだけを持つノード。
なお、図3Aに示すツリー(301)の例では4つのグループのノードに分類する場合を示したが、キーの値を表現可能な最小のビット幅に応じて、その他の数のグループに例えば、5つのグループ(64ビット幅以下のキーを持つノード;64ビット幅のキーだけを持つノード;32ビット幅のキーだけを持つノード;16ビット幅のキーだけを持つノード;及び、8ビット幅のキーだけを持つノード)、6つのグループ(128ビット幅以下のキーを持つノード;128ビット幅のキーだけを持つノード;64ビット幅のキーだけを持つノード;32ビット幅のキーだけを持つノード;16ビット幅のキーだけを持つノード;及び、8ビット幅のキーだけを持つノード)、又は、7つのグループ(256ビット幅以下のキーを持つノード;256ビット幅のキーだけを持つノード;128ビット幅のキーだけを持つノード;64ビット幅のキーだけを持つノード;32ビット幅のキーだけを持つノード;16ビット幅のキーだけを持つノード;及び、8ビット幅のキーだけを持つノード)の各ノードに分類することも可能である。
(1)32ビット幅以下のキーを持つノードは、32ビット幅のキー、並びに任意的に、16ビット幅のキー及び/又は8ビット幅のキーを有しうる。ツリー(301)のうち、32ビット幅以下のキーを持つノードは、根ノード(311)である。根ノード(311)は、32ビット幅のキー(70000)、16ビット幅のキー(500)、及び8ビット幅のキー(0)を有している。
(2)32ビット幅のキーだけを持つノードは、ツリー(301)のうち、中間ノード(314)である。中間ノード(314)は、32ビット幅のキー(70000,71000,80000)だけを有している。
(3)16ビット幅のキーだけを持つノードは、ツリー(301)のうち、中間ノード(313)、中間ノード(316)及び中間ノード(317)である。中間ノード(313)は、16ビット幅のキー(400,500)だけを有している。中間ノード(316)は、16ビット幅のキー(400)だけを有している。中間ノード(317)は、16ビット幅のキー(500,510)だけを有している。
(4)8ビット幅のキーだけを持つノードは、ツリー(301)のうち、中間ノード(312)及び中間ノード(315)である。中間ノード(312)は、8ビット幅のキー(0,50,60)だけを有している。中間ノード(315)は、8ビット幅のキー(0,10,20)だけを有している。
図3Aに示す本発明の実施態様に従う検索手法2において使用するために構築されたツリー構造において、根ノード以外の中間ノードは、32ビット幅、16ビット幅、又は8ビット幅のいずれかのキーだけを持つノードに分類される。また、図3Aに示す本発明の実施態様に従う検索手法2において使用するために構築されたツリー構造において、或る中間ノードAは、当該中間ノードAが属するグループと同じグループ(すなわち、当該中間ノードAが属するグループのビット幅と同じビット幅のキーを持つグループ)の中間ノードBだけを子ノードとして有する。
ツリー(301)において、データを検索する場合には、(1)32ビット幅以下のキーを持つノード、(2)16ビット幅以下のキーを持つノード、及び(3)8ビット幅のキーだけを持つノード毎に、キー幅(32ビット幅、16ビット幅、又は8ビット幅)に応じたSIMD命令を用いて、同時にデータの比較をすることが可能である。従って、検索の速度が向上する。
また、ツリー(301)は、上記したとおり、根ノード(311)以外のある中間ノードAは、その子ノードとして、当該中間ノードAが属するグループと同じグループ(すなわち、当該中間ノードAが属するグループのビット幅と同じビット幅のキーを持つグループである)の中間ノードBだけを子ノードとして有することが保証されている。従って、コンピュータ(101)は、検索キーの値を有効数とする最小ビット幅のグループに対応する命令(例えば、SIMD命令)を使用して、当該ツリー(301)中のデータの検索を行う場合には、根ノード(311)に直接的にエッジによって接続されている中間ノード(312,313,及び314)の種類を判断すれば(すなわち、上記(2)〜(4)のどのグループに属するかを判断する)、それ以降の子ノードである中間ノードにおいて、当該中間ノードを辿る度に、当該中間ノードの種類を判断する(すなわち、上記(2)〜(4)のどのグループに属するかを判断する)必要はない。
図3Bは、本発明の実施態様に従う検索手法2において使用するために構築されたツリー構造の例を示した図である。
ツリー(302)は、根ノード(341)、中間ノード(342〜346)、及び、葉ノード(351〜361)を有するとする。
根ノード(341)について、図3Aに示す根ノード(311)の説明を参照されたい。
中間ノード(342〜346)について、図3Aに示す中間ノード(312〜317)の説明を参照されたい。
葉ノード(351〜361)について、図3Aに示す葉ノード(321〜331)の説明を参照されたい。
図3Bに示すツリー(302)の根ノード(341)は、図3Aに示すツリー(301)の根ノード(311)と異なり、あるビット幅のキーだけを持つノードの複数それぞれと直接的にエッジによって接続されている。すなわち、根ノード(341)は、16ビット幅のキーだけを持つノードである中間ノード(343)及び中間ノード(344)それぞれと直接的にエッジによって接続されている。
ツリー(302)において、データを検索する場合には、(1)32ビット幅以下のキーを持つノード、(2)16ビット幅以下のキーを持つノード、及び(3)8ビット幅のキーだけを持つノード毎に、キー幅(32ビット幅、16ビット幅、又は8ビット幅)に応じたSIMD命令を用いて、同時にデータの比較をすることが可能である。従って、検索の速度が向上する。
また、ツリー(302)は、上記したとおり、根ノード(341)以外のある中間ノードAは、その子ノードとして、当該中間ノードAが属するグループと同じグループ(すなわち、当該中間ノードAが属するグループのビット幅と同じビット幅のキーを持つグループである)の中間ノードBだけを子ノードとして有することが保証されている。従って、コンピュータ(101)は、検索キーの値を有効数とする最小ビット幅のグループに対応する命令(例えば、SIMD命令)を使用して、当該ツリー(302)中のデータの検索を行う場合には、根ノード(341)に直接的にエッジによって接続されている中間ノード(342,343,344,及び345)の種類を判断すれば(すなわち、上記(2)〜(4)のどのグループに属するかを判断する)、それ以降の子ノードである中間ノードにおいて、当該中間ノードを辿る度に、当該中間ノードの種類を判断する(すなわち、上記(2)〜(4)のどのグループに属するかを判断する)必要はない。
図3Cは、本発明の実施態様に従う検索手法2において使用するために構築されたツリー構造の例を示した図である。
ツリー(303)は、ノード(371〜374)、及び、葉ノード(381〜391)を有するとする。ツリー(303)は、所謂、根ノードを有していない。しかしながら、ノード(371)、ノード(372)及びノード(373)の最上位ノードとして実質的に根ノードが存在するともみなせる。従って、ノード(371〜374)は、中間ノードに対応する。または、ツリー(303)は、最上位ノードであるノード(371)、ノード(372)及びノード(373)それぞれを部分ツリーの根ノードとするツリーであるとも見なせる。この場合に、根ノード(371)の中間ノードは、ノード(374)である。
根ノード及び中間ノードについて、図3Aに示す根ノード(311)及び中間ノード(312〜317)の説明を参照されたい。
葉ノード(381〜391)について、図3Aに示す葉ノード(321〜331)の説明を参照されたい。
ノード(371〜374)はそれぞれ、キーの値を表現可能な最小のビット幅を有するグループとして、下記3つのグループのノードに分類される:
(1)32ビット幅のキーだけを持つノード;
(2)16ビット幅のキーだけを持つノード;及び、
(3)8ビット幅のキーだけを持つノード。
なお、図3Cに示すツリー(303)の例では3つのグループのノードに分類する場合を示したが、キーの値を表現可能な最小のビット幅に応じて、その他の数のグループに例えば、4つのグループ(64ビット幅のキーだけを持つノード;32ビット幅のキーだけを持つノード;16ビット幅のキーだけを持つノード;及び、8ビット幅のキーだけを持つノード)、5つのグループ(128ビット幅のキーだけを持つノード;64ビット幅のキーだけを持つノード;32ビット幅のキーだけを持つノード;16ビット幅のキーだけを持つノード;及び、8ビット幅のキーだけを持つノード)、又は、6つのグループ(256ビット幅のキーだけを持つノード;128ビット幅のキーだけを持つノード;64ビット幅のキーだけを持つノード;32ビット幅のキーだけを持つノード;16ビット幅のキーだけを持つノード;及び、8ビット幅のキーだけを持つノード)の各ノードに分類することも可能である。
(1)32ビット幅のキーだけを持つノードは、ツリー(303)のうち、ノード(373)である。ノード(373)は、32ビット幅のキー(70000,71000,80000)だけを有している。従って、ノード(373)及び葉ノード(389〜391)は、ツリー(303)の部分ツリーであり、当該部分ツリーは32ビット幅のキーだけを持つグループといえる。また、この場合に、ノード(373)は部分ツリーの根ノードともいえる。
(2)16ビット幅のキーだけを持つノードは、ツリー(303)のうち、ノード(372)である。ノード(372)は、16ビット幅のキー(400,500,510)だけを有している。従って、ノード(372)及び葉ノード(386〜388)は、ツリー(303)の部分ツリーであり、当該部分ツリーは16ビット幅のキーだけを持つグループといえる。また、この場合に、ノード(372)は部分ツリーの根ノードともいえる。
(3)8ビット幅のキーだけを持つノードは、ツリー(303)のうち、ノード(371)及びノード(374)である。ノード(371)は、8ビット幅のキー(0,50,60)だけを有している。ノード(374)は、8ビット幅のキー(0,10,20)だけを有している。従って、ノード(371)、ノード(374)及び葉ノード(381〜385)は、ツリー(303)の部分ツリーであり、当該部分ツリーは8ビット幅のキーだけを持つグループといえる。また、この場合に、ノード(371)は部分ツリーの根ノード、ノード(374)は中間ツリーともいえる。
図3Cに示す本発明の実施態様に従う検索手法2において使用するために構築されたツリー構造において、ノードは、32ビット幅、16ビット幅、又は8ビット幅のいずれかのキーだけを持つノードに分類される。また、図3Cに示す本発明の実施態様に従う検索手法2において使用するために構築されたツリー構造において、或る中間ノードAは、当該中間ノードAが属するグループと同じグループ(すなわち、当該中間ノードAが属するグループのビット幅と同じビット幅のキーを持つグループ)の中間ノードBだけを子ノードとして有する。
ツリー(303)において、データを検索する場合には、(1)32ビット幅以下のキーを持つノード、(2)16ビット幅以下のキーを持つノード、及び(3)8ビット幅のキーだけを持つノード毎に、キー幅(32ビット幅、16ビット幅、又は8ビット幅)に応じたSIMD命令を用いて、同時にデータの比較をすることが可能である。従って、検索の速度が向上する。
また、ツリー(303)は、上記したとおり、あるノードAは、その子ノードとして、当該ノードAが属するグループと同じグループ(すなわち、当該ノードAが属するグループのビット幅と同じビット幅のキーを持つグループである)のノードBだけを子ノードとして有することが保証されている。従って、コンピュータ(101)は、検索キーの値を有効数とする最小ビット幅のグループに対応する命令(例えば、SIMD命令)を使用して、当該ツリー(303)中のデータの検索を行う場合には、最上位のノード(371,372,及び373)の種類を判断すれば(すなわち、上記(1)〜(3)のどのグループに属するかを判断する)、それ以降の子ノードにおいて、当該子ノードを辿る度に、当該子ノードの種類を判断する(すなわち、上記(1)〜(3)のどのグループに属するかを判断する)必要はない。
下記図4A〜図4D及び下記図4E〜図4Hそれぞれにおいて、上記検索手法1において使用するために構築されたツリー構造において、ツリーのノードにエントリを挿入して、ツリーを動的に再構築する例1及び例2を示す。同様に、下記図5A〜図5B及び下記図5C〜図5Eそれぞれにおいて、上記検索手法2において使用するために構築されたツリー構造において、ツリーのノードにエントリを挿入して、ツリーを動的に再構築する例1及び例2を示す。
図4A〜図4Dは、本発明の実施態様に従い、上記検索手法1において使用するために構築されたツリー構造において、ツリーのノードにエントリを挿入して、ツリーを動的に再構築する例1を示した図である。
再構築対象のツリー(401A)は部分ツリーであり、根ノード(図示せず)、中間ノード(411〜412)、及び葉ノード(421〜423)を有するとする。中間ノード(411〜412)はそれぞれ3つのキーまで、葉ノード(421〜423)はそれぞれ2つのキーまで持つことができるとする。
中間ノード(411)は、16ビット幅以下のキーを持つノードであり、16ビット幅のキー(500)、及び8ビット幅のキー(0,50)を有している。中間ノード(412)は、8ビット幅のキーだけを持つノードであり、8ビット幅のキー(0,10,20)だけを有している。
コンピュータ(101)は、キー値が11であるエントリ(キー値11)をツリー(401A)の葉ノード中に挿入しようとする。
ステップ1Aにおいて、コンピュータ(101)は、ツリー(401A)中において、キー値11が挿入されるべき葉ノードを発見する操作を行う。コンピュータ(101)は、キー値11が中間ノード(411)中のキー値50よりも小さいことから、当該中間ノード(411)のうち、キー値50の左側のエントリが指す中間ノード(412)を発見する。引き続き、コンピュータ(101)は、ツリー(401B;401Aと同じ)中において、キー値11が上記発見した中間ノード(412)中のキー値20よりも小さいことから、当該中間ノード(412)のうち、キー値20の左側のエントリが指す葉ノード(422)を発見する。
ステップ2Aにおいて、コンピュータ(101)は、ステップ1Aで発見した葉ノード(422)中にキー値11を挿入しようとする(図4Aに示すツリー(401B)を参照)。しかしながら、コンピュータ(101)は、葉ノード(422)は2つのキー値10及び12を既に有しており、且つ、葉ノードは2つまでのキーしか持つことができないことから、葉ノード(422)中にキー値11を挿入すると、当該葉ノード(422)のエントリがあふれてしまうと判断する。そこで、コンピュータ(101)は、上記葉ノード(422)を2つの葉ノード、すなわちキー値10を持つ葉ノードとキー値12を持つ葉ノード(425)(図4Aに示すツリー(401C)を参照)に分割する。そして、コンピュータ(101)は、分割後の上記キー値10を持つ葉ノードにキー値11を挿入して、キー値10及び11を持つ葉ノード(424)(図4Aに示すツリー(401C)を参照)を生成する。
ステップ3Aにおいて、コンピュータ(101)は、ツリー(401C)において、上位にある中間ノード(412)からキー値12を持つ葉ノード(425)に対するエッジがないことから、中間ノード(412)から葉ノード(425)に対してリンクを張る。そこで、コンピュータ(101)は、上記中間ノード(412)中にキー値12を挿入しようとする。しかしながら、コンピュータ(101)は、当該中間ノード(412)は3つのキー値0,10及び12を既に有しており、且つ、中間ノードは3つまでのキーしか持つことができないことから、当該中間ノード(412)中にキー値12を挿入すると、当該中間ノード(412)のエントリがあふれてしまうと判断する。そこで、コンピュータ(101)は、上記中間ノード(412)を2つの中間ノード、すなわち中間ノード(413)と中間ノード(414)とに分割する(図4Bに示すツリー(401D)を参照)。上記中間ノード(413)は、分割前と同じ8ビット幅のキーを持ち、且つ、キー値0及び10を有する(図4Bに示すツリー(401D)を参照)。また、上記中間ノード(414)は、分割前と同じ8ビット幅のキーを持ち、且つ、キー値20を有する(図4Bに示すツリー(401D)を参照)。
ステップ4Aにおいて、コンピュータ(101)は、ツリー(401D)において、分割した中間ノード(414)の左端にキー値12を挿入し、キー値12及び20を持つ中間ノード(415)(図4Bに示すツリー(401Eを参照)を生成する。なお、コンピュータ(101)は、分割した中間ノード(413)の右端にキー値12を挿入し、キー値0,10及び12を持つ中間ノード(図示せず)を生成してもよい。以下では、キー値12及び20を持つ中間ノード(415)を生成した場合の態様について、引き続き説明する。引き続き、コンピュータ(101)は、上位にある中間ノード(413,415)からキー値12を持つ葉ノード(425)に対するエッジがないことから、中間ノード(415)からキー値12を持つ葉ノード(425)にリンクを張る(図4Bに示すツリー(401E)を参照)。
ステップ5Aにおいて、コンピュータ(101)は、ツリー(401E)において、上位にある中間ノード(411)から中間ノード(415)に対するエッジがないことから、中間ノード(411)から中間ノード(415)に対してリンクを張る。そこで、コンピュータ(101)は、上記中間ノード(411)中にキー値12を挿入しようとする。しかしながら、コンピュータ(101)は、当該中間ノード(411)は3つのキー値0,50及び500を既に有しており、且つ、中間ノードは3つまでのキーしか持つことができないことから、当該中間ノード(411)中にキー値12を挿入すると、当該中間ノード(411)のエントリがあふれてしまうと判断する。そこで、コンピュータ(101)は、上記中間ノード(411)を2つの中間ノード、すなわち中間ノード(416)と中間ノード(417)とに分割する(図4Cに示すツリー(401F)を参照)。上記中間ノード(416)は、分割前の16ビット幅以下のキーと異なる8ビット幅のキーだけを持ち、且つ、キー値0を有する(図4Cに示すツリー(401F)を参照)。当該中間ノード(416)が分割前の16ビット幅以下のキーと異なるグループである8ビット幅のキーだけを持つ理由は、当該中間ノード(416)のキー値0が8ビット幅だけで表現できるからである。従って、中間ノード(416)は16ビット幅以下のキーを持つノードから8ビット幅のキーだけを持つノードにグループが変更されている。また、上記中間ノード(417)は、分割前の16ビット幅以下のキーと同じ16ビット幅以下のキーを持ち、且つ、キー値50及び500を有する(図4Cに示すツリー(401F)を参照)。
ステップ6Aにおいて、コンピュータ(101)は、ツリー(401F)において、分割した上記中間ノード(416)にキー値12を挿入して、中間ノード(418)(図4Cに示すツリー(418)を参照)を生成する。引き続き、コンピュータ(101)は、上位にある中間ノード(418)からキー値12を持つ中間ノード(415)に対するエッジがないことから、中間ノード(418)からキー値12を持つ中間ノード(415)にリンクを張る(図4Cに示すツリー(401G)を参照)。
ステップ7Aにおいて、コンピュータ(101)は、ツリー(401G)において、中間ノード(418)及び中間ノード(417)の親ノード(419)を生成する(図4Dに示すツリー(401H)を参照)。親ノード(419)は、16ビット幅以下のキーを持つノードであり、且つ、中間ノード(418)の左端のキー値0及び中間ノード(417)の左端のキー値50を有する。
図4Dに示すツリー(401H)は、図4Aに示す再構築対象のツリー(401A)から動的に再構築されたツリーである。
図4A〜図4Dに示す上記例1に説明した通り、キー値が11であるエントリ(キー値11)をツリー(401A)のノード中に挿入することによって、中間ノードや葉ノードの分割が生じ、上記検索手法1において使用される新たなツリー(401H)が動的に再構築される。
図4E〜図4Hは、本発明の実施態様に従い、上記検索手法1において使用するために構築されたツリー構造において、ツリーのノードにエントリを挿入して、ツリーを動的に再構築する例2を示した図である。
再構築対象のツリー(431A)は、図4Aに示すツリー(401A)と同じである。従って、再構築対象のツリー(431A)並びに中間ノード(451)及び中間ノード(452)についての説明は、図4Aに示す再構築対象のツリー(401A)並びに中間ノード(411)及び中間ノード(412)の説明を参照されたい。
コンピュータ(101)は、キー値が11であるエントリ(キー値11)をツリー(431A)の葉ノード中に挿入しようとする。
ステップ1B〜ステップ2Bそれぞれは、図4Aに示すステップ1A〜ステップ2Aそれぞれに対応する。従って、ステップ1B〜ステップ2Bについての説明は、図4に示すステップ1A〜ステップ2Aについての説明を参照されたい。
ステップ3Bにおいて、コンピュータ(101)は、ツリー(431C)において、上位にある中間ノード(452)からキー値12を持つ葉ノード(465)に対するエッジがないことから、中間ノード(452)から葉ノード(465)に対してリンクを張る(下記図4Fに示すツリー(431D)中の点線を参照)。
ステップ4Bにおいて、コンピュータ(101)は、上記中間ノード(452)中にキー値12を挿入しようとする。しかしながら、コンピュータ(101)は、当該中間ノード(452)は3つのキー値0,10及び20を既に有しており、且つ、中間ノードは3つまでのキーしか持つことができないことから、当該中間ノード(452)中にキー値12を挿入すると、当該中間ノード(452)のエントリがあふれてしまうと判断する。そこで、コンピュータ(101)は、上記中間ノード(452)を2つの中間ノード、すなわち(453)と中間ノード(455)とに分割する(図4Fに示すツリー(431E)を参照)。上記中間ノード(453)は、分割前と同じ8ビット幅のキーを持ち、且つ、キー値0及び10を有する(図4Fに示すツリー(431E)を参照)。また、上記中間ノード(455)は、分割前と同じ8ビット幅のキーを持ち、且つ、キー値12(挿入された)及び20を有する(図4Fに示すツリー(431E)を参照)。なお、コンピュータ(101)は、分割した中間ノード(453)の右端にキー値12を挿入し、キー値0,10及び12を持つ中間ノード(図示せず)を生成してもよい。以下では、キー値12及び20を持つ中間ノード(455)を生成した場合の態様について、引き続き説明する。
ステップ5Bにおいて、コンピュータ(101)は、ツリー(431E)において、上位にある中間ノード(451)から中間ノード(455)に対するエッジがないことから、中間ノード(451)から中間ノード(455)に対してリンクを張る。(下記図4Gに示すツリー(431F)中に示す点線を参照)。
ステップ6Bにおいて、コンピュータ(101)は、上記中間ノード(451)中にキー値12を挿入しようとする。しかしながら、コンピュータ(101)は、当該中間ノード(451)は3つのキー値0,50及び500を既に有しており、且つ、中間ノードは3つまでのキーしか持つことができないことから、当該中間ノード(451)中にキー値12を挿入すると、当該中間ノード(451)のエントリがあふれてしまうと判断する。そこで、コンピュータ(101)は、上記中間ノード(451)を2つの中間ノード、すなわち中間ノード(458)と中間ノード(457)とに分割する(下記図4Gに示すツリー(431G)を参照)。上記中間ノード(458)は、分割前の16ビット幅以下のキーと異なる8ビット幅のキーだけを持ち、且つ、キー値0及びキー値12(挿入された)を有する(図4Gに示すツリー(431G)を参照)。当該中間ノード(458)が分割前の16ビット幅以下のキーと異なるグループである8ビット幅のキーだけを持つ理由は、当該中間ノード(458)のキー値0が8ビット幅だけで表現できるからである。従って、中間ノード(458)は16ビット幅以下のキーを持つノードから8ビット幅のキーだけを持つノードにグループが変更されている。また、上記中間ノード(457)は、分割前の16ビット幅以下のキーと同じ16ビット幅以下のキーを持ち、且つ、キー値50及び500を有する(図4Gに示すツリー(431G)を参照)。
ステップ7Bにおいて、コンピュータ(101)は、中間ノード(458)及び中間ノード(457)の親ノード(459)を生成する(図4Hのツリー431Hを参照)。親ノード(459)は、16ビット幅以下のキーを持つノードであり、且つ、中間ノード(458)の左端のキー値0及び中間ノード(457)の左端のキー値50を有する。
図4Hに示すツリー(431H)は、図4Eに示す再構築対象のツリー(431A)から動的に再構築されたツリーである。
図4E〜図4Hに示す上記例2に説明した通り、キー値が11であるエントリ(キー値11)をツリー(431A)のノード中に挿入することによって、中間ノードや葉ノードの分割が生じ、上記検索手法1において使用される新たなツリー(431H)が動的に再構築される。
図5A〜図5Bは、本発明の実施態様に従い、上記検索手法2において使用するために構築されたツリー構造において、ツリーのノードにエントリを挿入して、ツリーを動的に再構築する例1を示した図である。
再構築対象のツリー(501A)は部分ツリーであり、当該部分ツリーの根ノード(図示せず,ツリー全体からすれば、中間ノードでもある)、中間ノード(511)、及び葉ノード(521〜523)を有するとする。中間ノード(511)は3つのキーまで、葉ノード(521〜523)はそれぞれ2つのキーまで持つことができるとする。
中間ノード(511)は、8ビット幅のキー(0,10,20)だけを有している。
コンピュータ(101)は、キー値が11であるエントリ(キー値11)をツリー(501A)の葉ノード中に挿入しようとする。
ステップ1Cにおいて、コンピュータ(101)は、ツリー(501A)中において、キー値11が挿入されるべき葉ノードを発見する操作を行う。コンピュータ(101)は、キー値11が中間ノード(511)中のキー値20よりも小さいことから、当該中間ノード(511)のうち、キー値20の左側のエントリが指す葉ノード(522)を発見する。
ステップ2Cにおいて、コンピュータ(101)は、ツリー(501B;501Aと同じ)中において、上記ステップ1Cで発見した葉ノード(522)中にキー値11を挿入しようとする(図5Aに示すツリー(501B)を参照)。しかしながら、コンピュータ(101)は、葉ノード(522)は2つのキー値10及び12を既に有しており、且つ、葉ノードは2つまでのキーしか持つことができないことから、葉ノード(522)中にキー値11を挿入すると、当該葉ノード(522)のエントリがあふれてしまうと判断する。そこで、コンピュータ(101)は、上記葉ノード(522)を2つの葉ノード、すなわちキー値10を持つ葉ノード(図示せず)とキー値12を持つ葉ノード(525)とに分割する(図5Aに示すツリー(501C)を参照)。そして、コンピュータ(101)は、分割後の上記キー値10を持つ葉ノード(図示せず)にキー値11を挿入して、キー値10及び11を持つ葉ノード(524)(図5Aに示すツリー(501C)を参照)を生成する。
ステップ3Cにおいて、コンピュータ(101)は、上位にある中間ノード(511)からキー値12を持つ葉ノード(525)に対するエッジがないことから、中間ノード(511)から葉ノード(525)に対してリンクを張る。そこで、コンピュータ(101)は、上記中間ノード(511)中にキー値12を挿入しようとする。しかしながら、コンピュータ(101)は、当該中間ノード(511)は3つのキー値0,10及び20を既に有しており、且つ、中間ノードは3つまでのキーしか持つことができないことから、当該中間ノード(511)中にキー値12を挿入すると、当該中間ノード(511)のエントリがあふれてしまうと判断する。そこで、コンピュータ(101)は、上記中間ノード(511)を2つの中間ノード、すなわち中間ノード(512)と中間ノード(513)とに分割する(図5Bに示すツリー(501D)を参照)。上記中間ノード(512)は、分割前と同じ8ビット幅のキーだけを持ち、且つ、キー値0及び10を有する(図5Bに示すツリー(501D)を参照)。また、上記中間ノード(513)は、分割前と同じ8ビット幅のキーだけを持ち、且つ、キー値20を有する(図5Bに示すツリー(501D)を参照)。
ステップ4Cにおいて、コンピュータ(101)は、分割した中間ノード(513)の左端にキー値12を挿入し、キー値12及び20を持つ中間ノード(514)(図5Bに示すツリー(501E)を参照)を生成する。なお、コンピュータ(101)は、分割した中間ノード(512)の右端にキー値12を挿入し、キー値0,10及び12を持つ中間ノードを生成してもよい。以下では、キー値12及び20を持つ中間ノード(514)を生成した場合の態様について、引き続き説明する。引き続き、コンピュータ(101)は、上位にある中間ノード(512,513)からキー値12を持つ葉ノード(525)に対するエッジがないことから、中間ノード(514)からキー値12を持つ葉ノード(525)にリンクを張る(図5Bに示すツリー(501E)を参照)。
ステップ5Cにおいて、コンピュータ(101)は、中間ノード(512)及び中間ノード(514)の親ノード(515)を生成する(図5Bに示すツリー(501F)を参照)。親ノード(515)は、8ビット幅のキーだけを持つノードであり、且つ、中間ノード(512)の左端のキー値0及び中間ノード(514)の左端のキー値12を有する。
図5Bに示すツリー(501F)は、図5Aに示す再構築対象のツリー(501A)から動的に再構築されたツリーである。
図5A〜図5Bに示す上記例1に説明したとおり、キー値が11であるエントリ(キー値11)をツリー(501A)のノード中に挿入することによって、中間ノードや葉ノードの分割が生じ、上記検索手法2において使用される新たなツリー(501F)が動的に再構築される。
図5C〜図5Eは、本発明の実施態様に従い、上記検索手法2において使用するために構築されたツリー構造において、ツリーのノードにエントリを挿入して、ツリーを動的に再構築する例1を示した図である。
再構築対象のツリー(531A)は部分ツリーであり、当該部分ツリーの根ノード(541,ツリー全体からすれば、中間ノードでもある)、中間ノード(542)、及び葉ノード(551〜553)を有するとする。根ノード(541)及び中間ノード(542)は3つのキーまで、葉ノード(551〜553)はそれぞれ2つのキーまで持つことができるとする。
根ノード(541)は、8ビット幅のキー(0,50,100)だけを有している。また、中間ノード(542)は、8ビット幅のキー(0,10,20)だけを有している。
コンピュータ(101)は、キー値が11であるエントリ(キー値11)をツリー(531A)の葉ノード中に挿入しようとする。
ステップ1Dにおいて、コンピュータ(101)は、ツリー(531A)中において、キー値11が挿入されるべき葉ノードを発見する操作を行う。コンピュータ(101)は、キー値11が根ノード(541)中のキー値50よりも小さいことから、当該根ノード(541)のうち、キー値50の左側のエントリが指す中間ノード(542)を発見する。引き続き、コンピュータ(101)は、ツリー(531B;531Aと同じ)中において、キー値11が上記発見した中間ノード(512)中のキー値20よりも小さいことから、当該中間ノード(5422)のうち、キー値20の左側のエントリが指す葉ノード(552)を発見する。
ステップ2Dにおいて、コンピュータ(101)は、ツリー(531B;531Aと同じ)中において、上記ステップ1Dで発見した葉ノード(552)中にキー値11を挿入しようとする(図5Cに示すツリー(531B)を参照)。しかしながら、コンピュータ(101)は、葉ノード(552)は2つのキー値10及び12を既に有しており、且つ、葉ノードは2つまでのキーしか持つことができないことから、葉ノード(552)中にキー値11を挿入すると、当該葉ノード(552)のエントリがあふれてしまうと判断する。そこで、コンピュータ(101)は、上記葉ノード(552)を2つの葉ノード、すなわちキー値10を持つ葉ノード(図示せず)とキー値12を持つ葉ノード(555)とに分割する(図5Cに示すツリー(531C)を参照)。そして、コンピュータ(101)は、分割後の上記キー値10を持つ葉ノード(図示せず)にキー値11を挿入して、キー値10及び11を持つ葉ノード(554)(図5Cに示すツリー(531C)を参照)を生成する。
ステップ3Dにおいて、コンピュータ(101)は、上位にある中間ノード(541)からキー値12を持つ葉ノード(555)に対するエッジがないことから、中間ノード(542)から葉ノード(555)に対してリンクを張る(下記図5Dに示すツリー(531D)中の点線を参照)。
ステップ4Dにおいて、コンピュータ(101)は、上記中間ノード(542)中にキー値12を挿入しようとする。しかしながら、コンピュータ(101)は、当該中間ノード(542)は3つのキー値0,10及び20を既に有しており、且つ、中間ノードは3つまでのキーしか持つことができないことから、当該中間ノード(542)中にキー値12を挿入すると、当該中間ノード(542)のエントリがあふれてしまうと判断する。そこで、コンピュータ(101)は、上記中間ノード(542)を2つの中間ノード、すなわち(543)と中間ノード(544)とに分割する(図5Dに示すツリー(531E)を参照)。上記中間ノード(543)は、分割前と同じ8ビット幅のキーを持ち、且つ、キー値0及び10を有する(図5Dに示すツリー(531E)を参照)。また、上記中間ノード(544)は、分割前と同じ8ビット幅のキーを持ち、且つ、キー値12(挿入された)及び20を有する(図5Dに示すツリー(531E)を参照)。なお、コンピュータ(101)は、分割した中間ノード(543)の右端にキー値12を挿入し、キー値0,10及び12を持つ中間ノード(図示せず)を生成してもよい。以下では、キー値12及び20を持つ中間ノード(544)を生成した場合の態様について、引き続き説明する。
ステップ5Dにおいて、コンピュータ(101)は、ツリー(531E)において、上位にある根ノード(541)から中間ノード(544)に対するエッジがないことから、根ノード(541)から中間ノード(544)に対してリンクを張る。(図5Dに示すツリー(531F)中に示す点線を参照)。
ステップ6Dにおいて、コンピュータ(101)は、上記根ノード(541)中にキー値12を挿入しようとする。しかしながら、コンピュータ(101)は、当該根ノード(541)は3つのキー値0,50及び100を既に有しており、且つ、根ノードは3つまでのキーしか持つことができないことから、当該根ノード(541)中にキー値12を挿入すると、当該根ノード(541)のエントリがあふれてしまうと判断する。そこで、コンピュータ(101)は、上記根ノード(541)を2つの中間ノード、すなわち中間ノード(545)と中間ノード(546)とに分割する(下記図5Eに示すツリー(531G)を参照)。上記中間ノード(545)は、分割前と同じく8ビット幅のキーだけを持ち、且つ、キー値0を有する(図5Eに示すツリー(531G)を参照)。また、上記中間ノード(546)は、分割前と同じく8ビット幅のキーだけを持ち、且つ、キー値12(挿入された)、50及び100を有する(図5Eに示すツリー(531G)を参照)。
ステップ7Dにおいて、コンピュータ(101)は、中間ノード(545)及び中間ノード(546)の親ノード(547)を生成する(図5Eのツリー531Hを参照)。親ノード(547)は、中間ノード(545)及び中間ノード(546)と同じく8ビット幅のキーだけを持つノードであり、且つ、中間ノード(545)の左端のキー値0及び中間ノード(546)の左端のキー値12を有する。
図5Eに示すツリー(531H)は、図5Cに示す再構築対象のツリー(531A)から動的に再構築されたツリーである。
図5C〜図5Eに示す上記例2に説明したとおり、キー値が11であるエントリ(キー値11)をツリー(531A)のノード中に挿入することによって、中間ノードや葉ノードの分割が生じ、上記検索手法2において使用される新たなツリー(531H)が動的に再構築される。
図6は、本発明の実施態様に従い、予め決められた複数のビット幅のデータに対して操作を行う命令を使用してツリーの検索を行う処理全体のフローチャートを示す。
ステップ601において、コンピュータ(101)は、予め決められた複数のビット幅のデータに対して操作を行う命令を使用してツリーの検索を行う処理を開始する。
ステップ602において、コンピュータ(101)は、本発明の実施態様に従う上記検索手法1又は上記検索手法2において使用する為のツリー構造を構築する。コンピュータ(101)は、当該ツリー構造の構築において、複数のビット幅のうち、キーの値を表現可能な最小のビット幅を有するグループに分類して、上記ツリーを構築する。上記グループは例えば、8ビット幅のキーだけを持つノード、16ビット幅のキーだけを持つ若しくはそれ以下のキーを持つノード、32ビット幅のキーだけを持つ若しくはそれ以下のキーを持つノード、64ビット幅のキーだけを持つ若しくはそれ以下のキーを持つノード、128ビット幅のキーだけを持つ若しくはそれ以下のキーを持つノード、又は、256ビット幅のキーだけを持つ若しくはそれ以下のキーを持つノードでありうる。
コンピュータ(101)は、本発明の実施態様に従う上記検索手法1において使用する為のツリー構造を構築する場合には、ツリーの根ノード以外のノード(例えば、中間ノード)が、複数のビット幅のうち、キーの値を表現可能な最小のビット幅を有するように、ツリーを構築しうる。
コンピュータ(101)は、本発明の実施態様に従う上記検索手法1において使用する為のツリー構造を構築する場合には、ツリーの根ノードが、複数のビット幅のうち、キーの値を表現可能な最小のビット幅を有する少なくとも2つのグループを下位にあるノードとして有するように、上記ツリーを構築しうる。
また、コンピュータ(101)は、本発明の実施態様に従う上記検索手法1において使用する為のツリー構造を構築する場合に、ノード(根ノード及び中間ノード)それぞれに上記グループを識別する識別子(例えば、Node ID=08(8ビット幅のキーだけを持つノード),16(16ビット幅のキーだけを持つノード),32(32ビット幅のキーだけを持つノード)である)を付与しうる。また、コンピュータ(101)は、本発明の実施態様に従う上記検索手法1において使用する為のツリー構造を構築する場合に、ノードが持つキー値の範囲に応じて、当該ノード(根ノード及び中間ノード)それぞれに上記グループを識別する識別子を付与しうる。例えば、ノードが持つキー値の範囲が0〜255であればNode ID=08(8ビット幅のキーだけを持つノード)、256〜65535であればNode ID=16(16ビット幅のキーだけを持つノード)、65536〜4294967295であればNode ID=32(32ビット幅のキーだけを持つノード)という3種類のグループとしうる。当該識別子は、コンピュータ(101)が、上記構築されたツリーのノードを辿って、上記識別子により各ノードが属するグループを判定し、当該判定されたグループに対応する命令(例えば、SIMD命令)を使用してデータを検索する為に使用されうる。コンピュータ(101)は例えば、識別子「Node08」の場合は8ビット幅データのSIMD比較命令を用い、識別子「Node16」の場合は16ビット幅データのSIMD比較命令を用い、識別子「Node32」の場合は32ビット幅データのSIMD比較命令を用いる。同じ数のキーを比較する場合、例えば16ビット幅データのSIMD比較命令を用いる場合は、16ビット幅データのSIMD比較命令を用いる場合の半分程度の実行命令数で済む。
コンピュータ(101)は、本発明の実施態様に従う上記検索手法2において使用する為のツリー構造を構築する場合には、各グループを、根ノードを親ノードとするサブツリーとして構築する(図3A〜図3Bそれぞれに示すツリー(301,302)を参照)か、又は、グループそれぞれを、部分ツリーとして構築する(図3Cに示すツリー(303)を参照)。
また、コンピュータ(101)は、本発明の実施態様に従う上記検索手法2において使用するために構築されたツリー構造を構築し、各グループを、根ノードを親ノードとするサブツリーとして構築する場合には、各グループのサブツリーのうち最上位にある親ノードにおいて、用意した全ての種類のノードにどれにでも到達できるようにし、当該最上位にある親ノード以下の子ノードでは特定の種類のノードだけに到達できることを保証する。当該保証により、ノードの種類を調べる操作が不要になり、ノードを辿る操作が高速化される。
同様に、コンピュータ(101)は、本発明の実施態様に従う上記検索手法2において使用するために構築されたツリー構造を構築し、グループそれぞれを、部分ツリーとして構築する場合には、各グループの(中間)ノードのうち最上位にある親ノードにおいて、用意した全ての種類のノードにどれにでも到達できるようにし、当該最上位にある親ノード以下の子ノードでは特定の種類のノードだけに到達できることを保証する。当該保証により、ノードの種類を調べる操作が不要になり、ノードを辿る操作が高速化される。
ステップ603において、コンピュータ(101)は、上記検索手法1又は上記検索手法2において使用するために構築されたツリーを再構築する場合に、ツリーのノードにキーを挿入するかを判断する。コンピュータ(101)は、ツリーのノードにキーを挿入することに応じて、処理をステップ604に進める。一方、コンピュータ(101)は、ツリーのノードにキーを挿入しないことに応じて、処理をステップ605に進める。
コンピュータ(101)は、ツリーのノードにキーを挿入する場合に、当該ノードが持つキーが一定に範囲に収まるようにして、当該ノードを上記したグループのうちのある特定のグループに属するものとする。上記一定の範囲とは、同一のSSIMD比較命令で処理できることを意味する。例えば、キーの値が32ビット幅で、8/16/32ビット幅データを比較可能なSIMD命令において、符号無し整数の比較の場合には、0〜255/256〜65,535/65,536〜4,294,967,295、である。また、符号有り整数の比較の場合には、範囲の数は16ビット幅の符号有り整数の比較の場合には、-32,768〜-129/-128〜127/128〜32,767である。
ステップ604において、コンピュータ(101)は、上記検索手法1又は上記検索手法2において使用するために構築されたツリー構造において、ツリーのノードにキーを挿入する。ツリーのノードにキーを挿入することによって、当該ツリーが動的に再構築される。ツリーのノードにキーを挿入する処理の詳細については、下記図7A(上記検索手法1)及び下記図7B(上記検索手法2)において説明する。
ステップ605において、コンピュータ(101)は、ステップ602で構築されたツリー又はステップ604で再構築されたツリーを用いて、データ検索を行うかを判断する。コンピュータ(101)は、当該データ検索を行うことに応じて、処理をステップ606に進める。一方、コンピュータ(101)は、当該データ検索を行わないことに応じて、処理をステップ607に進める。
ステップ606において、コンピュータ(101)は、ステップ602で構築されたツリー又はステップ604で再構築されたツリーにおいて、検索キーの値を有効数とする最小ビット幅のグループに対応する命令(例えば、SIMD命令)を使用して、検索キーの値を有効数とする最小ビット幅のグループからデータを検索する。当該データの検索において、キー値Kと葉ノードが持つキーとを比較して、キー値Kを持つ可能性がある葉ノードが発見される。
ステップ607において、コンピュータ(101)は、ツリーのノードにキーを挿入することによってツリーの再構築又はデータの検索を繰り返すかを判断する。コンピュータ(101)は、ツリーを再構築すること又はデータを検索することに応じて、処理をステップ603に戻す。一方、コンピュータ(101)は、ツリーを再構築しないこと且つデータの検索をしないことに応じて、処理を終了ステップ608に進める。
ステップ608において、コンピュータ(101)は、ステップ601で開始した上記処理を終了する。
図6に示す上記フローチャートにおいて、ステップ602に示すツリーの構築後、キーの挿入(以下、「挿入」と示す)及びデータの検索(以下、「検索」と示す)を例えば、下記の順に実行しうる:(1)挿入→検索、(2)挿入→挿入→検索、(3)検索→挿入、及び(4)検索→検索。
図7Aは、本発明の実施態様に従い、上記検索手法1の為のツリー構造を使用して、キーの値を挿入すべき葉ノード又はキーの値を持つ可能性がある葉ノードを発見する処理のフローチャートを示す。
図7Aに示す処理において使用するために構築されたツリー構造はB+−ツリーであるとする。また、中間ノードのキー幅は、8ビット幅、16ビット幅、又は32ビット幅の3種類であるとする。
ステップ701において、コンピュータ(101)は、上記検索手法1の為のツリー構造を使用して、キーの値を挿入すべき葉ノード又はキーの値を持つ可能性がある葉ノードを発見する(葉ノードを特定することでもある)処理を開始する。
ステップ702において、コンピュータ(101)は、入力として、検索対象であるノードが持つキー値Kを受け取る。
ステップ703において、コンピュータ(101)は、上記検索手法1の為のツリー構造をメモリ(103)から読み取り、当該ツリーの根ノードを取り出す。
ステップ704において、コンピュータ(101)は、ステップ703で取り出した根ノード又は、下記ステップ705、706若しくは707で決定された子ノードが持つキーのビット幅を判定する。コンピュータは、上記キー値Kの値を有効数とする最小ビット幅のグループに属するノードを特定する。具体的には、以下の通りである;すなわち、コンピュータ(101)は、当該ノードが持つキーのビット幅が8ビット幅であることに応じて、処理をステップ705に進める:コンピュータ(101)は、当該ノードが持つキーのビット幅が16ビット幅であることに応じて、処理をステップ706に進める:コンピュータ(101)は、当該ノードが持つキーのビット幅が32ビット幅であることに応じて、処理をステップ707に進める。
ステップ705において、コンピュータ(101)は、当該ノードが持つキーのビット幅が8ビット幅であることに応じて、ステップ703で取り出した根ノード又は下記ステップ705、706若しくは707で決定された子ノードについて、8ビット・データ幅を用いた比較を行うためのSIMD命令を用いて、上記キー値Kと上記根又は子ノード(中間ノード又は葉ノードでありうる)のキーとを比較して、次に辿るべき子ノードを決定する。
また、ステップ705において、コンピュータ(101)は、キー値Kを有効数とする最小ビット幅のグループに属するノードを発見しうる。当該キー値Kを有効数とする最小ビット幅のグループは、上記キー値Kを表現可能な最小のビット幅を有するグループである。
ステップ706において、コンピュータ(101)は、当該ノードが持つキーのビット幅が16ビット幅であることに応じて、ステップ703で取り出した根ノード又は、下記ステップ705、706若しくは707で決定された子ノードについて、16ビット・データ幅を用いた比較を行うためのSIMD命令を用いて、上記キー値Kと上記根又は子ノード(中間ノード又は葉ノードでありうる)のキーとを比較して、次に辿るべき子ノードを決定する。
また、ステップ706において、コンピュータ(101)は、キー値Kを有効数とする最小ビット幅のグループに属するノードを発見しうる。当該キー値Kを有効数とする最小ビット幅のグループは、上記キー値Kを表現可能な最小のビット幅を有するグループである。
ステップ707において、コンピュータ(101)は、当該ノードが持つキーのビット幅が32ビット幅であることに応じて、ステップ703で取り出した根ノード又は、下記ステップ705、706若しくは707で決定された子ノードについて、32ビット・データ幅を用いた比較を行うためのSIMD命令を用いて、上記キー値Kと上記根又は子ノード(中間ノード又は葉ノードでありうる)のキーとを比較して、次に辿るべき子ノードを決定する。
また、ステップ707において、コンピュータ(101)は、キー値Kを有効数とする最小ビット幅のグループに属するノードを発見しうる。当該キー値Kを有効数とする最小ビット幅のグループは、上記キー値Kを表現可能な最小のビット幅を有するグループである。
ステップ708において、コンピュータ(101)は、ステップ705、706又は707において決定された子ノードが葉ノードであるかを判定する。コンピュータ(101)は、当該子ノードが葉ノードであることに応じて、処理をステップ709に進める。一方、コンピュータ(101)は、当該子ノードが葉ノードでないことに応じて、次に辿る子ノードを決定する為に、処理をステップ704に戻す。
ステップ709において、コンピュータ(101)は、出力として、ステップ708で決定された子ノード(葉ノードでもある)を、キー値Kを挿入すべき葉ノード又はキー値Kを持つ可能性がある葉ノードとする。
ステップ710において、コンピュータ(101)は、ステップ701で開始した上記処理を終了する。
図7Bは、本発明の実施態様に従い、上記検索手法2の為のツリー構造を使用して、キーの値を挿入すべき葉ノード又はキーの値を持つ可能性がある葉ノードを発見する処理のフローチャートを示す。
図7Bに示す処理において使用するために構築されたツリー構造はB+−ツリーであるとする。また、(中間)ノードのキー幅は、8ビット幅、16ビット幅、又は32ビット幅の3種類であるとする。
ステップ711において、コンピュータ(101)は、上記検索手法2の為のツリー構造を使用して、キーの値を挿入すべき葉ノード又はキーの値を持つ可能性がある葉ノードを発見する処理を開始する。
ステップ712において、コンピュータ(101)は、入力として、キー値Kを受け取る。
ステップ713において、コンピュータ(101)は、キー値Kが必要とするビット幅を調べる。コンピュータは、上記キー値Kの値を有効数とする最小ビット幅のグループに属するノードを特定する。具体的には、以下の通りである;すなわち、コンピュータ(101)は、当該ノードが持つキーのビット幅が8ビット幅であることに応じて、Kが必要とするビット幅が8ビット幅であると判断する:コンピュータ(101)は、当該ノードが持つキーのビット幅が16ビット幅であることに応じて、Kが必要とするビット幅が16ビット幅であると判断する:コンピュータ(101)は、当該ノードが持つキーのビット幅が32ビット幅であることに応じて、Kが必要とするビット幅が32ビット幅であると判断する。
ステップ714において、コンピュータ(101)は、キー値Kが必要とするビット幅が8ビット幅であることに応じて、処理をステップ715に進める。コンピュータ(101)は、キー値Kが必要とするビット幅が16ビット幅であることに応じて、処理をステップ718に進める。コンピュータ(101)は、キー値Kが必要とするビット幅が32ビット幅であることに応じて、処理をステップ721に進める。
ステップ715において、コンピュータ(101)は、キー値Kが必要とするビット幅が8ビット幅であることに応じて、8ビット幅のキーを持つ(中間)ノードを構成する部分ツリーの根ノード(又は、根ノードがない場合には最上位ノード)を取り出す。
ステップ716において、コンピュータ(101)は、ステップ715において取り出した根ノード又は当該実行中のステップ716のループ直前に実行されたステップ716で決定された子ノードについて、8ビット・データ幅を用いた比較を行うためのSIMD命令を用いて、上記キー値Kと上記根又は子ノード(中間ノード又は葉ノードでありうる)のキーとを比較して、次に辿るべき子ノードを決定する。
また、ステップ716において、コンピュータ(101)は、キー値Kを有効数とする最小ビット幅のグループに属するノードを発見しうる。当該キー値Kを有効数とする最小ビット幅のグループは、上記キー値Kを表現可能な最小のビット幅を有するグループである。
ステップ717において、コンピュータ(101)は、ステップ716において決定された根又は子ノードが葉ノードであるかを判定する。コンピュータ(101)は、当該根又は子ノードが葉ノードであることに応じて、処理をステップ724に進める。一方、コンピュータ(101)は、当該根又は子ノードが葉ノードでないことに応じて、次に辿る子ノードを決定する為に、処理をステップ716に戻す。
ステップ718において、コンピュータ(101)は、キー値Kが必要とするビット幅が16ビット幅であることに応じて、16ビット幅のキーを持つ(中間)ノードを構成する部分ツリーの根ノード(又は、根ノードがない場合には最上位ノード)を取り出す。
ステップ719において、コンピュータ(101)は、ステップ718において取り出した根ノード又は当該実行中のステップ719のループ直前に実行されたステップ719で決定された子ノードについて、16ビット・データ幅を用いた比較を行うためのSIMD命令を用いて、上記キー値Kと上記根又は子ノード(中間ノード又は葉ノードでありうる)のキーとを比較して、次に辿るべき子ノードを決定する。
また、ステップ719において、コンピュータ(101)は、キー値Kを有効数とする最小ビット幅のグループに属するノードを発見しうる。当該キー値Kを有効数とする最小ビット幅のグループは、上記キー値Kを表現可能な最小のビット幅を有するグループである。
ステップ720において、コンピュータ(101)は、ステップ719において決定された根又は子ノードが葉ノードであるかを判定する。コンピュータ(101)は、当該根又は子ノードが葉ノードであることに応じて、処理をステップ724に進める。一方、コンピュータ(101)は、当該根又は子ノードが葉ノードでないことに応じて、次に辿る子ノードを決定する為に、処理をステップ719に戻す。
ステップ721において、コンピュータ(101)は、キー値Kが必要とするビット幅が32ビット幅であることに応じて、32ビット幅のキーを持つ(中間)ノードを構成する部分ツリーの根ノード(又は、根ノードがない場合には最上位ノード)を取り出す。
ステップ722において、コンピュータ(101)は、ステップ721において取り出した根ノード又は当該実行中のステップ722のループ直前に実行されたステップ722で決定された子ノードについて、32ビット・データ幅を用いた比較を行うためのSIMD命令を用いて、上記キー値Kと上記根又は子ノード(中間ノード又は葉ノードでありうる)のキーとを比較して、次に辿るべき子ノードを決定する。
また、ステップ722において、コンピュータ(101)は、キー値Kを有効数とする最小ビット幅のグループに属するノードを発見しうる。当該キー値Kを有効数とする最小ビット幅のグループは、上記キー値Kを表現可能な最小のビット幅を有するグループである。
ステップ723において、コンピュータ(101)は、ステップ722において決定された根又は子ノードが葉ノードであるかを判定する。コンピュータ(101)は、当該根又は子ノードが葉ノードであることに応じて、処理をステップ724に進める。一方、コンピュータ(101)は、当該根又は子ノードが葉ノードでないことに応じて、次に辿る子ノードを決定する為に、処理をステップ722に戻す。
ステップ724において、コンピュータ(101)は、出力として、ステップ717、720又は723で決定された子ノード(葉ノードでもある)を、キー値Kを挿入すべき葉ノード又はキー値Kを持つ可能性がある葉ノードとする。
ステップ725において、コンピュータ(101)は、ステップ711で開始した上記処理を終了する。
図8Aは、本発明の実施態様に従い、上記検索手法1において使用するために構築されたツリー構造において、当該ツリーのノードにエントリを挿入して、ツリーを動的に再構築する処理のフローチャートを示す。
図8Aに示す処理において使用するために構築されたツリー構造はB+−ツリーであるとする。また、中間ノードのキー幅は、8ビット幅、16ビット幅、又は32ビット幅の3種類であるとする。
ステップ801において、コンピュータ(101)は、上記検索手法1において使用するために構築されたツリー構造において、当該ツリーのノードにエントリを挿入して、ツリーを動的に再構築する処理を開始する(図4Eに示すステップ1Bの処理に対応する)。
ステップ802において、コンピュータ(101)は、例えば図7Aに示すステップ709で出力される葉ノード(すなわち、キー値Kを挿入する葉ノード)にエントリを挿入しようとする(図4Eに示すステップ1Bの処理に対応する)。
ステップ803において、コンピュータ(101)は、上記葉ノードにエントリを挿入しようとすることで、当該葉ノードのエントリ数がオーバーフローするか(あふれるか)を判断する(図4Eに示すステップ2Bの処理に対応する)。コンピュータ(101)は、当該葉ノードのエントリ数がオーバーフローすることに応じて、当該葉ノードの分割処理をする為に、処理をステップ804に進める。一方、コンピュータ(101)は、当該葉ノードのエントリ数がオーバーフローしないことに応じて、上記葉ノードにエントリを挿入し、処理を終了ステップ813に進める。
ステップ804において、コンピュータ(101)は、上記葉ノードを2つの葉ノードに分割する(図4Eに示すステップ2Bの処理に対応する)。
ステップ805において、コンピュータ(101)は、上記分割して生じた2つの葉ノードのうちの一方にエントリを挿入する(図4Eに示すステップ2Bの処理に対応する)。
ステップ806において、コンピュータ(101)は、上記エントリを挿入した葉ノードについて、当該葉ノードの親ノードである中間ノードにリンクを張る(図4Eに示すステップ3Bの処理に対応する)。
ステップ807において、コンピュータ(101)は、上記中間ノードにリンクを張ることで、当該中間ノードのエントリ数がオーバーフローするかを判断する(図4Eに示すステップ4B及びステップ6Bの処理に対応する)。コンピュータ(101)は、当該中間ノードのエントリ数がオーバーフローすることに応じて、当該中間ノードの分割処理をする為に、処理をステップ808に進める。一方、コンピュータ(101)は、当該中間ノードのエントリ数がオーバーフローしないことに応じて、上記エントリを挿入した葉ノードの親ノードである中間ノードにリンクを張り、処理を終了ステップ813に進める。
ステップ808において、コンピュータ(101)は、上記中間ノードを2つの中間ノードに分割して、分割前の中間ノードと同じビット幅のキーを持つ中間ノード、又は、分割結果でより小さいビット幅のキーを持つ中間ノードが利用可能である場合には、当該利用可能なグループに属する中間ノードを作成する(図4Fに示すステップ4B及びステップ6Bの処理に対応する)。
ステップ809において、コンピュータ(101)は、オーバーフローしたノードに親ノードがあるかを判断する(図4Fに示すステップ4B及びステップ6Bの処理に対応する)。コンピュータ(101)は、オーバーフローしたノードに親ノードがあることに応じて、処理をステップ810に進める。一方、コンピュータ(101)は、オーバーフローしたノードに親ノードがないことに応じて、処理をステップ811に進める。
ステップ810において、コンピュータ(101)は、親ノードの中間ノードに作成されたノードに関するリンクを張る(図4Fに示すステップ5Bの処理に対応する)。コンピュータ(101)は、処理をステップ807に進めて、上記中間ノードにリンクを張ろうとすることで、当該中間ノードのエントリ数がオーバーフローするかを判断する。以降、コンピュータ(101)は、ステップ808以降の処理を繰り返す。
ステップ811において、コンピュータ(101)は、リンクを挿入する際に使用するキーのビット幅の最大のものが格納可能である、最小幅のキーを持つ親ノードを作成する(図4Gに示すステップ7Bの処理(親ノード(459)を作成すること)に対応する)。
ステップ812において、コンピュータ(101)は、ステップ811で作成した親ノードとステップ808で作成した中間ノードとの間にリンクを張る(図4Gに示すステップ7Bの処理(親ノード(459)と中間ノード(457)との間にリンクを張ること)に対応する)。
ステップ813において、コンピュータ(101)は、ステップ801で開始した上記処理を終了する。
図8Bは、本発明の実施態様に従い、上記検索手法2において使用するために構築されたツリー構造において、当該ツリーのノードにエントリを挿入して、ツリーを動的に再構築する処理のフローチャートを示す。
図8Bに示す処理において使用するために構築されたツリー構造はB+−ツリーであるとする。また、中間ノードのキー幅は、8ビット幅、16ビット幅、又は32ビット幅の3種類であるとする。
ステップ821において、コンピュータ(101)は、上記検索手法2において使用するために構築されたツリー構造において、当該ツリーのノードにエントリを挿入して、ツリーを動的に再構築する処理を開始する(図5Cに示すステップ1Dの処理に対応する)。
ステップ822において、コンピュータ(101)は、例えば図7Bに示すステップ724で出力される葉ノード(すなわち、キー値Kを挿入する葉ノード)にエントリを挿入しようとする(図5Cに示すステップ1Dの処理に対応する)。
ステップ823において、コンピュータ(101)は、上記葉ノードにエントリを挿入しようとすることで、当該葉ノードのエントリ数がオーバーフローするか(あふれるか)を判断する(図5Cに示すステップ2Dの処理に対応する)。コンピュータ(101)は、当該葉ノードのエントリ数がオーバーフローすることに応じて、当該葉ノードの分割処理をする為に、処理をステップ824に進める。一方、コンピュータ(101)は、当該葉ノードのエントリ数がオーバーフローしないことに応じて、上記葉ノードにエントリを挿入し、処理を終了ステップ833に進める。
ステップ824において、コンピュータ(101)は、上記葉ノードを2つの葉ノードに分割する(図5Cに示すステップ2Dの処理に対応する)。
ステップ825において、コンピュータ(101)は、上記分割して生じた2つの葉ノードのうちの一方にエントリを挿入する(図5Cに示すステップ2Dの処理に対応する)。
ステップ826において、コンピュータ(101)は、上記エントリを挿入した葉ノードについて、当該葉ノードの親ノードである中間ノードにリンクを張る(図5Dに示すステップ3Dの処理に対応する)。
ステップ827において、コンピュータ(101)は、上記中間ノードにリンクを張ることで、当該中間ノードのエントリ数がオーバーフローするかを判断する(図5Dに示すステップ4D及びステップ6Dの処理に対応する)。コンピュータ(101)は、当該中間ノードのエントリ数がオーバーフローすることに応じて、当該中間ノードの分割処理をする為に、処理をステップ828に進める。一方、コンピュータ(101)は、当該中間ノードのエントリ数がオーバーフローしないことに応じて、上記エントリを挿入した葉ノードの親ノードである中間ノードにリンクを張り、処理を終了ステップ833に進める。
ステップ828において、コンピュータ(101)は、上記中間ノードを2つの中間ノードに分割して、分割前の中間ノードと同じビット幅のキーを持つ中間ノードを作成する(図5Dに示すステップ4D及びステップ6Dの処理に対応する)。
ステップ829において、コンピュータ(101)は、オーバーフローしたノードに親ノードがあるかを判断する(図5Dに示すステップ4D及びステップ6Dの処理に対応する)。コンピュータ(101)は、オーバーフローしたノードに親ノードがあることに応じて、処理をステップ830に進める。一方、コンピュータ(101)は、オーバーフローしたノードに親ノードがないことに応じて、処理をステップ831に進める。
ステップ830において、コンピュータ(101)は、親ノードの中間ノードに作成されたノードに関するリンクを張る(図5Dに示すステップ5Dの処理に対応する)。コンピュータ(101)は、処理をステップ827に進めて、上記中間ノードにリンクを張ろうとすることで、当該中間ノードのエントリ数がオーバーフローするかを判断する。以降、コンピュータ(101)は、ステップ828以降の処理を繰り返す。
ステップ831において、コンピュータ(101)は、現在着目しているノードと同じビット幅のキーを持つ親ノードを作成する(図5Dに示すステップ6Dの処理(親ノード(547)を作成すること)に対応する)。
ステップ832において、コンピュータ(101)はステップ831で作成した、親ノードとステップ820で作成した中間ノードとの間にリンクを張る(図5Eに示すステップ7Dの処理(親ノード(547)と中間ノード(546)との間にリンクを張ること)に対応する)。
ステップ833において、コンピュータ(101)は、ステップ821で開始した上記処理を終了する。
図9は、図1に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従い、予め決められた複数のビット幅のデータに対して操作を行う命令を使用してツリーの検索を行うためのコンピュータの機能ブロック図の一例を示した図である。
コンピュータ(901)は、本発明の実施態様に従い、予め決められた複数のビット幅のデータに対して操作を行う命令を使用してツリーの検索を行うためのコンピュータであり、例えば図1に示すコンピュータ(101)である。
コンピュータ(901)は、ツリー構築手段(911)及びデータ検索手段(912)、並びに、メモリ(913)を備えている。
ツリー構築手段(911)は、ツリーのノードを、上記複数のビット幅のうち、キーの値を表現可能な最小のビット幅を有するグループに分類して、上記ツリーを構築する。
また、ツリー構築手段(911)は、挿入されるキーの値を有効数とする最小ビット幅のグループに属するノードに上記キーを挿入する。
また、ツリー構築手段(911)は、上記キーの値を有効数とする最小ビット幅のグループに属するノードを発見する。ここで、上記キーの値を有効数とする最小ビット幅の上記グループが、上記挿入されるキーの値を表現可能な最小のビット幅を有するグループである。
また、ツリー構築手段(911)は、上記発見したノードが、上記挿入されるキーの挿入によってあふれることに応じて、上記発見したノード又は当該発見したノードの上位にあるノードを分割する。
また、ツリー構築手段(911)は、上記検索手法1に従うツリー(図2を参照)を構築する為に、任意的に、上記ノードそれぞれに上記グループを識別する識別子を付与する。
また、ツリー構築手段(911)は、上記検索手法1に従うツリー(図2を参照)を構築する為に、上記ツリーの根ノード以外のノードが、複数のビット幅のうち、キーの値を表現可能な最小のビット幅を有するように、上記ツリーを構築する。
また、ツリー構築手段(911)は、上記検索手法1に従うツリー(図2を参照)を構築する為に、上記ツリーの根ノードが、複数のビット幅のうち、キーの値を表現可能な最小のビット幅を有する少なくとも2つのグループを下位にあるノードとして有するように、上記ツリーを構築する。
また、ツリー構築手段(911)は、上記検索手法2に従うツリー(図3A及び図3Bを参照)を構築する為に、各グループを、根ノードを親ノードとするサブツリーとして構築する。
また、ツリー構築手段(911)は、上記検索手法2に従うツリー(図3Cを参照)を構築する為に、グループそれぞれを、部分ツリーとして構築する。
ツリー構築手段(911)は、図6に示すステップ602〜604、図7Aに示す全ステップ(キーの値Kを挿入すべき葉ノードの発見処理、及び、キーの値Kを持つ可能性がある葉ノードの発見処理)、図7Bに示す全ステップ(キーの値Kを挿入すべき葉ノードの発見処理、及び、キーの値Kを持つ可能性がある葉ノードの発見処理)、並びに、図8Aに示す全ステップ、及び、図8Bに示す全ステップを実行しうる。
また、データ検索手段(912)は、検索キーの値を有効数とする最小ビット幅のグループに対応する上記命令を使用して、上記検索キーの値を有効数とする最小ビット幅の上記グループからデータを検索する。
また、データ検索手段(912)は、上記検索手法1の為に構築されたツリーであって、当該ツリーの各ノードそれぞれに上記グループを識別する識別子が付与されている当該ツリー(図2を参照)において、当該構築されたツリーのノードを辿って、上記識別子により各ノードが属するグループを判定し、当該判定されたグループに対応する命令を使用して、上記データを検索する。
データ検索手段(912)は、上記検索手法2の為に構築されたツリー(図3A及び図3Bを参照)において、上記サブツリーに対応する命令(例えば、SIMD命令)を使用して、上記データを検索する。
また、データ検索手段(912)は、上記検索手法2の為に構築されたツリー(図3Cを参照)において、上記部分ツリーに対応する命令(例えば、SIMD命令)を使用して、上記データを検索する。
データ検索手段(912)は、図6に示すステップ605を実行しうる。
コンピュータ(901)は、記憶媒体(921)から、ツリー構築対象のプログラムをメモリ(913)に読み出して、当該メモリ(913)に読み出したプログラムをツリー構築手段(911)に渡す。
また、コンピュータ(901)は、データ検索手段(912)がデータを検索することを可能にする為に、ツリー構築手段(911)が構築したツリーをメモリ(913)中に記憶する。
(実施例)
IBM(登録商標) Cognos(登録商標) Business Intelligence 10.2.1では、TPC−DSベンチマークを元にしたベンチマーク・プログラムの一つにおいて、ツリーにキーを挿入する処理でプログラムの実行時間の15%を費やす。
従って、IBM(登録商標) Cognos(登録商標)Business Intelligence 10.2.1を高速化する為にも、ツリー構造において、ツリーのノードにエントリを挿入する操作を高速化することが重要となってくる。
上記ベンチマーク・プログラムでは、ツリーのノードに約666,000個のエントリの挿入が数回行われる。当該約666,000個のエントリの挿入の際に使用されるキーの順列を取得し、上記ツリーのノードへの挿入を当該同じキーの順列を用いて実行するC言語で記述された単体ベンチマーク・プログラムを用意した。
本発明の実施態様に従う検索手法2において使用されるツリーを使用して、及び従来手法で構築されたツリーを使用して、POWER7上で、上記単体ベンチマーク・プログラムを実行した。具体的には、longのキーの比較に絞って、本発明の実施態様に従い32ビット幅又は64ビット幅でキーの比較のみを行うSIMD化されたB+−ツリーと、従来手法に従い64ビット幅でキーの比較のみを行うSIMD化されたB+−ツリーとの間で比較を行った。その結果、本発明の実施態様に従う検索手法2において使用されるツリーを使用した場合、従来手法で構築されたツリーを使用した場合と比べて、実行時間が41.2%減少した。