(57)【特許請求の範囲】
【請求項１】
コンピュータが実行するマージソート方法であって、昇順あるいは降順にソート済みのビット列からなるキーを格納した複数のソート済みキー記憶領域からそれぞれ最小値あるいは最大値であるキーを取り出してマージ用キー列を生成し、該マージ用キー列のうちの最小値あるいは最大値であるものを該マージ用キー列から取り出してマージ済みキー記憶領域に格納し、該マージ済みキー記憶領域に格納されたキーが取り出された前記ソート済みキー記憶領域から次の最小値あるいは次の最大値である次のキーを取り出して前記マージ用キー列に挿入し、該マージ用キー列のうちの最小値あるいは最大値であるキーを該マージ用キー列から取り出して前記マージ済みキー記憶領域に格納することを前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納するまで繰り返すことにより、前記複数のソート済みキー記憶領域に格納された全てのキーを昇順あるいは降順にソートするビット列のマージソート方法において、
前記マージ用キー列のキーを、
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが１つのときは前記リーフノード、ツリーのノードが２つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含み、前記ツリーの任意のノードを検索開始ノードとして前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索結果である検索結果キーとするように構成されたカップルドノードツリー上のインデックスキーとして保持するとともに、前記リーフノードは前記キーの格納されていた前記ソート済みキー記憶領域を識別する処理元識別子を含むものとし、
前記ソート済みのキーを格納した複数のソート済みキー記憶領域からそれぞれ最小あるいは最大のキーを取り出して前記カップルドノードツリーを生成するマージツリー生成ステップと、
該カップルドノードツリーを用いて最小値あるいは最大値検索を行い、検索結果の最小値である最小キーあるいは最大値である最大キーと前記処理元識別子を取得し該最小キーあるいは最大キーを前記マージ済みキー記憶領域に格納するマージステップと、
該最小キーあるいは最大キーを前記カップルドノードツリーから削除するキー削除ステップと、
前記マージステップにおいて取得された処理元識別子が示す前記ソート済みキー記憶領域から前記最小キーの次の最小値である次のキーあるいは前記最大キーの次の最大値である次のキーを取り出す次キー取り出しステップと、
該取り出した次のキーを前記カップルドノードツリーに挿入する次キー挿入ステップと、
を備え、
前記マージステップ、前記キー削除ステップ、前記次キー取り出しステップ及び前記次キー挿入ステップを、前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納するまで繰り返すことにより、
前記複数のソート済みキー記憶領域に格納されたキーを昇順あるいは降順に前記マージ済みキー記憶領域に格納することを特徴とするビット列のマージソート方法。
【請求項２】
請求項１に記載のビット列のマージソート方法において、
前記次キー取り出しステップは、前記取得された処理元識別子が示す前記ソート済みキー記憶領域から前記次のキーが取り出せたか判定する次キー取り出し判定ステップを含み、
該次キー取り出し判定ステップで前記次のキーが取り出せないと判定した場合に、前記次キー挿入ステップをスキップすることを特徴とするビット列のマージソート方法。
【請求項３】
請求項２に記載のビット列のマージソート方法において、
前記キー削除ステップは、前記最小キーあるいは最大キーを前記カップルドノードツリーから削除した後に前記カップルドノードツリーの前記ルートノードが登録されているか判定するルートノード登録判定ステップを含み、
前記ルートノード登録判定ステップにおいて前記ルートノードが登録されていないと判定された場合に未取り出しのキーが存在する前記ソート済みキー記憶領域から順次最大あるいは最小のキーまで取り出して前記マージ済みキー記憶領域に格納する最終マージステップを備えることを特徴とするビット列のマージソート方法。
【請求項４】
請求項１に記載のビット列のマージソート方法において、
前記キー削除ステップ、前記次キー取り出しステップ及び前記次キー挿入ステップの実行順序を、前記次キー取り出しステップ、前記次キー挿入ステップ及び前記キー削除ステップの実行順序とすることを特徴とするビット列のマージソート方法。
【請求項５】
請求項４に記載のビット列のマージソート方法において、
前記削除された最小値あるいは最大値を含むノードの直近上位のノードを前記マージステップにおける最小値あるいは最大値検索の検索開始ノードとすることを特徴とするビット列のマージソート方法。
【請求項６】
請求項５に記載のビット列のマージソート方法において、
前記挿入された次のキーをインデックスキーとして含むノードの直近上位のノードである挿入ノードが、前記最小値検索あるいは最大値検索におけるルートノードから該最小値あるいは最大値を含むリーフノードに至る検索経路に存在するか判定する挿入ノード検索ステップと、
前記挿入ノード検索ステップで該挿入ノードが前記検索経路に存在すると判定されるとルートノードを検索開始ノードとして再度最小値検索あるいは最大値検索を行う再検索ステップと、
を備えることを特徴とするビット列のマージソート方法。
【請求項７】
請求項１に記載のビット列のマージソート方法において、
前記キー削除ステップの次に、該キー削除ステップで削除された最小値あるいは最大値を含むノードの直近上位のノードを検索開始ノードとして最小値あるいは最大値検索を行う中間検索ステップと、
前記次キー取り出しステップの次に、該次キー取り出しステップで取り出した前記次のキーが前記中間検索ステップで求めた最小値あるいは最大値より小さいかあるいは大きいか判定する次キー大小判定ステップを備え、
前記次のキーが前記最小値あるいは最大値より小さいかあるいは大きい場合、該次のキーを前記マージ済みキー記憶領域に格納して再度前記次キー取り出しステップを実行し、
前記次のキーが前記最小値あるいは最大値より大きいかあるいは小さい場合、前記次キー挿入ステップを実行することを特徴とするビット列のマージソート方法。
【請求項８】
請求項７に記載のビット列のマージソート方法において、
前記次キー取り出しステップは、前記取得された処理元識別子が示す前記ソート済みキー記憶領域から前記次のキーが取り出せたか判定する次キー取り出し判定ステップを含み、
該次キー取り出し判定ステップで前記次のキーが取り出せないと判定した場合に、前記次キー挿入ステップとルートノードを検索開始ノードとして最小値検索あるいは最大値検索を行う検索ステップとをスキップすることを特徴とするビット列のマージソート方法。
【請求項９】
請求項１〜８のいずれか１項に記載のビット列のマージソート方法において、
前記カップルドノードツリーのリーフノードには、処理元識別子とインデックスキーに替えて、該処理元識別子とインデックスキーの配置された領域へのポインタを格納し、処理元識別子とインデックスキーの取得は、該ポインタを介して行われることを特徴とするビット列のマージソート方法。
【請求項１０】
請求項１〜９のいずれか１項に記載のビット列のマージソート方法をコンピュータに実行させるためのプログラム。
【請求項１１】
請求項１〜９のいずれか１項に記載のビット列のマージソート方法をコンピュータに実行させるためのプログラムを記憶したことを特徴とするコンピュータ読み取り可能な記憶媒体。
【請求項１２】
コンピュータが実行するマージソート方法であって、昇順あるいは降順にソート済みのビット列からなるキーを格納した複数のソート済みキー記憶領域からそれぞれ最小値あるいは最大値であるキーを取り出してマージ用キー列を生成し、該マージ用キー列のうちの最小値あるいは最大値であるものを該マージ用キー列から取り出してマージ済みキー記憶領域に格納し、該マージ済みキー記憶領域に格納されたキーが取り出された前記ソート済みキー記憶領域から次の最小値あるいは次の最大値である次のキーを取り出して前記マージ用キー列に挿入し、該マージ用キー列のうちの最小値あるいは最大値であるキーを該マージ用キー列から取り出して前記マージ済みキー記憶領域に格納することを前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納するまで繰り返すことにより、前記複数のソート済みキー記憶領域に格納された全てのキーを昇順あるいは降順にソートするビット列のマージソート方法におけるマージ用キー列のためのツリー状のデータ構造において、
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるカップルドノードツリーであって、
前記ルートノードは、前記ツリーの始点を表すノードであって、該ツリーのノードが１つのときは前記リーフノード、該ツリーのノードが２つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードの位置を示す情報を含み、
前記リーフノードは、前記ソート済みキー記憶領域から取り出したキーであって検索対象のビット列からなるインデックスキーと前記キーの格納されていた前記ソート済みキー記憶領域を識別する処理元識別子を含むものであり、
前記コンピュータが、
前記ソート済みのキーを格納した複数のソート済みキー記憶領域からそれぞれ最小あるいは最大のキーを取り出して前記カップルドノードツリーを生成するマージツリー生成ステップと、
該カップルドノードツリーを用いて最小値あるいは最大値検索を行い、検索結果の最小値である最小キーあるいは最大値である最大キーと前記処理元識別子を取得し該最小キーあるいは最大キーを前記マージ済みキー記憶領域に格納するマージステップと、
該最小キーあるいは最大キーを前記カップルドノードツリーから削除するキー削除ステップと、
前記マージステップにおいて取得された処理元識別子が示す前記ソート済みキー記憶領域から前記最小キーの次の最小値である次のキーあるいは前記最大キーの次の最大値である次のキーを取り出す次キー取り出しステップと、
該取り出した次のキーを前記カップルドノードツリーに挿入する次キー挿入ステップと、
を備え、
前記マージステップ、前記キー削除ステップ、前記次キー取り出しステップ及び前記次キー挿入ステップを、前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納するまで繰り返すことにより、
前記複数のソート済みキー記憶領域に格納されたキーを昇順あるいは降順に前記マージ済みキー記憶領域に格納するビット列のマージソート方法、
を実行することを可能とすることを特徴とするデータ構造。
【請求項１３】
請求項１２記載のデータ構造を有するデータを記憶したことを特徴とするコンピュータ読み取り可能な記憶媒体。
【請求項１４】
昇順あるいは降順にソート済みのビット列からなるキーを格納した複数のソート済みキー記憶領域からそれぞれ最小値あるいは最大値であるキーを取り出してマージ用キー列を生成し、該マージ用キー列のうちの最小値あるいは最大値であるものを該マージ用キー列から取り出してマージ済みキー記憶領域に格納し、該マージ済みキー記憶領域に格納されたキーが取り出された前記ソート済みキー記憶領域から次の最小値あるいは次の最大値である次のキーを取り出して前記マージ用キー列に挿入し、該マージ用キー列のうちの最小値あるいは最大値であるキーを該マージ用キー列から取り出して前記マージ済みキー記憶領域に格納することを前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納するまで繰り返すことにより、前記複数のソート済みキー記憶領域に格納された全てのキーを昇順あるいは降順にソートするビット列のマージソート装置において、
前記マージ用キー列のキーを、
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが１つのときは前記リーフノード、ツリーのノードが２つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは、検索対象のビット列からなるインデックスキーと前記キーの格納されていた前記ソート済みキー記憶領域を識別する処理元識別子を含み、前記ツリーの任意のノードを検索開始ノードとして前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索結果である検索結果キーとするように構成されたカップルドノードツリー上のインデックスキーとして保持するマージツリー格納手段と、
前記ソート済みのキーを格納した複数のソート済みキー記憶領域からそれぞれ最小あるいは最大のキーを取り出して前記カップルドノードツリーを生成して前記マージツリー格納手段に格納するマージツリー生成手段と、
該カップルドノードツリーを用いて最小値あるいは最大値検索を行い、検索結果の最小値である最小キーあるいは最大値である最大キーと前記処理元識別子を取得し該最小キーあるいは最大キーを前記マージ済みキー記憶領域に格納するとともに、該最小キーあるいは最大キーを前記カップルドノードツリーから削除するマージ手段と、
前記マージ手段により取得された処理元識別子が示す前記ソート済みキー記憶領域から前記最小キーの次の最小値である次のキーあるいは前記最大キーの次の最大値である次のキーを取り出すとともに、該取り出した次のキーを前記カップルドノードツリーに挿入する次キー挿入手段と、
を備え、
前記マージ手段、及び前記次キー挿入手段により、前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納することにより、
前記複数のソート済みキー記憶領域に格納されたキーを昇順あるいは降順に前記マージ済みキー記憶領域に格納することを特徴とするビット列のマージソート装置。
【請求項１５】
請求項１４に記載のビット列のマージソート装置において、
前記マージ手段は、該削除した最小値あるいは最大値を含むノードの直近上位のノードを検索開始ノードとして最小値あるいは最大値検索を行う中間検索部を備えるとともに、
前記次キー挿入手段は、前記取り出した次のキーが、前記中間検索部が求めた最小値あるいは最大値より小さいかあるいは大きいか判定する次キー大小判定部を備え、
前記次キー判定部が、前記次のキーが前記最小値あるいは最大値より小さいかあるいは大きいと判定すると、
前記マージ手段は該次のキーを前記マージ済みキー記憶領域に格納し、
前記次キー挿入手段は再度前記次キーを取り出し、
前記次キー判定部が、前記次のキーが前記最小値あるいは最大値より大きいかあるいは小さいと判定すると、
前記次キー挿入手段は該次のキーを前記カップルドノードツリーに挿入することを特徴とするビット列のマージソート装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ビット列のマージソート装置及び方法とその方法をコンピュータに実行させるプログラムに関する。
【背景技術】
【０００２】
近年、社会の情報化が進展し、大規模なデータベースが各所で利用されるようになってきている。このような大規模なデータベースからレコードを検索するには、各レコードの記憶されたアドレスと対応づけられたレコード内の項目をインデックスキーとして検索をし、所望のレコードを探し出すことが通例である。また、全文検索における文字列も、文書のインデックスキーと見なすことができる。
【０００３】
そして、それらのインデックスキーはビット列で表現されることから、データベースの検索はビット列の検索に帰着されるということができる。
一方、データベースに関連した処理として、下記特許文献１及び下記特許文献２に記載されているように、データベース中のレコードのマージソートが行われている。このマージソートもビット列のマージソートに帰着される。
【０００４】
基本的なマージソートの手法は、データを２個の対まで分割してそれを並び替え、並び替えられたものを組み合せて行くものである。つまり、ソート対象データの分割を繰り返しながらソートして複数のソート済みのデータを得る前段の処理と、ソート済みのデータのマージを繰り返してソート対象データ全体のソートを行う後段の処理に分かれる。
【０００５】
特許文献２には、マージソートの後段の処理について図１Ａに示す処理が開示されている。
図１Ａに示すように、ブロック１〜ブロックＮにはソート済みのデータが格納されており、ブロック１の最小値は１３、ブロック２の最小値は８で、次に大きいデータは２２であることが例示されている。同様に、ブロック３の最小値が５３、ブロック４の最小値が２４、ブロックＮの最小値が９であると例示されている。
【０００６】
マージソートの後段の処理は、上記ブロック１〜ブロックＮの存在を前提としたものであり、まず、各ブロックの最小値によるデータ列を生成する。図１Ａの例示では、ブロック１、ブロック２、ブロック３、ブロック４、・・・、ブロックＮの最小値によるデータ列＜１３，８，５３，２４，・・・,９＞が生成されている。次にそのデータ列をソートしてソート済みのデータ列＜８，９，１３，１５，・・・,１００＞を生成し、最小値８を出力している。そして、この最小値８が格納されていたブロック２から次のデータ２２を取り出し、ソート済みのデータ列へのデータ２２の挿入位置を求めてデータ２２を挿入し、ソート済みのデータ列の次の最小値を出力することを繰り返すことで、ブロック１〜ブロックＮに格納されたデータのマージを行い、データ全体のソートを完了させる。
【０００７】
上述のように、マージソートの後段の処理においては、次のデータのソート済みデータ列への挿入位置を求める必要がある。この挿入位置を求めるために、次のデータをキーとしてソート済みデータ列に含まれるデータとの比較処理を行うことになるが、この比較処理を伴う挿入処理は次のデータを検索キーとしたソート済みデータ列の検索処理、すなわちビット列の検索処理に帰着される。
【０００８】
ビット列の検索処理手法については、種々のものが知られている。それらのなかでも、ビット列の検索を高速に行うために、ビット列を記憶するデータ構造を種々に工夫することが従来から行われている。このようなものの一つとして、パトリシアツリーという木構造が知られている。
【０００９】
図１Ｂは、上述の従来の検索処理に用いられているパトリシアツリーの一例を示すものである。パトリシアツリーのノードは、インデックスキー、検索キーの検査ビット位置、左右のリンクポインタを含んで構成される。明示はされていないが、ノードにはインデックスキーに対応するレコードにアクセスするための情報が含まれていることは勿論である。
【００１０】
図１Ｂの例では、インデックスキー“１０００１０”を保持するノード１７５０ａがルートノードとなっており、その検査ビット位置は０である。ノード１７５０ａの左リンク１７４０ａにはノード１７５０ｂが接続され、右リンク１７４１ａにはノード１７５０ｆが接続されている。
【００１１】
ノード１７５０ｂの保持するインデックスキーは“０１００１１”であり、検査ビット位置２０３０ｂは１である。ノード１７５０ｂの左リンク１７４０ｂにはノード１７５０ｃが、右リンク１７４１ｂにはノード１７５０ｄが接続されている。ノード１７５０ｃが保持するインデックスキーは“０００１１１”、検査ビット位置は３である。ノード１７５０ｄが保持するインデックスキーは“０１１０１０”、検査ビット位置は２である。
【００１２】
ノード１７５０ｃから実線で接続された部分はノード１７５０ｃの左右のリンクポインタを示すものであり、点線の接続されていない左ポインタ１７４０ｃは、その欄が空欄であることを示している。点線の接続された右ポインタ１７４１ｃの点線の接続先は、ポインタの示すアドレスを表しており、今の場合ノード１７５０ｃを右ポインタが指定していることを表している。
【００１３】
ノード１７５０ｄの右ポインタ１７４１ｄはノード１７５０ｄ自身を指しており、左リンク１７４０ｄにはノード１７５０ｅが接続されている。ノード１７５０ｅの保持するインデックスキーは“０１００１０”、検査ビット位置は５である。ノード１７５０ｅの左ポインタ１７４０ｅはノード１７５０ｂを、右ポインタ１７４１ｅはノード１７５０ｅを指している。
【００１４】
また、ノード１７５０ｆの保持するインデックスキーは“１０１０１１”であり、検査ビット位置１７３０ｆは２である。ノード１７５０ｆの左リンク１７４０ｆにはノード１７５０ｇが、右リンク１７４１ｆにはノード１７５０ｈが接続されている。
【００１５】
ノード１７５０ｇの保持するインデックスキーは“１０００１１”であり、検査ビット位置１７３０ｇは５である。ノード１７５０ｇの左ポインタ１７４０ｇはノード１７５０ａを、右ポインタ１７４１ｇはノード１７５０ｇを指している。
【００１６】
ノード１７５０ｈの保持するインデックスキーは“１０１１００”であり、検査ビット位置１７３０ｈは３である。ノード１７５０ｈの左ポインタ１７４０ｈはノード１７５０ｆを、右ポインタ１７４１ｈはノード１７５０ｈを指している。
【００１７】
図１Ｂの例では、ルートノード１７５０ａからツリーを降りるにしたがって、各ノードの検査ビット位置が大きくなるように構成されている。
ある検索キーで検索を行うとき、ルートノードから順次各ノードに保持される検索キーの検査ビット位置を検査していき、検査ビット位置のビット値が１であるか０であるか判定を行い、１であれば右リンクをたどり、０であれば左リンクをたどる。そして、リンク先のノードの検査ビット位置がリンク元のノードの検査ビット位置より大きくなければ、すなわち、リンク先が下方でなく上方に戻れば（図１Ｂにおいて点線で示されたこの逆戻りのリンクをバックリンクという）、リンク先のノードのインデックスキーと検索キーの比較を行う。比較の結果、等しければ検索成功であり、等しくなければ検索失敗であることが保証されている。
【００１８】
上記のように、パトリシアツリーを用いた検索処理では、必要なビットの検査だけで検索できること、キー全体の比較は１回ですむことなどのメリットがあるが、各ノードからの２つのリンクが必ずあることにより記憶容量が増大することや、バックリンクの存在による判定処理の複雑化、バックリンクにより戻ることで初めてインデックスキーと比較することによる検索処理の遅延及び追加削除等データメンテナンスの困難性などの欠点がある。
【００１９】
これらのパトリシアツリーの欠点を解消しようとするものとして、例えば下記特許文献３に開示された技術がある。下記特許文献３に記載されたパトリシアツリーにおいては、下位の左右のノードは連続した領域に記憶することによりポインタの記憶容量を削減するとともに、次のリンクがバックリンクであるか否かを示すビットを各ノードに設けることにより、バックリンクの判定処理を軽減している。
【００２０】
しかしながら、下記特許文献３に開示されたものにおいても、１つのノードは必ずインデックスキーの領域とポインタの領域を占めること、下位の左右のノードを連続した領域に記憶するようにしてポインタを１つとしたため、例えば図１Ｂに示したパトリシアツリーの最下段の部分である左ポインタ１７４０ｃ、右ポインタ１７４１ｈ等の部分にもノードと同じ容量の記憶領域を割り当てる必要があるなど、記憶容量の削減効果はあまり大きいものではない。また、バックリンクによる検索処理の遅延の問題や追加削除等の処理が困難であることも改善されていない。
【００２１】
したがって、超大量のデータのソートマージを実行しようとすると大量のコンピュータ資源を長時間占有することとなり、非常にコストの高いものとなる。
【特許文献１】特開２０００−０１０７６１号公報
【特許文献２】特開２００６−１６３５６５号公報
【特許文献３】特開２００１−３５７０７０号公報
【発明の開示】
【発明が解決しようとする課題】
【００２２】
そこで、本発明が解決しようとする課題は、高速なビット列検索手法を応用して効率的なソートマージ手法を提供することである。
上述の従来の検索手法における問題点を解決するものとして、本出願人は、特願２００６−１８７８２７において、ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対からなるビット列検索に用いるツリーであって、ルートノードはツリーの始点を表すノードであって、該ツリーのノードが１つのときはリーフノード、ツリーのノードが２つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードの位置を示す位置情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索を提案した。
【００２３】
上記出願においては、与えられたインデックスキーの集合からカップルドノードツリーを生成する方法と、カップルドノードツリーから単一のインデックスキーを検索する手法等の、カップルドノードツリーを用いた基本的な検索手法が示されている。
【００２４】
また、ビット列の検索には、最小値、最大値を求める、ある範囲の値のものを求める等の各種の検索要求が存在する。そこで、本出願人は、特願２００６−２９３６１９において、カップルドノードツリーの任意の部分木に含まれるインデックスキーの最大値／最小値を求める手法等を提案した。
【００２５】
さらに本出願人は、特願２００７−１１４９１５において、インデックスキーをカップルドノードツリーとは別の領域に配置し、リーフノードにはインデックスキーに代えてインデックスキーの配置された領域へのポインタを格納したカップルドノードツリーとそれを用いた各種検索処理を提案した。
【００２６】
本発明は、このカップルドノードツリーを応用した高速なマージソート手法を実現することを目的とする。
【課題を解決するための手段】
【００２７】
本発明は、昇順あるいは降順にソート済みのビット列からなるキーを格納した複数のソート済みキー記憶領域からそれぞれ最小あるいは最大のキーをインデックスキーとして取り出すとともに、取り出し元であるソート済みキー記憶領域を識別する処理元識別子を付加してマージ用のカップルドノードツリーを生成し、カップルドノードツリーの最小値あるいは最大値検索によるキーのマージ済みキー記憶領域への書き出しと削除処理、及び、ソート済みキー記憶領域からキーを取り出しての挿入処理を繰り返し実行することにより、マージソートを実現する。
【発明の効果】
【００２８】
本発明によれば、マージ用キー列をカップルドノードツリーの構造を持つものとすることにより、マージ用キー列での最小値あるいは最大値検索処理、キーの削除と挿入処理を高速化することができるので、高速なマージソート手法を実現することができる。
【発明を実施するための最良の形態】
【００２９】
まず、図２Ａ及び図２Ｂを参照して、第１の実施形態に係るカップルドノードツリーを配列に格納する例について説明する。ブランチノードが保持するリンク先の位置を示すデータとして、記憶装置のアドレス情報とすることもできるが、ブランチノードあるいはリーフノードのうち占有する領域の記憶容量の大きい方を格納可能な配列要素からなる配列を用いることにより、ノードの位置を配列番号で表すことができ、位置情報の情報量を削減することができる。
【００３０】
図２Ａは、本実施形態に係る、配列に格納されたカップルドノードツリーの構成例を説明する図である。
図２Ａを参照すると、ノード１０１が配列１００の配列番号１０の配列要素に配置されている。ノード１０１はノード種別１０２、弁別ビット位置１０３及び代表ノード番号１０４で構成されている。ノード種別１０２は０であり、ノード１０１がブランチノードであることを示している。弁別ビット位置１０３には１が格納されている。代表ノード番号１０４にはリンク先のノード対の代表ノードの配列番号２０が格納されている。なお、以下では表記の簡略化のため、代表ノード番号に格納された配列番号を代表ノード番号ということもある。また、代表ノード番号に格納された配列番号をそのノードに付した符号あるいはノード対に付した符号で表すこともある。
【００３１】
配列番号２０の配列要素には、ノード対１１１の代表ノードであるノード［０］１１２が格納されている。そして隣接する次の配列要素（配列番号２０＋１）に代表ノードと対になるノード［１］１１３が格納されている。ノード［０］１１２のノード種別１１４には０が、弁別ビット位置１１５には３が、代表ノード番号１１６には３０が格納されている。またノード［１］１１３のノード種別１１７には１が格納されており、ノード［１］１１３がリーフノードであることを示している。インデックスキー１１８には、“０００１”が格納されている。パトリシアツリーについて先に述べたと同様に、リーフノードにインデックスキーと対応するレコードにアクセスする情報を含まれることは当然であるが、表記は省略している。
【００３２】
ノード［１］１１３には、さらに処理元識別子１１９の領域があり、図の例では“Ａ”が格納されている。処理元識別子１１９の領域を設けたところが、先の出願である特願２００６−１８７８２７において提案したカップルドノードツリーのリーフノードと異なる点である。本実施形態においては、リーフノードに処理元識別子１１９の領域を設け、そのリーフノードにインデックスキーとして格納されているビット列が、どのソート済みキーの記憶領域から取り出され、カップルドノードツリーに挿入されたかを識別するのに用いられる。
【００３３】
なお、代表ノードをノード［０］で表し、それと対になるノードをノード［１］で表すことがある。また、ある配列番号の配列要素に格納されたノードを、その配列番号のノードということがあり、ノードの格納された配列要素の配列番号を、ノードの配列番号ということもある。
【００３４】
配列番号３０及び３１の配列要素に格納されたノード１２２とノード１２３からなるノード対１２１の内容は省略されている。
ノード［０］１１２、ノード［１］１１３、ノード１２２、及びノード１２３の格納された配列要素にそれぞれ付された０あるいは１は、検索キーで検索を行う場合にノード対のどちらのノードにリンクするかを示すものである。前段のブランチノードの弁別ビット位置にある検索キーのビット値である０か１を代表ノード番号に加えた配列番号のノードにリンクする。
【００３５】
したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置のビット値を加えることにより、リンク先のノードが格納された配列要素の配列番号を求めることができる。
【００３６】
なお、上記の例では代表ノード番号をノード対の配置された配列番号のうち小さい方を採用しているが、大きいほうを採用することも可能であることは明らかである。
図２Ｂは、本実施形態に係るカップルドノードツリーのツリー構造を概念的に示す図である。図示の６ビットのインデックスキーは、図１Ｂに例示されたパトリシアツリーのものと同じである。
【００３７】
符号２１０ａで示すのがルートノードである。図示の例では、ルートノード２１０ａは配列番号２２０に配置されたノード対２０１ａの代表ノードとしている。
ツリー構造としては、ルートノード２１０ａの下にノート対２０１ｂが、その下層にノード対２０１ｃとノード対２０１ｆが配置され、ノード対２０１ｆの下層にはノード対２０１ｈとノード対２０１ｇが配置されている。ノード対２０１ｃの下にはノード対２０１ｄが、さらにその下にはノード対２０１ｅが配置されている。
【００３８】
各ノードの前に付された０あるいは１の符号は、図２Ａにおいて説明した配列要素の前に付された符号と同じである。検索キーの弁別ビット位置のビット値に応じてツリーをたどり、検索対象のリーフノードを見つけることになる。
【００３９】
図示された例では、ルートノード２１０ａのノード種別２６０ａは０でブランチノードであることを示し、弁別ビット位置２３０ａは０を示している。代表ノード番号は２２０ａであり、それはノード対２０１ｂの代表ノード２１０ｂの格納された配列要素の配列番号である。
【００４０】
ノード対２０１ｂはノード２１０ｂと２１１ｂで構成され、それらのノード種別２６０ｂ、２６１ｂはともに０であり、ブランチノードであることを示している。ノード２１０ｂの弁別ビット位置２３０ｂには１が格納され、リンク先の代表ノード番号にはノード対２０１ｃの代表ノード２１０ｃの格納された配列要素の配列番号２２０ｂが格納されている。
【００４１】
ノード２１０ｃのノード種別２６０ｃには１が格納されているので、このノードはリーフノードであり、したがって、インデックスキーと処理元識別子を含んでいる。インデックスキー２５０ｃには“０００１１１”が格納され、処理元識別子２７０ｃには“ａ”が格納されている。一方ノード２１１ｃのノード種別２６１ｃは０、弁別ビット位置２３１ｃは２であり、代表ノード番号にはノード対２０１ｄの代表ノード２１０ｄの格納された配列要素の配列番号２２１ｃが格納されている。
【００４２】
ノード２１０ｄのノード種別２６０ｄは０、弁別ビット位置２３０ｄは５であり、代表ノード番号にはノード対２０１ｅの代表ノード２１０ｅの格納された配列要素の配列番号２２０ｄが格納されている。ノード２１０ｄと対になるノード２１１ｄのノード種別２６１ｄは１であり、インデックスキー２５１ｄには“０１１０１０”が格納され、処理元識別子２７１ｄには“ｄ”が格納されている。
【００４３】
ノード対２０１ｅのノード２１０ｅ、２１１ｅのノード種別２６０ｅ、２６１ｅはともに１であり双方ともリーフノードであることを示し、それぞれのインデックスキー２５０ｅ、２５１ｅにはインデックスキーとして“０１００１０”と“０１００１１”が格納されている。また、それぞれの処理元識別子２７０ｅ、２７１ｅには“ｃ”、“ｂ”が格納されている。
【００４４】
ノード対２０１ｂのもう一方のノードであるノード２１１ｂの弁別ビット位置２３１ｂには２が格納され、リンク先の代表ノード番号にはノード対２０１ｆの代表ノード２１０ｆの格納された配列要素の配列番号２２１ｂが格納されている。
【００４５】
ノード対２０１ｆのノード２１０ｆ、２１１ｆのノード種別２６０ｆ、２６１ｆはともに０であり双方ともブランチノードである。それぞれの弁別ビット位置２３０ｆ、２３１ｆには５、３が格納されている。ノード２１０ｆの代表ノード番号にはノード対２０１ｇの代表ノード２１０ｇの格納された配列要素の配列番号２２０ｆが格納され、ノード２１１ｆの代表ノード番号にはノード対２０１ｈの代表ノードであるノード［０］２１０ｈの格納された配列要素の配列番号２２１ｆが格納されている。
【００４６】
ノード対２０１ｇのノード２１０ｇ、２１１ｇのノード種別２６０ｇ、２６１ｇはともに１であり双方ともリーフノードであることを示し、それぞれのインデックスキー２５０ｇ、２５１ｇには“１０００１０”と“１０００１１”が格納されている。また、それぞれの処理元識別子２７０ｇ、２７１ｇには“ｅ”、“ｆ”が格納されている。
【００４７】
また同じくノード対２０１ｈの代表ノードであるノード［０］２１０ｈとそれと対をなすノード［１］２１１ｈのノード種別２６０ｈ、２６１ｈはともに１であり双方ともリーフノードであることを示し、それぞれのインデックスキー２５０ｈ、２５１ｈには“１０１０１１”と“１０１１００“が格納されている。また、それぞれの処理元識別子２７０ｈ、２７１ｈには“ｇ”、“ｈ”が格納されている。
【００４８】
以下、上述のツリーからインデックスキー“１０００１０”を検索する処理の流れを簡単に説明する。弁別ビット位置は、左から０、１、２、・・・とする。
まず、ビット列“１０００１０”を検索キーとしてルートノード２１０ａから処理をスタートする。ルートノード２１０ａの弁別ビット位置２３０ａは０であるので、検索キー“１０００１０”の弁別ビット位置が０のビット値をみると１である。そこで代表ノード番号の格納された配列番号２２０ａに１を加えた配列番号の配列要素に格納されたノード２１１ｂにリンクする。ノード２１１ｂの弁別ビット位置２３１ｂには２が格納されているので、検索キー“１０００１０”の弁別ビット位置が２のビット値をみると０であるから、代表ノード番号の格納された配列番号２２１ｂの配列要素に格納されたノード２１０ｆにリンクする。
【００４９】
ノード２１０ｆの弁別ビット位置２３０ｆには５が格納されているので、検索キー“１０００１０”の弁別ビット位置が５のビット値をみると０であるから、代表ノード番号の格納された配列番号２２０ｆの配列要素に格納されたノード２１０ｇにリンクする。
【００５０】
ノード２１０ｇのノード種別２６０ｇは１でありリーフノードであることを示しているので、インデックスキー２５０ｇを読み出して検索キーと比較すると両方とも“１０００１０”であって一致している。このようにしてカップルドノードツリーを用いた検索が行われる。
【００５１】
次に、図２Ｂを参照してカップルドノードツリーの構成の意味について説明する。
カップルドノードツリーの構成はインデックスキーの集合により規定される。図２Ｂの例で、ルートノード２１０ａの弁別ビット位置が０であるのは、図２Ｂに例示されたインデックスキーに０ビット目が０のものと１のものがあるからである。０ビット目が０のインデックスキーのグループはノード２１０ｂの下に分類され、０ビット目が１のインデックスキーのグループはノード２１１ｂの下に分類されている。
【００５２】
ノード２１１ｂの弁別ビット位置が２であるのは、ノード２１１ｈ、２１０ｈ、２１１ｇ、２１０ｇに格納された０ビット目が１のインデックスキーの１ビット目がすべて０で等しく、２ビット目で初めて異なるものがあるという、インデックスキーの集合の性質を反映している。
【００５３】
以下０ビット目の場合と同様に、２ビット目が１であるものはノード２１１ｆ側に分類され、２ビット目が０であるものはノード２１０ｆ側に分類される。
そして２ビット目が１であるインデックスキーは３ビット目の異なるものがあるのでノード２１１ｆの弁別ビット位置には３が格納され、２ビット目が０であるインデックスキーでは３ビット目も４ビット目も等しく５ビット目で異なるのでノード２１０ｆの弁別ビット位置には５が格納される。
【００５４】
ノード２１１ｆのリンク先においては、３ビット目が１のものと０のものがそれぞれ１つしかないことから、ノード２１０ｈ、２１１ｈはリーフノードとなり、それぞれインデックスキー２５０ｈと２５１ｈに“１０１０１１”と“１０１１００”が格納されている。
【００５５】
仮にインデックスキーの集合に“１０１１００”の代わりに“１０１１０１”か“１０１１１０”が含まれていたとしても、３ビット目までは“１０１１００”と等しいので、ノード２１１ｈに格納されるインデックスキーが変わるだけで、ツリー構造自体は変わることはない。しかし、“１０１１００”に加えて“１０１１０１”が含まれていると、ノード２１１ｈはブランチノードとなり、その弁別ビット位置は５になる。追加されるインデックスキーが“１０１１１０”であれば、弁別ビット位置は４となる。
【００５６】
以上説明したように、カップルドノードツリーの構造は、インデックスキーの集合に含まれる各インデックスキーの各ビット位置のビット値により決定される。
そしてさらにいえば、異なるビット値となるビット位置ごとにビット値が“１”のノードとビット値が“０”のノードとに分岐していることから、ノード［１］側とツリーの深さ方向を優先させてリーフノードをたどると、それらに格納されたインデックスキーは、ノード２１１ｈのインデックスキー２５１ｈの“１０１１００”、ノード２１０ｈのインデックスキー２５０ｈの“１０１０１１”、・・・、ノード２１０ｃのインデックスキー２５０ｃの“０００１１１”となり降順にソートされている。
【００５７】
すなわち、カップルドノードツリーにおいては、インデックスキーはソートされてツリー上に配置されている。
検索キーで検索するときはインデックスキーがカップルドノードツリー上に配置されたルートをたどることになり、例えば検索キーが“１０１１００”であればノード２１１ｈに到達することができる。また、上記説明からも想像がつくように、“１０１１０１”か“１０１１１０”を検索キーとした場合でもノード２１１ｈにたどり着き、インデックスキー２５１ｈと比較することにより同一のインデックスキーを求める検索が失敗したことが分かる。
【００５８】
また、例えば“１００１００”で検索した場合でも、ノード２１０ａ、２１１ｂ、２１０ｆのリンク経路では検索キーの３ビット目と４ビット目は使われることがなく、“１００１００”の５ビット目が０なので、“１０００１０”で検索した場合と同様にノード２１０ｇに到達することになる。このように、カップルドノードツリーに格納されたインデックスキーのビット構成に応じた弁別ビット位置を用いて分岐が行われる。
【００５９】
図３は、本実施形態のためのハードウェア構成例を説明する図である。
本実施形態によるマージソートは中央処理装置３０２及びキャッシュメモリ３０３を少なくとも備えたデータ処理装置３０１によりデータ格納装置３０８を用いて実施される。カップルドノードツリーが配置されるマージ配列３０９、マージソートの前段の処理でソートされたキーを格納する複数のソート済みキー配列３１２、マージ済みであって全体としてソート済みのキーを格納するマージ済みキー配列３１３と検索中にたどるノードが格納された配列要素の配列番号を記憶する探索経路スタック３１０を有するデータ格納装置３０８は、主記憶装置３０５または外部記憶装置３０６で実現することができ、あるいは通信装置３０７を介して接続された遠方に配置された装置を用いることも可能である。
【００６０】
図３の例示では、主記憶装置３０５、外部記憶装置３０６及び通信装置３０７が一本のバス３０４によりデータ処理装置３０１に接続されているが、接続方法はこれに限るものではない。また、主記憶装置３０５をデータ処理装置３０１内のものとすることもできるし、探索経路スタック３１０を中央処理装置３０２内のハードウェアとして実現することも可能である。あるいは、ソート済みキー配列３１２とマージ済みキー配列３１３は外部記憶装置３０６に、探索経路スタック３１０を主記憶装置３０５に持つなど、使用可能なハードウェア環境、インデックスキー集合の大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
【００６１】
また、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた主記憶装置３０５の一時記憶領域が用いられることは当然である。
【００６２】
図４は、本実施態様に係るカップルドノードツリーを用いたビット列検索の基本動作を示すフローチャートである。本出願人による出願である上記特願２００６−２９３６１９で提案されたフローチャートに対して、リーフノードに格納された処理元識別子を取り出すステップが追加されている。
【００６３】
まず、ステップＳ４０１で、検索開始ノードの配列番号を取得する。取得された配列番号に対応する配列は、カップルドノードツリーを構成する任意のノードを格納したものである。検索開始ノードの指定は、後に説明する各種応用検索において行われる。
【００６４】
取得された検索開始ノードの配列番号は、図示しない検索開始ノード設定エリアに設定されるが、この検索開始ノード設定エリアは、先に述べた「処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶装置」の一つである。以下の説明では、「図示しない検索開始ノード設定エリアに設定する」のような表現に変えて、「検索開始ノードの配列番号を得る」、「検索開始ノードとして設定する」あるいは単に「検索開始ノードに設定する」のように記述することもある。
【００６５】
次に、ステップＳ４０２で、探索経路スタック３１０に取得された配列番号を格納し、ステップＳ４０３で、その配列番号に対応する配列要素を参照すべきノードとして読み出す。そして、ステップＳ４０４で、読み出したノードから、ノード種別を取り出し、ステップＳ４０５で、ノード種別がブランチノードであるか否かを判定する。
【００６６】
ステップＳ４０５の判定において、読み出したノードがブランチノードである場合は、ステップＳ４０６に進み、ノードから弁別ビット位置についての情報を取り出し、更に、ステップＳ４０７で、取り出した弁別ビット位置に対応するビット値を検索キーから取り出す。そして、ステップＳ４０８で、ノードから代表ノード番号を取り出して、ステップＳ４０９で、検索キーから取り出したビット値と代表ノード番号とを加算し、新たな配列番号として、ステップＳ４０２に戻る。
【００６７】
以降、ステップＳ４０５の判定においてリーフノードと判定されてステップＳ４１０ａに進むまで、ステップＳ４０２からステップＳ４０９までの処理を繰り返す。ステップＳ４１０ａで、リーフノードからインデックスキーを取り出し、ステップＳ４１０ｂで、リーフノードから処理元識別子を取り出して処理を終了する。
【００６８】
先に述べたように、ステップＳ４１０ａで検索キーと一致するインデックスキーが取り出されるとは限らないが、それは検索キーと一致するインデックスキーがカップルドノードツリーに含まれていなかったからである。その場合でも、ステップＳ４１０ａで取り出されたインデックスキーは、後に説明する各種処理において活用される。
【００６９】
図５Ａは、本実施態様に係るカップルドノードツリーに格納されたインデックスキーの最小値を求める処理を示したフローチャートである。本出願人による出願である上記特願２００６−２９３６１９で提案されたカップルドノードツリー（部分木を含む）の最小値を求める処理を示したフローチャートに対して、リーフノードに格納された処理元識別子を取り出すステップが追加されている。
【００７０】
これから説明するインデックスキーの最小値を求める処理は、先に述べたようなインデックスキーのツリー上の配置から、検索開始ノードからノード［０］をリーフノードに至るまでツリー上でたどることに相当する。
【００７１】
まず、ステップＳ５０１の検索開始ノードの配列番号の取得からステップＳ５０５のノード種別の判定までは、それぞれ上述の図４のステップＳ４０１からステップＳ４０５の処理と同様である。
【００７２】
ステップＳ５０５のノード種別の判定においてノード種別がブランチノードと判定されると、ステップＳ５０６に進み、ノードから配列の代表ノード番号を取り出し、ステップＳ５０７で、取り出した代表ノード番号に値「０」を加算してその結果を新たな配列番号とし、ステップＳ５０２に戻る。以降、ステップＳ５０５においてそのノードがリーフノードと判定されるまでステップＳ５０２からステップＳ５０７までの処理を繰り返し、ステップＳ５０８ａで、リーフノードからインデックスキーを取り出し、ステップＳ５０８ｂで、リーフノードから処理元識別子を取り出して処理を終了する。
【００７３】
上記の図５Ａに示す処理においては、ノード［０］をたどるため、代表ノード番号に一律「０」を加算している。すなわち、図５Ａの処理によれば、リンク先のノードは、ノード対のうち必ずノード［０］とし、より小さい値のインデックスキーが格納されているノードのほうに分岐している。これにより、ツリー構造が先に述べたように順列構成であるカップルドノードツリーの最小のインデックスキーを取り出すことができる。
【００７４】
図５Ｂは、本実施態様に係るカップルドノードツリーに格納されたインデックスキーの最大値を求める処理を示したフローチャートである。本出願人による出願である上記特願２００６−２９３６１９で提案されたカップルドノードツリー（部分木を含む）の最大値を求める処理を示したフローチャートに対して、リーフノードに格納された処理元識別子を取り出すステップが追加されている。
【００７５】
インデックスキーの最大値を求める処理は、ツリー上のノードのうちノード［１］について、リーフノードに至るまで順次たどっていくことに相当する。以下、任意の部分木の最大のインデックスキーを求める処理について、上記最小のインデックスキーを求める処理と比較しながら、異なる点を中心に説明する。
【００７６】
図５Ｂに示す一連の処理のうち、ステップＳ５１１からステップＳ５１６及びステップＳ５１８ａとステップＳ５１８ｂについては、図５Ａのステップ５０１からステップＳ５０６及びステップＳ５０８ａとステップＳ５０８ｂにそれぞれ対応しており、同様の処理が実行される。図５Ａの最小値を求める処理と異なる点は、ステップＳ５１７において、代表ノード番号に、値「１」を加算する点である。これにより、代表ノード番号が表すノード対のうち、ノード［１］に常にリンクすることとなり、リーフノードに至るまで順次ステップＳ５１２からステップＳ５１７の処理を繰り返すことにより、インデックスキーの最大値を得ることができる。
【００７７】
図４、図５Ａ及び図５Ｂに示すように、インデックスキーを検索する基本動作やインデックスキーの最小値／最大値の検索処理を実行する際には、探索経路スタック３１０に参照した配列の配列番号が順次格納されていく。
【００７８】
なお、上述の図５Ａ及び図５Ｂを参照したインデックスキーの最小値／最大値の検索処理では、カップルドノードツリーは配列に記憶されたものとして説明したが、カップルドノードツリーが配列に記憶されることは必須ではなく、ノード対を構成する２つのノードのうちの代表ノードのみあるいは代表ノードと隣接した記憶領域に配置されたノードのみをリンクしてリーフノードに至ることによりインデックスキーの最小値／最大値の検索が可能であることは明らかである。
【００７９】
次に、図６Ａ〜図６Ｃ、図７により本実施態様に係るカップルドノードツリーにおけるノード挿入処理を説明する。図６Ａ〜図６Ｃが通常の挿入処理を説明するものであり、図７はルートノードの挿入処理を説明するものである。ルートノードの挿入処理と通常の挿入処理により、カップルドノードツリーが生成されることから、ノード挿入処理の説明はカップルドノードツリーの生成処理の説明でもある。
【００８０】
本出願人による出願である上記特願２００６−１８７８２７で提案されたカップルドノードツリーにおけるノード挿入処理と比べると、挿入キーをインデックスキーとするリーフノードに挿入キーを取り出したソート済みキー配列を識別する処理元識別子を格納する点で異なる。
【００８１】
図６Ａは挿入処理の前段である検索処理の処理フローを示す図であり、図４に示した検索処理において、ルートノードを検索開始ノードとし、挿入キーを検索キーとしたものに相当する。
【００８２】
ステップＳ６０１において、検索開始ノードの配列番号を設定するエリアにルートノードの配列番号を設定し、ステップＳ６０２において、検索キーに挿入キーを設定する。
次にステップＳ６１０において、図４に示す検索処理を実行し検索結果のインデックスキーを得て、ステップＳ６１１に進む。
【００８３】
ステップＳ６１１において挿入キーとステップＳ６１０で得られたインデックスキーを比較し、等しければ挿入キーは既にカップルドノードツリーに存在するのであるから、挿入は失敗となり、処理を終了する。等しくなければ次の処理、図６ＢのステップＳ６１２以下の処理に進む。
【００８４】
図６Ｂは、挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。
ステップＳ６１２において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。
【００８５】
ステップＳ６１３に進み、挿入キーとステップＳ６１０で得たインデックスキーの大小を比較し、挿入キーが大きいときは値１を小さいときは値０のブール値を得る。
ステップＳ６１４に進み、ステップＳ６１２で得た代表ノードの配列番号にステップＳ６１３で得たブール値を加算した配列番号を得る。
【００８６】
ステップＳ６１５に進み、ステップＳ６１２で得た代表ノードの配列番号にステップＳ６１３で得たブール値の論理否定値を加算した配列番号を得る。
ステップＳ６１４で得た配列番号は、挿入キーをインデックスキーとして持つリーフノードが格納される配列要素の配列番号であり、ステップＳ６１５で得た配列番号は、そのリーフノードと対を成すリーフノードまたはブランチノードが格納される配列要素のものである。
【００８７】
つまり、前段の検索処理で得られたリーフノードに格納されたインデックスキーと挿入キーの大小により、挿入されるノード対のうちどちらのノードに挿入キーを保持するリーフノードが格納されるかが決定される。
【００８８】
例えば図２Ｂのカップルドノードツリーに“０１１０１１”を挿入する場合、検索結果のインデックスキーはノード２１１ｄに格納された“０１１０１０”になる。挿入キー“０１１０１１”とノード２１１ｄに格納されたインデックスキー“０１１０１０”の大小比較によりブール値が求められ、今の例では挿入キーが大きいのでブール値１が得られ、挿入されるノード対の代表ノード番号に１を加えた配列要素に挿入キーを保持するリーフノードが格納される。一方、インデックスキー“０１１０１０”は、大小比較で得られたブール値を論理反転した値を代表ノード番号に加算した配列番号の配列要素に格納される。
【００８９】
その際、インデックスキー“０１１０１０”と挿入キー“０１１０１１”とは５ビット目で異なることから、ノード２１１ｄは、弁別ビット位置を５とし、代表ノード番号を挿入されたノード対の代表ノードの配列番号とするブランチノードとなる。
【００９０】
また図２Ｂのカップルドノードツリーに“０１１００１”を挿入しようとする場合も、検索結果のインデックスキーはノード２１１ｄに格納された“０１１０１０”になる。この場合には挿入キーが小さいのでブール値０が得られ、挿入されるノード対の代表ノード番号に０を加えた配列要素に挿入キーを保持するリーフノードが格納される。そして、インデックスキー“０１１０１０”と挿入キー“０１１００１”とは４ビット目で異なることから、ノード２１１ｄは、弁別ビット位置を４とし、代表ノード番号を挿入されたノード対の代表ノードの配列番号とするブランチノードとなる。次に図６ＣのステップＳ６１６以下の処理に進む。
【００９１】
図６Ｃは図６Ｂで準備された配列にノードを格納するとともにその挿入位置を求め、既存のノードの内容を変更して挿入処理を完成させる処理フローを示す図である。
ステップＳ６１６〜ステップＳ６２３までの処理は、挿入するノード対のカップルドノードツリー上の位置を求める処理であり、ステップＳ６２４以下の処理は各ノードにデータを設定して挿入処理を完成させる処理である。
【００９２】
ステップＳ６１６で、挿入キーとステップＳ６１０で得たインデックスキーのビット列比較を例えば排他的論理和で行い、差分ビット列を得る。
ステップＳ６１７に進み、ステップＳ６１６で得た差分ビット列から、上位０ビット目から見た最初の不一致ビットのビット位置を得る。この処理は、例えばプライオリティエンコーダを有するＣＰＵではそこに差分ビット列を入力し、不一致のビット位置を得ることができる。また、ソフト的にプライオリティエンコーダと同等の処理を行い最初の不一致ビットのビット位置を得ることも可能である。
【００９３】
次にステップＳ６１８に進み、探索経路スタックのスタックポインタがルートノードの配列番号を指しているか判定する。指していればステップＳ６２４に移行し、指していなければステップＳ６１９に進む。
【００９４】
ステップＳ６１９において、探索経路スタックのスタックポインタを１つ戻してそこにスタックされている配列番号を取り出す。
ステップＳ６２０に進み、ステップＳ６１９で取り出した配列番号の配列要素を配列からノードとして読み出す。
【００９５】
ステップＳ６２１に進み、ステップＳ６２０で読み出したノードから、弁別ビット位置を取り出す。
次にステップＳ６２２に進み、ステップＳ６２１で取り出した弁別ビット位置がステップＳ６１７で得たビット位置より上位の位置関係か判定する。ここで上位の位置関係とは、ビット列のより左側の位置、すなわちビット位置の値が小さい位置であることとする。
【００９６】
ステップＳ６２２の判定結果が否定であれば、ステップＳ６１８に戻り、ステップＳ６１８での判定が肯定になるかステップＳ６２２での判定が肯定になるまで繰り返す。ステップＳ６２２での判定が肯定になると、ステップＳ６２３で経路探索スタックのスタックポインタを1つ進め、ステップＳ６２４以下の処理に移行する。
【００９７】
上記ステップＳ６１６〜ステップＳ６２３で説明した処理は、挿入するノード対の挿入位置を決定するために、挿入するインデックスキーと検索により取得されたインデックスキーの間でビット列比較を行い、ビット列比較で異なるビット値となる先頭の（最上位の）ビット位置と探索経路スタックに格納されているブランチノードの弁別ビット位置との相対的位置関係を調べ、弁別ビット位置が上位となるブランチノードの次のブランチノードのリンク先を挿入するノード対の挿入位置とするものである。
【００９８】
例えば図２Ｂのカップルドノードツリーに“１１１０００”を挿入するとき、検索結果のインデックスキーはノード２１０ｈに格納された“１０１０１１”になる。挿入キー“１１１０００”とノード２１０ｈに格納されたインデックスキー“１０１０１１”のビット列比較により異なるビット値となる最上位のビット位置１が得られる。得られたビット位置１と経路探索スタックに積まれた配列番号の配列要素に格納されたブランチノードの弁別ビット位置との位置関係を弁別ビット位置が上位になるまでを順次経路探索スタック逆にたどると、ルートノード２１０ａに至る。そこで探索経路スタックのポインタを１つ進め、ノード２１１ｂの配列番号を得る。挿入キー“１１１０００”はノード２１１ｂのリンク先に挿入される。
【００９９】
また、経路探索スタック逆にたどりルートノードに至っても、ルートノードの弁別ビット位置が、先に求めたビット列比較で異なるビット値となる最上位のビット位置より上位のビット位置でないということは、そのカップルドノードツリーのインデックスキーの上位ビットで、ルートノードの弁別ビット位置より上位のビットの値は全て等しい場合である。そして、挿入するインデックスキーにおいて、初めてルートノードの弁別ビット位置より上位のビットの値に異なるビット値のものがあるということである。したがって、挿入するノード対はルートノードの直接のリンク先となり、ルートノードの弁別ビット位置は、既存のインデックスキーと異なる値である挿入キーの最上位ビットの位置に変わる。
【０１００】
次に、ステップＳ６２４以下の各ノードにデータを設定して挿入処理を完成させる処理について説明する。
ステップＳ６２４では探索経路スタックからスタックポインタの指す配列番号を取り出す。
【０１０１】
ステップＳ６２５ａにおいて、ステップＳ６１４で得た配列番号の指す配列要素のノード種別に１（リーフノード)を、インデックスキーに挿入キーを書き込む。また、挿入キーを取り出したソート済みキー配列を識別する処理元識別子を格納する。
【０１０２】
ステップＳ６２６に進み、配列からステップＳ６２４で得た配列番号の配列要素を読み出す。
次にステップＳ６２７において、ステップＳ６１５で得た配列番号の配列要素にステップＳ６２６で読み出した内容を書き込む。
【０１０３】
最後にステップＳ６２８において、ステップＳ６２４で得た配列番号の指す配列要素のノード種別に０(ブランチノード）を、弁別ビット位置にステップＳ６１７で得たビット位置を、代表ノード番号にステップＳ６１２で得た配列番号を書き込み、処理を終了する。
【０１０４】
上述の図２Ｂのカップルドノードツリーに“１１１０００”を挿入する例では、取得された空ノード対のノード［０］にノード２１１ｂの内容を書き込み（ステップＳ６２７）、ノード［１］を挿入キー“１１１０００”を保持するリーフノードとする（ステップＳ６２５）。そして、ノード２１１ｂの弁別ビット位置にビット列比較により異なるビット値となる最上位のビット位置１を格納し、代表ノード番号には取得されたノード対の代表ノードが格納される配列要素の配列番号が格納される（ステップＳ６２８）。
【０１０５】
図７は、本実施態様に係るカップルドノードツリーを新規に生成し登録する処理、すなわちルートノードの挿入処理を説明する図である。
まず、ステップＳ７０２において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。次にステップＳ７０３において、ステップＳ７０２で得た配列番号に０を加えた配列番号を求める。（実際には、ステップＳ７０２で取得した配列番号に等しい。)。
【０１０６】
さらにステップＳ７０４ａにおいて、ステップＳ７０３で得た配列番号の配列要素に、挿入するルートノードのノード種別に１（リーフノード)とインデックスキーに挿入キー、処理元識別子に挿入キーを取り出したソート済み配列の識別子を書き込み、ステップＳ７０５で、ステップＳ７０２で取得したルートノードの配列番号を登録して処理を終了する。
【０１０７】
先にも述べたように、インデックスキーの集合があるとき、そこから順次インデックスキーを取り出し、図７及び図６Ａ〜図６Ｃの処理を繰り返すことにより、インデックスキーの集合に対応した本発明のカップルドノードツリーを構築することができることは明らかである。
【０１０８】
次に図８Ａ、図８Ｂを参照して、本実施態様に係るカップルドノードツリーのインデックスキーのうち、特定のインデックスキーを削除する処理フローを説明する。
図８Ａは、削除処理の前段である検索処理の処理フローを示す図であり、図４に示した検索処理において、検索開始ノードをルートノードとし、削除キーを検索キーとしたものに相当する。
【０１０９】
ステップＳ８０１において、検索開始ノードの配列番号を設定するエリアにルートノードの配列番号を設定し、ステップＳ８０２において、検索キーに削除キーを設定する。
次にステップＳ８１０において、図４に示す検索処理を実行し検索結果のインデックスキーを得て、ステップＳ８１１に進む。
【０１１０】
ステップＳ８１１において削除キーとインデックスキーを比較し、等しくなければければ削除するインデックスキーはカップルドノードツリーに存在しないのであるから、削除は失敗となり、処理を終了する。等しければ次の処理、図８ＢのステップＳ８１２以下の処理に進む。
【０１１１】
図８Ｂは、削除処理の後段の処理フローを説明する図である。
まず、ステップＳ８１２で探索経路スタックに２つ以上の配列番号が格納されているか判定する。２つ以上の配列番号が格納されていないということは、言い換えれば１つだけで、その配列番号はルートノードの格納された配列要素のものである。その場合はステップＳ８１８に移行し、ステップＳ８０１で設定したルートノードの配列番号に係るノード対を削除する。次にステップＳ８１９に進み、登録されていたルートノードの配列番号を削除して処理を終了する。
【０１１２】
ステップＳ８１２において探索経路スタックに２つ以上の配列番号が格納されていると判定されたときはステップＳ８１３に進み、ステップＳ８１０で実行した検索処理のステップＳ４０８で得た代表ノード番号にステップＳ４０７で得たビット値を反転した値を加算した配列番号を得る。この処理は、削除対象のインデックスキーが格納されたリーフノードと対をなすノードの配置された配列番号を求めるものである。
【０１１３】
次にステップＳ８１４において、ステップＳ８１３で得た配列番号の配列要素の内容を読み出し、ステップＳ８１５において探索経路スタックのスタックポインタを１つ戻して配列番号を取り出す。
【０１１４】
次にステップＳ８１６に進み、ステップＳ８１４で読み出した配列要素の内容をステップＳ８１５で得た配列番号の配列要素に上書きする。この処理は、削除対象のインデックスキーが格納されたリーフノードへのリンク元であるブランチノードを上記リーフノードと対をなすノードに置き換えるものである。
【０１１５】
最後にステップＳ８１７においてステップＳ８１０で実行した検索処理のステップＳ４０８で得た代表ノード番号に係るノード対を削除して処理を終了する。
以上、本実施形態のソートマージで用いるカップルドノードツリーに関する技術を説明した。
【０１１６】
次に、図９〜図１１Ｆを参照して第１の実施形態に係るカップルドノードツリーを用いた本発明の実施例１を説明する。
図９は本実施例の概要を説明する図である。図９の（１）はマージ処理の前段を図９の（２）は後段を説明する図である。
【０１１７】
図９の（１）に示す例では、ソート済みキー配列３１２ａのキー配列番号０の配列要素に値が“０１００１０”であるキー４８０ａ、キー配列番号１の配列要素に値が“１０００１１”であるキー４８１ａ、キー配列番号２の配列要素に値が“０１００１０” であるキー４８２ａが格納されている。また、ソート済みキー配列３１２ｂのキー配列番号０の配列要素に値が“０００１１１” であるキー４８０ｂ、キー配列番号１の配列要素に値が“０１１０１０” であるキー４８１ｂが、ソート済みキー配列３１２ｃのキー配列番号０の配列要素に値が“０１００１１” であるキー４８０ｃ、キー配列番号１の配列要素に値が“１０００１０” であるキー４８１ｃが格納されている。なお、図中の符号（Ａ）〜（Ｈ）は、マージ処理の各ステップを示すものである。
【０１１８】
図９の（１）に示すステップ（Ａ）〜（Ｄ）の処理に対して、図９の（２）に示すステップ（Ｅ）〜（Ｈ）の処理はマージ処理の後段の処理を示している。
最初のステップ（Ａ）において、ソート済みキー配列３１２ａ、３１２ｂ、３１２ｃからそれぞれの最小値４８０ａ、４８０ｂ、４８０ｃが取り出され、マージ配列３０９ａに格納される。
【０１１９】
次のステップ（Ｂ）において、マージ配列３０９ａに格納された最小値であるキー４８０ｂがマージ済みキー配列３１３のキー配列番号０の配列要素に格納され、キー４８０ｂはマージ配列３０９ａから削除される。そして、キー４８０ｂを取り出した処理元のソート済みキー配列３１２ｂからキー４８０ｂを取り出した後の最小値であるキー４８１ｂを取り出してマージ配列３０９ａに挿入してマージ配列３０９ｂを得る。
【０１２０】
次のステップ（Ｃ）において、マージ配列３０９ｂに格納された最小値であるキー４８０ａがマージ済みキー配列３１３のキー配列番号１の配列要素に格納され、キー４８０ａはマージ配列３０９ｂから削除される。次に、キー４８０ａを取り出した処理元のソート済みキー配列３１２ａからキー４８０ａを取り出した後の最小値であるキー４８１ａを取り出してマージ配列３０９ｂに挿入してマージ配列３０９ｃを得る。
【０１２１】
次のステップ（Ｄ）において、マージ配列３０９ｃに格納された最小値であるキー４８０ｃがマージ済みキー配列３１３のキー配列番号２の配列要素に格納され、キー４８０ｃはマージ配列３０９ｃから削除される。キー４８０ｃを取り出した処理元のソート済みキー配列３１２ｃからキー４８０ｃを取り出した後の最小値であるキー４８１ｃを取り出してマージ配列３０９ｃに挿入してマージ配列３０９ｄを得る。
【０１２２】
この段階では、図９の（１）に示すように、マージ済みキー配列３１３には、キー配列番号０〜２の配列要素に、それぞれキー４８０ｂ“０００１１１”、キー４８０ａ“００１０１０”及びキー４８０ｃ“０１００１１”が格納されている。そして、ソート済みキー配列３１２ｂとソート済みキー配列３１２ｃのキーは全て取り出し済みであり、ソート済みキー配列３１２ａにだけ、未取り出しのキーが残っている。
【０１２３】
図９の（２）に示すのは、処理元のソート済みキー配列から全てのキーが取り出し済みとなった以降の処理例である。
ステップ（Ｅ）では、マージ配列３０９ｄに格納された最小値であるキー４８１ｂがマージ済みキー配列３１３のキー配列番号３の配列要素に格納され、キー４８１ｂはマージ配列３０９ｄから削除され、マージ配列３０９ｅを得る。
【０１２４】
次にステップ（Ｆ）で、マージ配列３０９ｅに格納された最小値であるキー４８１ｃがマージ済みキー配列３１３のキー配列番号４の配列要素に格納され、キー４８１ｃはマージ配列３０９ｅから削除され、マージ配列３０９ｆを得る。
【０１２５】
次のステップ（Ｇ）において、マージ配列３０９ｆに格納された最小値であるキー４８１ａがマージ済みキー配列３１３のキー配列番号５の配列要素に格納され、キー４８１ａはマージ配列３０９ｆから削除され、マージ配列は空になる。
【０１２６】
次のステップ（Ｈ）において、未取り出しのキーが残っているソート済みキー配列３１２ａからキー４８２ａを取り出してマージ済みキー配列３１３のキー配列番号６の配列要素に格納してマージソートが完了する。
【０１２７】
上述の説明におけるマージ配列３０９ａ〜３０９ｆは、本実施形態に係るカップルドノードツリーのデータ構造を有するものである。カップルドノードツリーを用いた処理について、次に詳細に説明する。なお、以下において、カップルドノードツリーをマージ配列ということもある。また、単にツリーという場合もある。
【０１２８】
なお、マージ配列３０９ａ〜３０９ｆは、ステップを説明する便宜上、異なる符号を付与しているが、１つのマージ配列であることは当然である。また、後に説明するマージ配列においても同様である。
【０１２９】
図１０Ａ及び図１０Ｂは、本実施例におけるカップルドノードツリーを用いたマージソート処理フローを説明する図である。
図１０Ａは、例えば図９に示すマージ配列３０９ａをカップルドノードツリーの構造を持つものとして生成し、検索開始ノードの配列番号を設定するエリアに、生成したカップルドノードツリーのルートノードの配列番号を設定するまでの初期処理を説明するものであり、図１０Ｂは、それ以降の最小値を検索してマージを実行する処理を説明する図である。
【０１３０】
図９及び図１１Ａ〜図１１Ｆを適宜参照しながら、図１０Ａ及び図１０Ｂにより本実施例における処理フローを説明する。
図１０Ａに示すように、ステップＳ１００１においてソート済みキー配列を設定する。その際、ソート済みキー配列には識別子が与えられるものとする。図９に示す例では、ソート済みキー配列３１２ａ、３１２ｂ及び３１２ｃが設定されている。各ソート済みキー配列を設定するためのソート手法は、任意のものでよく、何ら制限はない。
【０１３１】
次にステップＳ１００２において、すべてのソート済みキー配列の最小値をカップルドノードツリーに挿入済みか判定する。挿入済みであれば、ステップＳ１０１０において、検索開始ノードの配列番号を設定するエリアにルートノードの配列番号を設定して初期処理を完了し、図１０Ｂに示すステップＳ１０１１以降の処理に進む。
【０１３２】
挿入済みでなければステップＳ１００３に進み、ソート済みキー配列を、配列の識別子により順次指定し、ステップＳ１００４において指定したソート済みキー配列から、キーの最小値を取り出す。
【０１３３】
次にステップＳ１００５において、ステップＳ１００４で取り出した最小値を挿入キーに設定し、ステップＳ１００６で処理元識別子にステップＳ１００３で指定したソート済みキー配列の識別子を設定する。
【０１３４】
図１１Ａ（１）の例示では、ソート済みキー配列３１２ａが指定され、矢印で表すポインタの指す最小値であるキー４８０ａが取り出されて挿入キーに設定され、識別子“ａ”が処理元識別子に設定される。
【０１３５】
次にステップＳ１００７に進み、ルートノードは登録済みか判定する。登録済みでなければステップＳ１００８に進み、挿入キーを含むリーフノードをルートノードとする図７に示すルートノードを挿入する処理を実行してステップＳ１００２に戻る。
【０１３６】
登録済みであれば、ステップＳ１００９に進み、図６Ａ〜図６Ｃに示す挿入処理を実行し、挿入キーにより、配列にノードを挿入してステップＳ１００２に戻る。
図１１Ａ（１）の例示では、空のノード対４０１ａの代表ノード番号４２０が得られ、ノード［０］にルートノード４１０ａが格納されている。ルートノード４１０ａのノード種別４６０ａにはリーフノードであることを示す“１”、処理元識別子４７１ａにはソート済みキー配列３１２ａの識別子“ａ”、インデックスキー４５０ａにはソート済みキー配列３１２ａの最小値“００１０１０”が格納されている。
【０１３７】
また、図１１Ａ（２）の例示では、ソート済みキー配列３１２ｂが指定され、矢印で表すポインタの指す最小値であるキー４８０ｂが取り出されて挿入キーに設定され、識別子“ｂ”が処理元識別子に設定される。そして、図１１Ａ（１）に示すカップルドノードツリーにキー４８０ｂの値“０００１１１”をインデックスキーとして含むリーフノード４１０ｂが挿入されている。
【０１３８】
図１１Ａ（２）に示すカップルドノードツリーのルートノード４１０ａはノード種別４６０ａが“０”、弁別ビット位置４３０ａが“２”、代表ノード番号が４２０ａのブランチノードであり、代表ノード番号４２０ａが指すノード対４０１ｂが挿入されている。ノード位置がノード［０］のノード４１０ｂのノード種別４６０ｂには“１”、処理元識別子４７０ｂには“ｂ”、インデックスキー４５０ｂには“０００１１１”が格納され、ノード位置がノード［１］のノード４１１ｂには、図１１Ａ（１）に示すカップルドノードツリーのルートノード４１０ａの内容がコピーされている。
【０１３９】
図１１Ａ（３）の例示では、ソート済みキー配列３１２ｃが指定され、矢印で表すポインタの指す最小値であるキー４８０ｃが取り出されて挿入キーに設定され、識別子“ｃ”が処理元識別子に設定される。そして、図１１Ａ（２）に示すカップルドノードツリーにキー４８０ｃの値“０１００１１”をインデックスキーとして含むリーフノード４１１ｃが挿入されている。
【０１４０】
図１１Ａ（３）に示すカップルドノードツリーのルートノード４１０ａはノード種別４６０ａが“０”、弁別ビット位置４３０ａが“１”、代表ノード番号が４２０ａのブランチノードであり、代表ノード番号４２０ａが指すノード対４０１ｃが挿入されている。ノード位置がノード［０］のノード４１０ｃには、図１１Ａ（２）に示すカップルドノードツリーのルートノード４１０ａの内容がコピーされている。ノード位置がノード［１］のノード４１１ｃのノード種別４６１ｃには“１”、処理元識別子４７１ｃには“ｃ”、インデックスキー４５１ｃには“０１００１１”が格納されている。ノード４１０ｃの代表ノード番号４２０ｃの指すノード対４０１ｂの内容は、図１１Ａ（２）に示すノード対４０１ｂの内容と同一である。
【０１４１】
図１１Ａ（３）に示すカップルドノードツリーは、図９に示すソート済みキー配列に対して生成した状態であり、図９に示すマージ配列３０９ａに相当する。
次に、図１０Ｂを参照して、カップルドノードツリーの最小値検索と削除挿入処理を繰り返してマージソートを実行する処理を説明する。
【０１４２】
図１０Ｂに示すように、ステップＳ１０１１において、図５Ａに示す最小値検索を実行し、最小値と処理元識別子を求め、ステップＳ１０１２において、ステップＳ１０１１で得た最小値をマージ済みキー配列に書き出す。
【０１４３】
次にステップＳ１０１３に進み、削除キーにステップＳ１０１１で得た最小値を設定し、ステップＳ１０１４において、図８Ａ、図８Ｂに示す削除処理を実行して削除キーを含むノードを削除する。
【０１４４】
図１１Ａ（３）、（４）に示す例では、リーフノード４１０ｂに格納された最小値“０００１１１”が求められ、矢印で表されるポインタの指すマージ済みキー配列３１３のキー配列番号０に書き出される。そして、ノード４１０ｂは図１１Ａ（３）に示すツリーから削除され、カップルドノードツリーは図１１Ａ（４）に示すように、ノード４１０ｂと対をなす図１１Ａ（３）に示すノード４１１ｂの内容がノード４１１ｃにコピーされたものになる。
【０１４５】
次にステップＳ１０１５において、ステップＳ１０１１で求めた処理元識別子をソート済みキー配列の識別子としてソート済みキー配列識別子設定エリアに設定する。
次にステップＳ１０１６において、ルートノードが登録されているか判定する。この判定でルートノードが登録されていないと判定されるのは、図１１Ｅ（３）、（４）に例示するように、マージ配列の最小値を含むノードがルートノードとなり、ステップＳ１０１４でマージ配列が抹消、すなわちルートノードの配列番号が削除され登録が抹消されたときである。
【０１４６】
ステップＳ１０１６において、ルートノードが登録されていると判定されると、ステップＳ１０１７に移行し、ステップＳ１０１５でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列から、次のキーの取り出しを試みる。
【０１４７】
図１１Ｂ（１）に示す例では、矢印で表されるポインタの指すソート済みキー配列３１２ｂのキー配列番号１の配列要素に格納されたキー４８１ｂが次のキーとして取り出される。
【０１４８】
ステップＳ１０１７に続いてステップＳ１０１８に進み、ステップＳ１０１７で次のキーを取り出せたか、すなわち全てのキーを取り出し済みであったかを判定する。
図１１Ｅ（１）の例示では、次のキーを取り出すソート済みキー３１２ｂのポインタの指す配列要素にはキーが格納されていないことから、この場合、ステップＳ１０１７では次のキーを取り出すことはできないから、ステップＳ１０１８での判定は全てのキーは取り出し済みとなる。
【０１４９】
全てのキーを取り出し済みであれば、ステップＳ１０１１に戻り、取り出し済みでなければ、ステップＳ１０１９〜ステップＳ１０２１の処理に進む。
ステップＳ１０１９では、挿入キーにステップＳ１０１７で取り出したキーを設定し、ステップＳ１０２０で、挿入処理のための処理元識別子設定エリアに、ステップＳ１０１５で設定した、すなわちステップＳ１０１１で求めた処理元識別子を設定する。そして、ステップＳ１０２１において、図６Ａ〜図６Ｃに示す挿入処理を実行してステップＳ１０１１に戻る。
【０１５０】
先に述べたように、図１１Ｂ（１）に示す例では、矢印で表されるポインタの指すソート済みキー配列３１２ｂのキー配列番号１の配列要素に格納されたキー４８１ｂが次のキーとして取り出され、図１１Ｂ（１）に示すカップルドノードツリーに挿入されたノード４１１ｄのインデックスキー４５１ｄに格納されている。
【０１５１】
以上のステップＳ１０１１〜ステップＳ１０２１の処理を、ステップＳ１０１６においてルートノードは登録されていないと判定されるまで繰り返し、ルートノードは登録されていないと判定されるとステップＳ１０２２に進む。
【０１５２】
ステップＳ１０２２では、ステップＳ１０１５でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列より、次のキーからキーの最大値まで取り出してマージ済みキー配列に順次書き出して処理を終了する。
【０１５３】
先に述べたように、ステップＳ１０１６においてルートノードは登録されていないと判定されるのは、マージ処理が進行し、徐々に各ソート済みキー配列から全てのキーが取り出し済みとなり、マージ配列に挿入されるキーがなくなり、最後に残ったルートノードが削除されたからである。そして、ルートノードの処理元識別子の指すソート済みキー配列にのみ、まだ取り出していないキーが残っている可能性がある。
【０１５４】
そこで、それらのキーを取り出してマージ済みキー配列に順次書き出すのがステップＳ１０２２の処理である。
ステップＳ１０２２の処理により、マージ処理が完了し、すべてのソート済みキー配列に格納されていたキー全体のマージソートが完成する。
【０１５５】
図１１Ａ〜図１１Ｆは、図９に例示するソート済みキー配列３１０ａ、３１０ｂ、３１０ｃが与えられたときのマージ配列に対応したカップルドノードツリーの生成、挿入及び削除処理を説明する図である。一部繰り返しになるが、図１１Ａ〜図１１Ｆを参照して、図９に示すソート済みキー配列３１０ａ、３１０ｂ、３１０ｃが与えられたときのマージ処理について説明する。
【０１５６】
最初に、図１１Ａ（１）に示すように、ソート済みキー配列３１２ａより取り出した最小値４８０ａをマージ配列のルートノードに登録する。図示のように、空のノード対４０１ａの代表ノード番号４２０が得られ、ノード［０］にルートノード４１０ａが格納されている。ルートノード４１０ａのノード種別４６０ａにはリーフノードであることを示す“１”、処理元識別子４７１ａにはソート済みキー配列３１２ａの識別子“ａ”、インデックスキー４５０ａにはソート済みキー配列３１２ａの最小値“００１０１０”が格納されている。
【０１５７】
次に、図１１Ａ（２）に示すように、矢印で表すポインタが指しているソート済みキー配列３１２ｂの最小値であるキー４８０ｂを取り出し、キー４８０ｂの値“０００１１１”をインデックスキーとして含むリーフノード４１０ｂを図１１Ａ（１）に示すツリーに挿入して図１１Ａ（２）に示すツリーを得る。
【０１５８】
次に、図１１Ａ（３）に示すように、矢印で表すポインタが指しているソート済みキー配列３１２ｃの最小値であるキー４８０ｃを取り出し、キー４８０ｃの値“０００１１１”をインデックスキーとして含むリーフノード４１０ｃを図１１Ａ（２）に示すツリーに挿入して図１１Ａ（３）に示すツリーを得る。
【０１５９】
以上により全てのソート済みキー配列の最小値がマージ配列に挿入済みであるので、次に、図１１Ａ（４）に示すように、マージ配列の最小値“０００１１１”をマージ済みキー配列３１３に書き出し、図１１Ａ（３）に示すツリーから最小値を含むリーフノード４１０ｂを削除して図１１Ａ（４）に示すツリーを得る。
【０１６０】
図１１Ｂ（１）に示すのは、マージ配列３０９ａの最小値の処理元識別子の指すソート済みキー配列３１２ｂと、矢印であらわすポインタの指す次のキー４８１ｂをインデックスキーとして含むリーフノードが図１１Ａ（４）に示すツリーに挿入されたものが示されている。すなわち、ソート済みキー配列３１０から次のキーが取り出され、マージ配列に挿入される。
【０１６１】
次に図１１Ｂ（２）に示すように、マージ配列の最小値“００１０１０”をマージ済みキー配列３１３に書き出し、最小値を含むリーフノード４１０ｃを削除する。
リーフノード４１０ｃの処理元識別子４７０ｃの値は“ａ”なので、次に図１１Ｃ（１）に示すように、ソート済みキー配列３１２ａから次のキー４８１ａを取り出してマージ配列に挿入する。次に図１１Ｃ（２）に示すように、マージ配列の最小値“０１００１１”をマージ済みキー配列３１３に書き出し、最小値を含むリーフノード４１０ｄを削除する。
【０１６２】
リーフノード４１０ｄの処理元識別子４７０ｄの値は“ｃ”なので、次に図１１Ｄ（１）に示すように、ソート済みキー配列３１２ｃから次のキー４８１ｃを取り出してマージ配列に挿入する。次に図１１Ｄ（２）に示すように、マージ配列の最小値“０１１０１０”をマージ済みキー配列３１３に書き出し、最小値を含むリーフノード４１０ｅを削除する。
【０１６３】
リーフノード４１０ｅの処理元識別子４７０ｅの値は“ｂ”なので、次に図１１Ｅ（１）に示すように、ソート済みキー配列３１２ｂから次のキーを取り出そうとするが、ソート済みキー配列３１２ｂから全てのキーが取り出し済みなのでマージ配列に次のキーは挿入されない。次に図１１Ｅ（２）に示すように、マージ配列の最小値“１０００１０”をマージ済みキー配列３１３に書き出し、最小値を含むリーフノード４１０ｆを削除する。
【０１６４】
リーフノード４１０ｆの処理元識別子４７０ｆの値は“ｃ”なので、次に図１１Ｅ（３）に示すように、ソート済みキー配列３１２ｃから次のキーを取り出そうとするが、ソート済みキー配列３１２ｃから全てのキーが取り出し済みなのでマージ配列に次のキーは挿入されない。次に図１１Ｅ（４）に示すように、マージ配列の最小値“１０００１１”をマージ済みキー配列３１３に書き出し、最小値を含むリーフノード４１１ｂであるルートノードを削除する。
【０１６５】
ルートノードが削除されたことから、図１１Ｆ（１）に示すように、リーフノード４１１ｂの処理元識別子２７０ｂの値“ａ”の示すソート済みキー配列３１２ａから残りのキー４８２ａが取り出され、マージ済みキー配列３１３に書き出され、マージ処理が完了する。
【０１６６】
次に、図１２Ａ〜図１４Ａ及び図１４Ｂを参照して第１の実施形態に係るカップルドノードツリーを用いた本発明の実施例２及び実施例３を説明する。
図１２Ａ、図１３Ｂ及び図１４Ｂは実施例２に関するものであり、図１２Ｂ、図１３Ｃは実施例３に関するものである。図１３Ａと図１４Ａは両実施例に共通である。
【０１６７】
実施例１では、ルートノードを検索開始ノードとして最小値検索を行い、マージ配列から最小値を削除した後に次のキーを挿入することを繰り返す。それに対して、実施例２、３では、最小値検索、削除処理及び挿入処理の順番を変更したり、一部の処理をスキップすることにより、実行時のマージ処理時間を削減しようとするものである。
【０１６８】
図１２Ａは実施例２の概要を説明する図であり、図１２Ａの（１）はマージ処理の前段を、図１２Ａの（２）はマージ処理の後段を説明する図である。
図１２Ａを図９に示す実施例１の概要と比較すると、説明の都合上、ソート済みキー配列３１２ａのキー配列番号３に、キー４８３ａが追加されている。また、ステップ（Ａ）以外におけるマージ配列の部分が異なる。
【０１６９】
後に図１３Ｂを参照して詳細に説明するが、実施例２では、基本的には最小値検索、挿入処理及び削除処理の順番で処理を行う。そして、最小値検索の検索開始ノードを直前の削除処理で得られた削除ノードの親ノードとすることにより、最小値検索の実行ステップ数を削減する。
【０１７０】
ステップ（Ａ）での処理は図９に示すステップ（Ａ）での処理と同様であり、マージ配列３０９ａが生成される。
次のステップ（Ｂ）において、マージ配列３０９ａに格納された最小値であるキー４８０ｂがマージ済みキー配列３１３のキー配列番号０の配列要素に格納される。そして、キー４８０ｂを取り出した処理元のソート済みキー配列３１２ｂからキー４８０ｂを取り出した後の最小値であるキー４８１ｂを取り出してマージ配列３０９ａに挿入してマージ配列３０９ｂ’を得る。さらに、マージ配列３０９ｂ’の最小値であるキー４８０ｂがマージ配列３０９ｂ’から削除され、次のステップ（Ｃ）において次のキーが挿入される前のマージ配列３０９ｃ’を得る。
【０１７１】
次のステップ（Ｃ）において、マージ配列３０９ｃ’に格納された最小値であるキー４８０ａがマージ済みキー配列３１３のキー配列番号１の配列要素に格納される。そして、キー４８０ａを取り出した処理元のソート済みキー配列３１２ａからキー４８０ａを取り出した後の最小値であるキー４８１ａを取り出してマージ配列３０９ｃ’に挿入する。さらに、マージ配列３０９ｃ’の最小値であるキー４８０ａがマージ配列３０９ｃ’から削除され、次のステップ（Ｄ）において次のキーが挿入される前のマージ配列３０９ｄ’を得る。
【０１７２】
次のステップ（Ｄ）において、マージ配列３０９ｄ’に格納された最小値であるキー４８０ｃがマージ済みキー配列３１３のキー配列番号２の配列要素に格納される。そして、キー４８０ｃを取り出した処理元のソート済みキー配列３１２ｃからキー４８０ｃを取り出した後の最小値であるキー４８１ｃを取り出してマージ配列３０９ｄ’に挿入する。さらに、マージ配列３０９ｄ’の最小値であるキー４８０ｃがマージ配列３０９ｃ’から削除され、マージ配列３０９ｅ’を得る。
【０１７３】
この段階では、図１２Ａの（１）に示すように、マージ済みキー配列３１３には、キー配列番号０〜２の配列要素に、それぞれキー４８０ｂ“０００１１１”、キー４８０ａ“００１０１０”及びキー４８０ｃ“０１００１１”が格納されている。そして、ソート済みキー配列３１２ｂとソート済みキー配列３１２ｃのキーは全て取り出し済みであり、ソート済みキー配列３１２ａにだけ、未取り出しのキーが残っている。
【０１７４】
図１２Ａの（２）に示すのは、処理元のソート済みキー配列から全てのキーが取り出し済みとなった以降の処理例である。
ステップ（Ｅ）では、マージ配列３０９ｅ’に格納された最小値であるキー４８１ｂがマージ済みキー配列３１３のキー配列番号３の配列要素に格納される。キー４８１ｂを取り出したソート済みキー配列３１２ｂのキーは全て取り出し済みなので、挿入されるキーはなく、キー４８１ｂはマージ配列３０９ｄ’から削除され、マージ配列３０９ｆ’を得る。
【０１７５】
次にステップ（Ｆ）で、マージ配列３０９ｆ’に格納された最小値であるキー４８１ｃがマージ済みキー配列３１３のキー配列番号４の配列要素に格納される。ステップ（Ｅ）と同様に、キー４８１ｃはマージ配列３０９ｆ’から削除され、次のステップ（Ｇ）において次のキーが挿入される前のマージ配列３０９ｇ’を得る。
【０１７６】
次のステップ（Ｇ）において、マージ配列３０９ｇ’に格納された最小値であるキー４８１ａがマージ済みキー配列３１３のキー配列番号５の配列要素に格納される。そして、キー４８１ａを取り出した処理元のソート済みキー配列３１２ａからキー４８１ａを取り出した後の最小値であるキー４８２ａを取り出してマージ配列３０９ｇ’に挿入する。さらに、マージ配列３０９ｇ’の最小値であるキー４８１ａがマージ配列３０９ｇ’から削除され、マージ配列３０９ｈ’を得る。
【０１７７】
次のステップ（Ｈ）において、マージ配列３０９ｈ’ に格納された最小値であるキー４８２ａがマージ済みキー配列３１３のキー配列番号６の配列要素に格納される。キー４８２ａを取り出したソート済みキー配列３１２ａのキーは全て取り出し済みなので、挿入されるキーはなく、キー４８２ａはマージ配列３０９ｈ’から削除され、マージ配列は空になる。
【０１７８】
最後のステップ（Ｉ）において、未取り出しのキーが残っているソート済みキー配列３１２ａからキー４８３ａを取り出してマージ済みキー配列３１３のキー配列番号７の配列要素に格納してマージソートが完了する。
【０１７９】
次に図１３Ａ、図１３Ｂ、図１４Ａ及び図１４Ｂを参照して、本実施例におけるカップルドノードツリーを用いたマージソート処理フローを説明する。
図１３Ａは、図１２Ａの例示におけるマージ配列３０９ａをカップルドノードツリーの構造を持つものとして生成するまでの初期処理を説明するものであり、図１３Ｂは、それ以降のマージ配列から最小値を検索してマージ済み配列に書き込む処理を説明する図である。
【０１８０】
図１３Ａは、図１２Ａを参照した先の説明からも分かるように、実施例１に係る図１０Ａのフロートと比べると、検索開始ノードを設定するステップが図１３Ｂ側に移行したことを除いて全く同様であるので、説明を省略し、図１３Ｂにより、本実施例のマージ処理のうち、マージ配列から最小値を検索してマージ済み配列に書き込む処理を次に説明する。
【０１８１】
図１３Ｂに示すように、ステップＳ１３１０において検索開始ノードにルートノードを設定する。
次にステップＳ１３１１に進み、図５Ａに示す最小値検索を実行し、最小値と処理元識別子を求め、ステップＳ１３１２において、ステップＳ１３１１で得た最小値をマージ済みキー配列に書き出す。
【０１８２】
次にステップＳ１３１３において、ステップＳ１３１１で求めた処理元識別子をソート済みキー配列の識別子としてソート済みキー配列識別子設定エリアに設定する。
次にステップＳ１３１４に進み、ステップＳ１３１３でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列から、次のキーの取り出しを試みる。
【０１８３】
ステップＳ１３１４に続いてステップＳ１３１５に進み、ステップＳ１３１４で次のキーを取り出せたか、すなわち全てのキーを取り出し済みであったかを判定する。
全てのキーを取り出し済みであれば、ステップＳ１３１９に進み、取り出し済みでなければ、ステップＳ１３１６〜ステップＳ１３１８ｂの処理に進む。
【０１８４】
ステップＳ１３１６では、挿入処理のための処理元識別子設定エリアに、ステップＳ１３１３で設定した、すなわちステップＳ１３１１で求めた処理元識別子を設定し、ステップＳ１３１７で、挿入キーにステップＳ１３１４で取り出したキーを設定する。そして、ステップＳ１３１８において、図６Ａ〜図６Ｃに示す挿入処理を実行する。この挿入処理の過程で、図６Ｃに示すステップＳ６２４において、挿入キーをインデックスキーとして保持するステップＳ６１４で取得されたノードの直近上位のノード（以下、挿入ノードという。）の配列番号が得られる。なお、この挿入処理用の探索経路スタックは、後に説明する理由により、最小値検索用の探索経路スタックとは別のものを用いる。
【０１８５】
次にステップＳ１３１８ｃにおいて、ステップＳ１３１８で得た挿入ノードの配列番号により、ステップＳ１３１１で実行した最小値検索の結果で得られた探索経路スタックを検索する。この探索経路スタックの検索の詳細については、後に図１４Ｂを参照して説明する。
【０１８６】
次にステップＳ１３１８ｄに進み、ステップＳ１３１８ｃでの検索の結果により、挿入ノードの配列番号と一致する配列番号が最小値検索の探索経路スタックに存在するか判定する。存在しなければステップＳ１３１９に移行し、存在すればステップＳ１３１８ａ〜ステップＳ１３１８ｂの処理を実行してからステップＳ１３１９に進む。
【０１８７】
ステップＳ１３１８ａにおいては、検索開始ノードにルートノードを設定し、ステップＳ１３１８ｂにおいて、ルートノードから図５Ａに示す最小値検索を実行し、最小値と処理元識別子を求める。なお、ステップＳ１３１１で実行した最小値検索の結果で得られた探索経路スタックを検索し、ステップＳ１３１８ｂで最小値検索を再び行う理由については後に説明する。
【０１８８】
ステップＳ１３１９においては、削除ノード設定エリアにステップＳ１３１８ｂで求めた最小値を含むノードの配列番号を設定し、次にステップＳ１３２０に進んでマージ配列から削除ノードを削除するとともに、削除ノードの直近上位の親ノードを得る。この削除処理においては、最小値検索用の探索経路スタックを利用する。なお、ステップＳ１３２０の処理の詳細は、後に図１４Ａを参照して説明する。
【０１８９】
次にステップＳ１３２１に進み、ルートノードが登録されているか判定する。ルートノードがまだ削除されておらず登録されていれば、ステップＳ１３２２に進み、ステップＳ１３２０で得た親ノードを検索開始ノードに設定してステップＳ１３１１に戻る。
【０１９０】
ルートノードが削除済みで登録されていなければ、ステップＳ１３２３に進み、ステップＳ１３１３でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列より、次のキーからキーの最大値まで取り出してマージ済みキー配列に順次書き出して処理を終了する。
【０１９１】
先に述べたように、実施例２は、最小値検索の検索開始ノードを、直前の削除処理で得られた削除ノードの親ノードとすることにより、最小値検索の実行ステップ数を削減しようとするものである。しかし、次のキーを挿入するまでは次の最小値を確定することができない。
【０１９２】
そこで、ステップＳ１３１８に示すように先に次のキーを挿入する。そして、次のキーを挿入したツリーから、次のキーを挿入する前のツリーの最小値検索により得られた最小値を含むノードを削除する。ところが、挿入ノードが最小値検索の時の経路上に存在する場合には、挿入処理により挿入キーを保持するリーフノードを含むノード対が挿入ノードと最小値を含むリーフノードとの間に挿入されている。したがって、次のキーの挿入後のルートノードから最小値を保持するリーフノードに至る経路が次のキーの挿入前と一致しない。すると、引き続いて実行される削除処理において、削除ノードの親ノードを正しく設定することができず、削除処理自体も正しく行うことができないので、再度ルートノードから、最小値検索を行い、最小値検索用の探索経路スタックをリフレッシュする必要がある。
【０１９３】
一方、挿入ノードが最小値検索の時の経路上に存在しない場合には、挿入処理により挿入キーを保持するリーフノードを含むノード対が挿入ノードと最小値を含むリーフノードとの間に挿入されていないので、次のキーの挿入後のルートノードから最小値を保持するリーフノードに至る経路が次のキーの挿入前と一致する。したがって、挿入処理の後であっても、この場合には、削除処理において削除ノードの親ノードを正しく設定することができるので、削除処理を正しく実行し、その親ノードから次の最小値検索を行うことができる。
【０１９４】
なお、念のため説明すれば、削除ノードは最小値を含むノードであることから、次の最小値を含むノードは、カップルドノードツリーの順序性によって、削除ノードの親ノードの下位のノードである。したがって、親ノードを次の最小値検索の検索開始ノードとすることができる。
【０１９５】
次に、図１４Ａを参照して、マージ配列から削除ノードを削除するとともに、親ノードを得る処理を説明する。
図１４Ａに示すように、ステップＳ１４０２で探索経路スタックに２つ以上の配列番号が格納されているか判定する。図８ＢのステップＳ８１２で説明したのと同じく、２つ以上の配列番号が格納されていないということは、言い換えれば１つだけ配列番号が格納されており、その配列番号はルートノードの格納された配列要素のものである。その場合はステップＳ１４０７に移行し、ルートノードの配列番号に係るノード対を削除する。次にステップＳ１４０８に進み、登録されていたルートノードの配列番号を削除して処理を終了する。
【０１９６】
ステップＳ１４０２において探索経路スタックに２つ以上の配列番号が格納されていると判定されたときはステップＳ１４０３に進み、ステップＳ１４０１で設定した削除ノードと対をなすノードの配列番号を求め、対ノードの配列番号として設定する。
【０１９７】
次にステップＳ１４０４に進み、図１３Ｂに示すステップＳ１３１１の最小値検索で用いた探索経路スタックのスタックポインタを１つ戻して配列番号を取り出し、親ノードの配列番号として設定する。
【０１９８】
次にステップＳ１４０５に進み、ステップＳ１４０３で設定した対ノードの配列番号の指す配列要素の内容を読み出し、ステップＳ１４０４で設定した親ノードの配列番号の指す配列要素に格納する。
【０１９９】
次にステップＳ１４０６に進み、削除ノードの配列番号に係るノード対を削除して処理を終了する。
次に図１４Ｂを参照して、探索経路スタックの検索処理について説明する。
【０２００】
図１４Ｂに示すように、ステップＳ１４１１において、検索用スタックポインタとして、図１３Ｂに示すステップＳ１３１１で実行した最小値検索における探索経路スタックのスタックポインタを設定する。
【０２０１】
次にステップＳ１４１２で、検索番号設定エリアに図１３Ｂに示すステップＳ１３１８で得られた挿入ノードの配列番号を検索番号として設定する。
次にステップＳ１４０３で、検索用スタックポインタがルートノードの格納された配列要素の配列番号を指しているか判定する。検索用スタックポインタがルートノードの格納された配列要素の配列番号を指していれば、最小値検索の探索経路スタックに格納された配列番号は挿入ノードの配列番号と一致しないことを出力して処理を終了する。
【０２０２】
検索用スタックポインタがルートノードの格納された配列要素の配列番号を指していなければ、ステップＳ１４１４に進み、検索用スタックポインタを１つ戻して配列番号を取り出す。
【０２０３】
次にステップＳ１４１５において、ステップＳ１４０２で設定した検索番号とステップＳ１４１４で取り出した配列番号が一致するか判定する。一致しなければ、ステップＳ１４１３に戻る。
【０２０４】
一致すれば、最小値検索の探索経路スタックに格納された配列番号には挿入ノードの配列番号と一致するものがあることを出力して処理を終了する。
次に実施例３について説明する。後に図１３Ｃを参照して詳細に説明するが、実施例３では、基本的には実施例１と同様に最小値検索、削除処理、挿入処理の順番で処理を行うが、削除処理の後に削除ノードの親ノードを検索開始ノードとして中間的に最小値検索を行い、その最小値と次に処理元から取り出されるキーとの大小比較を行い、次のキーが小さければ挿入処理はスキップして直接マージ済みキー配列に書き出すものである。
【０２０５】
図１２Ｂは実施例３の概要を説明する図であり、図１２Ｂの（１）はマージ処理の前段を、図１２Ｂの（２）はマージ処理の後段を説明する図である。
図１２Ｂを図９に示す実施例１の概要と比較すると、説明の都合上、ソート済みキー配列３１２ｃのキー配列番号２に、キー４８２ｃが追加されている。また、ステップ（Ａ）以外におけるマージ配列の部分が異なる。
【０２０６】
ステップ（Ａ）での処理は図９に示すステップ（Ａ）での処理と同様であり、マージ配列３０９ａが生成される。
次のステップ（Ｂ）において、マージ配列３０９ａに格納された最小値であるキー４８０ｂがマージ済みキー配列３１３のキー配列番号０の配列要素に格納され、キー４８０ｂはマージ配列３０９ａから削除される。次にキー４８０ｂ削除後のマージ配列３０９ａの次の最小値であるキー４８０ａと処理元識別子を求める。そして、キー４８０ｂを取り出した処理元のソート済みキー配列３１２ｂからキー４８０ｂを取り出した後の最小値である次のキー４８１ｂを取り出してキー４８０ａとの大小比較を行う。次のキー４８１ｂがマージ配列３０９ａの次の最小値であるキー４８０ａより大きいので、キー４８１ｂをマージ配列３０９ａに挿入してマージ配列３０９ｂ’を得る。
【０２０７】
次のステップ（Ｃ）において、マージ配列３０９ｂ’に格納された最小値であるキー４８０ａがマージ済みキー配列３１３のキー配列番号１の配列要素に格納され、キー４８０ａはマージ配列３０９ｂ’から削除される。次にキー４８０ａ削除後のマージ配列３０９ｂ’の次の最小値であるキー４８０ｃと処理元識別子を求める。そして、キー４８０ａを取り出した処理元のソート済みキー配列３１２ａからキー４８０ａを取り出した後の最小値である次のキー４８１ａを取り出してキー４８０ｃとの大小比較を行う。次のキー４８１ａがマージ配列３０９ｂ’の次の最小値であるキー４８０ｃであるより大きいので、キー４８１ａをマージ配列３０９ｂ’に挿入してマージ配列３０９ｃ’を得る。
【０２０８】
次のステップ（Ｄ）において、マージ配列３０９ｃ’に格納された最小値であるキー４８０ｃがマージ済みキー配列３１３のキー配列番号２の配列要素に格納され、マージ配列３０９ｃ’から削除される。次にキー４８０ｃ削除後のマージ配列３０９ｃ’の次の最小値であるキー４８１ｂと処理元識別子を求める。そして、キー４８０ｃを取り出した処理元のソート済みキー配列３１２ｃからキー４８０ｃを取り出した後の最小値である次のキー４８１ｃを取り出してキー４８１ｂとの大小比較を行う。次のキー４８１ｃがマージ配列３０９ｃ’の次の最小値であるキー４８１ｂより小さいので、次のキー４８１ｃをマージ済みキー配列３１３のキー配列番号３の配列要素に格納する。ステップ（Ｄ）ではマージ配列マージ配列３０９ｃ’に挿入される次のキーはなく、キー４８０ｃ削除後のマージ配列３０９ｃ’が、図示のマージ配列３０９ｄ’である。
【０２０９】
この段階では、図１２Ｂの（１）に示すように、マージ済みキー配列３１３には、キー配列番号０〜３の配列要素に、それぞれキー４８０ｂ“０００１１１”、キー４８０ａ“００１０１０”、キー４８０ｃ“０１００１１” 及びキー４８１ｃ“０１１０００”が格納されている。そして、ソート済みキー配列３１２ｂのキーは全て取り出し済みであり、ソート済みキー配列３１２ａとソート済みキー配列３１２ｃに、未取り出しのキーが残っている。
【０２１０】
図１２Ｂの（２）に示すステップ（Ｅ）では、ソート済みキー配列３１２ｃからキー４８１ｃを取り出した後の最小値である次のキー４８２ｃを取り出してキー４８１ｂとの大小比較を行う。次のキー４８２ｃがマージ配列３０９ｄ’の最小値であるキー４８１ｂより大きいので、キー４８２ｃをマージ配列３０９ｄ’に挿入する。
【０２１１】
そして、キー４８２ｃ挿入後のマージ配列３０９ｄ’の最小値であるキー４８１ｂがマージ済みキー配列３１３のキー配列番号４の配列要素に格納され、マージ配列３０９ｄ’から削除され、マージ配列３０９ｅ’を得る。
【０２１２】
次のステップ（Ｆ）では、ステップ（Ｅ）で削除されたキー４８１ｂの処理元のソート済みキー配列３１２ｂのキーは全て取り出し済みであるからマージ配列３０９ｅ’へ挿入されるキーはない。マージ配列３０９ｅ’に格納された最小値であるキー４８２ｃがマージ済みキー配列３１３のキー配列番号５の配列要素に格納され、キー４８２ｃはマージ配列３０９ｅ’から削除され、マージ配列３０９ｆ’を得る。
【０２１３】
次のステップ（Ｇ）においても、ステップ（Ｆ）で削除されたキー４８２ｃの処理元のソート済みキー配列３１２ｃのキーは全て取り出し済みであるからマージ配列３０９ｆ’へ挿入されるキーはない。マージ配列３０９ｆ’に格納された最小値であるキー４８１ａがマージ済みキー配列３１３のキー配列番号６の配列要素に格納され、キー４８１ａはマージ配列３０９ｆ’から削除される。そして、図に示すように、マージ配列は空、すなわちカップルドノードツリーのルートノードは削除済みとなる。
【０２１４】
最後のステップ（Ｈ）において、未取り出しのキーが残っているソート済みキー配列３１２ａからキー４８２ａを取り出してマージ済みキー配列３１３のキー配列番号７の配列要素に格納してマージソートが完了する。
【０２１５】
次に実施例３のマージ処理のフローについて説明する。図１２Ａの例示におけるマージ配列３０９ａをカップルドノードツリーの構造を持つものとして生成するまでの初期処理は、図１３Ａに示す実施例２の処理フローと同一である。したがって、それ以降のマージ配列から最小値を検索してマージ済み配列に書き込む処理を、図１３Ｃを参照して説明する。
【０２１６】
図１３Ｃに示すように、ステップＳ１３５０において検索開始ノードにルートノードを設定する。
次にステップＳ１３５１に進み、図５Ａに示す最小値検索を実行し、最小値と処理元識別子を求め、ステップＳ１３５２において、ステップＳ１３５１で得た最小値をマージ済みキー配列に書き出す。
【０２１７】
次にステップＳ１３５３において、ステップＳ１３５１で求めた処理元識別子をソート済みキー配列の識別子としてソート済みキー配列識別子設定エリアに設定する。
次にステップＳ１３５４に進み、削除ノード設定エリアにステップＳ１３５１あるいは後記ステップＳ１３５８で求めた最小値を含むノードの配列番号を設定し、次にステップＳ１３５５において、マージ配列から削除ノードを削除するとともに、削除ノードの直近上位の親ノードを得る。なお、ステップＳ１３５５の処理の詳細は、先に図１４Ａを参照して説明したものである。
【０２１８】
次にステップＳ１３５６に進み、ルートノードが登録されているか判定する。ルートノードがまだ削除されておらず登録されていれば、ステップＳ１３５７以降の処理に進み、ステップＳ１３５２あるいはステップＳ１３５０に戻る。
【０２１９】
ルートノードが削除済みで登録されていなければ、ステップＳ１３６６に進み、ステップＳ１３５３でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列より、次のキーからキーの最大値まで取り出してマージ済みキー配列に順次書き出して処理を終了する。
【０２２０】
ステップＳ１３５７においては、ステップＳ１３５５で得た親ノードを検索開始ノードに設定し、ステップＳ１３５８に進み、図５Ａに示す最小値検索を実行し、最小値と処理元識別子を求める。
【０２２１】
次にステップＳ１３５９に進み、ステップＳ１３５３でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列から、次のキーの取り出しを試みる。
【０２２２】
ステップＳ１３５９に続いてステップＳ１３６０に進み、ステップＳ１３５９で次のキーを取り出せたか、すなわち全てのキーを取り出し済みであったかを判定する。
全てのキーを取り出し済みであれば、ステップＳ１３５２に戻り、図１２Ｂのステップ（Ｅ）、ステップ（Ｆ）について説明したように、挿入処理をスキップしてマージ済みキー配列への最小値書き出しと削除処理を行う。
【０２２３】
全てのキーを取り出し済みでなければ、ステップＳ１３６１へ進む。ステップＳ１３６１では、ステップＳ１３５９で取り出した次のキーとステップＳ１３５８で求めた最小値の大小関係を判定する。
【０２２４】
次のキーが最小値より小さければ、次のキーをマージ配列に挿入して最小値検索を行ったとしても、求められるのはその次のキーであるから、挿入処理は行わず、ステップＳ１３６２に分岐してマージ済みキー配列に次のキーを書き出し、ステップＳ１３５９に戻ってさらに次のキーを取り出す。
【０２２５】
次のキーが最小値より小さくなければ、ステップＳ１３６３〜ステップＳ１３６５のキーをマージ配列に挿入する処理を実行してステップＳ１３５０に戻る。
ステップＳ１３６３において、挿入処理のための処理元識別子設定エリアに、ステップＳ１３５３で設定した、すなわちステップＳ１３５１で求めた処理元識別子を設定し、ステップＳ１３６４で、挿入キーにステップＳ１３５９で取り出したキーを設定する。そして、ステップＳ１３６５において、図６Ａ〜図６Ｃに示す挿入処理を実行し、ステップＳ１３５０に戻る。
【０２２６】
次に、図１５〜図２４Ｃを参照して、第２の実施形態に係るマージソートについて説明する。本実施形態は、先に述べた特願２００７−１１４９１５において提案した、インデックスキーをカップルドノードツリーとは別の領域に配置し、リーフノードにはインデックスキーに代えてインデックスキーの配置された領域へのポインタを格納したカップルドノードツリーを用いるものである。その際、本実施例では、インデックスキーとともに処理元識別子を格納することにより、マージソートに適用可能とする。
【０２２７】
図１５は、第２の実施形態に係る配列に格納されたカップルドノードツリーの構成例を説明する図である。図２Ａに示す第１の実施形態に係る構成例と比較すると、リーフノードであるノード［１］に、図２Ａに示す処理元識別子１１９とインデックスキー１１８に代えて、該インデックスキーと処理元識別子の格納された領域を示す参照ポインタ１１８ａが格納されている点でことなるだけで、他は同じであるから、説明は省略する。
【０２２８】
図１６の（１）に示すのは、本実施形態に係るカップルドノードツリーのツリー構造を概念的に示す図であり、同図の（２）に示すのは、参照ポインタの指す処理元識別子とインデックスキーからなるキー情報を格納したキー情報の記憶領域３１１を示す図である。
【０２２９】
図１６の（１）に示すカップルドノードツリーは、図２Ｂに例示するカップルドノードツリーの各リーフノードの処理元識別子とインデックスキーを参照ポインタ２８０ｃ、２８１ｄ、２８０ｅ、２８１ｅ、２８０ｇ、２８１ｇ、２８０ｈ、２８１ｈで置き換えたものであり、図１６の（２）に示すキー情報の記憶領域３１１の各参照ポインタの指すエリアには図２Ａに示す対応するキー情報である処理元識別子とインデックスキーが格納されている。
【０２３０】
図１７は、本実施形態のためのハードウェア構成例を説明する図である。図３に示す第１の実施形態のためのハードウェア構成例と比較すると、キー情報の記憶領域３１１がデータ格納装置３０８に加わっただけであるから、説明を省略する。
【０２３１】
図１８は、本実施態様に係るカップルドノードツリーを用いたビット列検索の基本動作を示すフローチャートである。
ステップＳ１８０１〜ステップＳ１８０９の処理は、図４に示す第１の実施形態のビット列検索の基本動作を示すフローチャートのステップＳ４０１〜ステップＳ４０９と同じであるから、説明を省略する。
【０２３２】
ステップＳ１８０５で、ノード種別がブランチでない、すなわち、リーフノードであると判定されると、ステップＳ１８１０ａに分岐し、該リーフノードから参照ポインタを取り出し、ステップＳ１８１０ｂで参照ポインタの指すキー情報を読み出す。
【０２３３】
そして、ステップＳ１８１０ｃでキー情報からインデックスキーを取り出し、ステップＳ１８１０ｄで処理元識別子を取り出して処理を終了する。
図１９Ａは、本実施態様に係るカップルドノードツリーに格納されたインデックスキーの最小値を求める処理を示したフローチャートである。
【０２３４】
ステップＳ１９０１〜ステップＳ１９０７の処理は、図５Ａに示す第１の実施形態の最小値検索を示すフローチャートのステップＳ４０１〜ステップＳ４０９と同じであるから、説明を省略する。
【０２３５】
ステップＳ１９０５で、ノード種別がブランチでない、すなわち、リーフノードであると判定されると、ステップＳ１９０８ａに分岐し、該リーフノードから参照ポインタを取り出し、ステップＳ１９０８ｂで参照ポインタの指すキー情報を読み出す。
【０２３６】
そして、ステップＳ１９０８ｃでキー情報からインデックスキーを取り出し、ステップＳ１９０８ｄで処理元識別子を取り出して処理を終了する。
図１９Ｂは、本実施態様に係るカップルドノードツリーに格納されたインデックスキーの最大値を求める処理を示したフローチャートである。
【０２３７】
ステップＳ１９１１〜ステップＳ１９１８ｄまでの処理のうち、ステップＳ１９１７の処理が代表ノード番号に値１を加えて配列番号を得るものである点を除いて、図１９Ａに示すステップＳ１９０１〜Ｓ１９０８ｄまでの処理と同様であるので、説明は省略する。
【０２３８】
図２０Ａ〜図２０Ｃ、図２１は、本実施態様に係るカップルドノードツリーにおけるノード挿入処理を説明する図である。図２０Ａ〜図２０Ｃが通常の挿入処理を説明するものであり、図２１はルートノードの挿入処理を説明するものである。
【０２３９】
図２０Ａは挿入処理の前段である検索処理の処理フローを示す図である。
ステップＳ２００１において、検索開始ノードの配列番号を設定するエリアにルートノードの配列番号を設定し、ステップＳ２００２において、検索キーに挿入キーを設定する。
【０２４０】
次にステップＳ２０１０において、図１８に示す検索処理を実行し検索結果のインデックスキーを得て、ステップＳ２０１１に進む。
ステップＳ２０１１において挿入キーとステップＳ２０１０で得られたインデックスキーを比較し、等しければ挿入キーは既にカップルドノードツリーに存在するのであるから、挿入は失敗となり、処理を終了する。挿入キーとステップＳ２０１０で得られたインデックスキーが等しくなければ、ステップＳ２０１１ａに進み、キー情報設定エリアのインデックスキーに挿入キーを設定する。
【０２４１】
次にステップＳ２０１１ｂにおいてキー情報設定エリアの処理元識別子に、挿入キーの処理元識別子を設定して図２０ＢのステップＳ２０１２に進む。
図２０Ｂは、挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。図６Ｂに示す第１の実施形態のものと、図２０Ａにおける検索処理が図１８に示すものである点を除いて同一であるので、説明を省略する。
【０２４２】
図２０Ｃは図２０Ｂで準備された配列にノードを格納するとともにその挿入位置を求め、既存のノードの内容を変更して挿入処理を完成させる処理フローを示す図である。図２０Ｃに示すステップＳ２０１６〜ステップＳ２０２４までの処理は、第１の実施形態の図６Ｃに示すステップＳ６１６〜ステップＳ６２４までの処理と同じであるので、説明を省略する。
【０２４３】
ステップＳ２０２４に引き続き、ステップＳ２０２５ａにおいて、キー情報の記憶領域の空き領域へのポインタを取得する。この空き領域へのポインタを取得は、キー情報の記憶領域の管理手法に応じて行うことができる。
【０２４４】
次にステップＳ２０２５ｂに進み、ステップＳ２０１１ａ、ステップＳ２０１１ｂで設定したキー情報を、ステップＳ２０２５ａで取得したポインタの指すキー情報の記憶領域に書き込む。
【０２４５】
次にステップＳ２０２５ｃに進み、ステップＳ２０１４で得た配列番号の指す配列要素の、ノード種別にリーフを、参照ポインタにステップＳ２０２５ａで得たポインタを書き込む。
【０２４６】
次のステップＳ２０２６〜ステップＳ２０２８の処理終了までの処理は、第１の実施形態の図６Ｃに示すステップＳ６２６〜ステップＳ６２８までの処理と同じであるので、説明を省略する。
【０２４７】
図２１は、本実施態様に係るカップルドノードツリーを新規に生成し登録する処理、すなわちルートノードの挿入処理を説明する図である。
まず、ステップＳ２１０２において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。次にステップＳ２１０３において、ステップＳ２１０２で得た配列番号に０を加えた配列番号を求める。（実際には、ステップＳ２１０２で取得した配列番号に等しい。) 
次にステップＳ２１０３ａにおいて、キー情報の記憶領域の空き領域へのポインタを取得し、ステップＳ２１０３ｂで取得してポインタの指す記憶領域のキー情報の処理元識別子に挿入キーを取り出したソート済み配列の識別子を、インデックスキーに挿入キーを書き込む。
【０２４８】
さらにステップＳ２１０４において、ステップＳ２１０３で得た配列番号の配列要素に、ノード種別に１（リーフノード)を、参照ポインタにＳ２１０３ａで得たポインタを書き込み、ステップＳ２１０５に進む。
【０２４９】
ステップＳ２１０５で、ステップＳ２１０２で取得したルートノードの配列番号を登録して処理を終了する。
図２２Ａと図２２Ｂは、本実施態様に係るカップルドノードツリーのインデックスキーのうち、特定のインデックスキーを削除する処理フローを説明する図である。
【０２５０】
図２２Ａは、削除処理の前段である検索処理の処理フローを示す図であるが、図８Ａに示す第１の実施形態のものと、検索処理が図１８に示すものである点を除いて同一であるので、説明を省略する。
【０２５１】
図２２Ｂは、削除処理の後段の処理フローを説明する図である。図２２Ｂに示すステップＳ２２１２〜ステップＳ２２１９の処理は、図８Ｂに示す第１の実施形態のものと同一であるので、説明を省略する。
【０２５２】
本実施例ではキー情報の記憶領域を用いていることから、最後の処理として、ステップＳ２２２０において、ステップＳ２２１０で得た参照ポインタの指す記憶領域を開放し、処理を終了する。
【０２５３】
以上、本実施形態のソートマージで用いるカップルドノードツリーとキー情報の記憶領域について説明した。
次に、図２３Ａ、図２３Ｂを参照して第２の実施形態に係るカップルドノードツリーを用いた本発明の実施例４を説明する。
【０２５４】
本実施例は、第１の実施形態に係るカップルドノードツリーを用いた実施例１において、第２の実施形態に係るカップルドノードツリーを用いるようにしたものである。
図２３Ａ及び図２３Ｂは、本実施例におけるカップルドノードツリーを用いたマージソート処理フローを説明する図である。
【０２５５】
図２３Ａは、例えば図９に示すマージ配列３０９ａをカップルドノードツリーの構造を持つものとして生成し、検索開始ノードの配列番号を設定するエリアに、生成したカップルドノードツリーのルートノードの配列番号を設定するまでの初期処理を説明するものであり、図２３Ｂは、それ以降の最小値を検索してマージを実行する処理を説明する図である。
【０２５６】
図２３Ａに示すステップＳ２３０１〜ステップＳ２３１０の処理は、図１０Ａに示す実施例１の処理と比較すると、ステップ２３０９における挿入処理が第２の実施態様に係る図２０Ａ〜図２０Ｃに示すものであることと、ステップＳ２３０８におけるルートノードの挿入処理が第２の実施態様に係る図２１に示すものであることを除けば、図１０Ａに示すステップＳ１００１〜ステップＳ１０１０と同じであるので、説明を省略する。
【０２５７】
また、図２３Ｂに示すステップＳ２３１１〜Ｓ２３２２の処理も、図１０Ｂに示す実施例１の処理と比較すると、ステップＳ２３１１の検索処理が第２の実施態様に係る図１９に示すものであること、ステップＳ２３１４の削除処理が第２の実施態様に係る図２２Ａ、図２２Ｂに示すものであること、及びステップ２３２１における挿入処理が第２の実施態様に係る図２０Ａ〜図２０Ｃに示すものであることを除けば、図１０Ｂに示すステップＳ１０１１〜ステップＳ１０２２と同じであるので、説明を省略する。
【０２５８】
次に、図２４Ａ、図２４Ｂを参照して第２の実施形態に係るカップルドノードツリーを用いた本発明の実施例５を説明する。
本実施例は、第１の実施形態に係るカップルドノードツリーを用いた実施例２において、第２の実施形態に係るカップルドノードツリーを用いるようにしたものである。
【０２５９】
図２４Ａ及び図２４Ｂは、本実施例におけるカップルドノードツリーを用いたマージソート処理フローを説明する図である。
図２４Ａは、例えば図１２Ｂに示すマージ配列３０９ａをカップルドノードツリーの構造を持つものとして生成し、検索開始ノードの配列番号を設定するエリアに、生成したカップルドノードツリーのルートノードの配列番号を設定するまでの初期処理を説明するものであり、図２４Ｂは、それ以降の最小値を検索してマージを実行する処理を説明する図である。
【０２６０】
図２４Ａは、図１２Ｂを参照した先の説明からも分かるように、実施例４に係る図２３Ａのフロート全く同様であるので、説明を省略する。
また、図２４Ｂに示すステップＳ２４１０〜Ｓ２４２３の処理も、図１３Ｂに示す実施例２の処理と比較すると、ステップＳ２４１１の検索処理が第２の実施態様に係る図１９に示すものであること、ステップ２４１８における挿入処理が第２の実施態様に係る図２０Ａ〜図２０Ｃに示すものであること及びステップＳ２４２０の削除処理の次に、ステップＳ２４２０ａが挿入され、ステップＳ２４１０で得た参照ポインタの指す記憶領域を開放することを除けば、図１３Ｂに示すステップＳ１３１０〜ステップＳ１３２３と同じであることを指摘して、説明の繰り返しを省略する。
【０２６１】
次に第２の実施形態に係るカップルドノードツリーを用いた本発明の実施例６を説明する。本実施例は、第１の実施形態に係るカップルドノードツリーを用いた実施例において、第２の実施形態に係るカップルドノードツリーを用いるようにしたものである。
【０２６２】
図２４Ａ及び図２４Ｃは、本実施例におけるカップルドノードツリーを用いたマージソート処理フローを説明する図である。マージソートの初期処理は実施例５とまったく同じで、図２４Ａに示す処理は共通である。
【０２６３】
初期処理以降の最小値を検索してマージを実行する処理を説明する図２４Ｃも、実施例３の初期処理以降の最小値を検索してマージを実行する処理を説明する図１３Ｃと同様なものである。
【０２６４】
図２４Ｃに示すステップＳ２４５０〜Ｓ２４６６の処理は、図１３Ｃに示す実施例３の処理と比較すると、ステップＳ２４５１及びステップＳ２４５８の検索処理が第２の実施態様に係る図１９に示すものであること、ステップ２４６５における挿入処理が第２の実施態様に係る図２０Ａ〜図２０Ｃに示すものであること及びステップＳ２４５５の削除処理の次に、ステップＳ２４５５ａが挿入され、ステップＳ２４５１で得た参照ポインタの指す記憶領域を開放することを除けば、図１３Ｃに示すステップＳ１３５０〜ステップＳ１３６６と同じであることを指摘して、説明の繰り返しを省略する。
【０２６５】
以上本発明を実施するための最良の形態について昇順のソートマージを例にとって詳細に説明したが、降順のソートマージについても昇順のソートマージを修正することにより実施可能であることは明らかである。また、本発明の実施の形態は上記に限ることなく種々の変形が可能であることは当業者に明らかである。さらに、本発明のビット列のマージソート方法をコンピュータに実行させるプログラムによりコンピュータ上に構築可能なことは明らかである。
【０２６６】
したがって、上記プログラム、及びプログラムを記憶したコンピュータ読み取り可能な記憶媒体は、本発明の実施の形態に含まれる。さらに、本発明のカップルドノードツリーのデータ構造も、本発明の実施の形態に含まれる。
【図面の簡単な説明】
【０２６７】
【図１Ａ】ソート済みのデータのマージを繰り返してソート対象データ全体のソートを行うマージソートの後段の処理を説明する図である。
【図１Ｂ】従来の検索で用いられるパトリシアツリーの一例を示す図である。
【図２Ａ】第１の実施形態に係る配列に格納されたカップルドノードツリーの構成例を説明する図である。
【図２Ｂ】第１の実施形態に係るカップルドノードツリーのツリー構造を概念的に示す図である。
【図３】第１の実施形態のためのハードウェア構成例を説明する図である。
【図４】第１の実施形態に係るビット列検索の基本動作を示したフローチャートである。
【図５Ａ】第１の実施形態に係る、カップルドノードツリーに格納されたインデックスキーの最小値を求める処理を示したフローチャートである。
【図５Ｂ】第１の実施形態に係る、カップルドノードツリーに格納されたインデックスキーの最大値を求める処理を示したフローチャートである。
【図６Ａ】第１の実施形態に係る、挿入処理の前段である検索処理の処理フローを示す図である。
【図６Ｂ】第１の実施形態に係る、挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。
【図６Ｃ】第１の実施形態に係る、ノード対を挿入する位置を求め、ノード対の各ノードの内容を書き込んで挿入処理を完成させる処理フローを示す図である。
【図７】第１の実施形態に係る、ルートノードの挿入処理を説明する処理フロー図である。
【図８Ａ】第１の実施形態に係る、削除処理の前段である検索処理の処理フローを示す図である。
【図８Ｂ】第１の実施形態に係る、削除処理の後段の処理フローを説明する図である。
【図９】実施例１の概要を説明する図である。
【図１０Ａ】実施例１におけるカップルドノードツリーを用いたマージソートの初期処理を説明する図である。
【図１０Ｂ】実施例１におけるカップルドノードツリーの最小値を検索してマージを実行する処理を説明する図である。
【図１１Ａ】図９に示す例をカップルドノードツリーで説明する第１の図である。
【図１１Ｂ】図９に示す例をカップルドノードツリーで説明する第２の図である。
【図１１Ｃ】図９に示す例をカップルドノードツリーで説明する第３の図である。
【図１１Ｄ】図９に示す例をカップルドノードツリーで説明する第４の図である。
【図１１Ｅ】図９に示す例をカップルドノードツリーで説明する第５の図である。
【図１１Ｆ】図９に示す例をカップルドノードツリーで説明する第６の図である。
【図１２Ａ】実施例２の概要を説明する図である。
【図１２Ｂ】実施例３の概要を説明する図である。
【図１３Ａ】実施例２及び３におけるカップルドノードツリーを用いたマージソートの初期処理を説明する図である。
【図１３Ｂ】実施例２におけるカップルドノードツリーの最小値を検索してマージを実行する処理を説明する図である。
【図１３Ｃ】実施例３におけるカップルドノードツリーの最小値を検索してマージを実行する処理を説明する図である。
【図１４Ａ】実施例２及び３における削除処理を説明する図である。
【図１４Ｂ】探索経路スタックの検索処理を説明する図である。
【図１５】第２の実施形態に係る配列に格納されたカップルドノードツリーの構成例を説明する図である。
【図１６】第２の実施形態に係るカップルドノードツリーのツリー構造を概念的に示す図である。
【図１７】第２の実施形態のためのハードウェア構成例を説明する図である。
【図１８】第２の実施形態に係るビット列検索の基本動作を示したフローチャートである。
【図１９Ａ】第２の実施形態に係る、カップルドノードツリーを用いたインデックスキーの最小値を求める処理を示したフローチャートである。
【図１９Ｂ】第２の実施形態に係る、カップルドノードツリーを用いたインデックスキーの最大値を求める処理を示したフローチャートである。
【図２０Ａ】第２の実施形態に係る、挿入処理の前段である検索処理の処理フローを示す図である。
【図２０Ｂ】第２の実施形態に係る、挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。
【図２０Ｃ】第２の実施形態に係る、ノード対を挿入する位置を求め、ノード対の各ノードの内容を書き込んで挿入処理を完成させる処理フローを示す図である。
【図２１】第２の実施形態に係る、ルートノードの挿入処理を説明する処理フロー図である。
【図２２Ａ】第２の実施形態に係る、削除処理の前段である検索処理の処理フローを示す図である。
【図２２Ｂ】第２の実施形態に係る、削除処理の後段の処理フローを説明する図である。
【図２３Ａ】実施例４におけるカップルドノードツリーを用いたマージソートの初期処理を説明する図である。
【図２３Ｂ】実施例４におけるカップルドノードツリーにより最小値を検索してマージを実行する処理フローを説明する図である。
【図２４Ａ】実施例５及び６におけるカップルドノードツリーを用いたマージソートの初期処理を説明する図である。
【図２４Ｂ】実施例５におけるカップルドノードツリーにより最小値を検索してマージを実行する処理フローを説明する図である。
【図２４Ｃ】実施例６におけるカップルドノードツリーにより最小値を検索してマージを実行する処理フローを説明する図である。
【符号の説明】
【０２６８】
１０、２０、３０   配列番号
１００      配列
１０１      ノード
１０２      ノード種別
１０３      弁別ビット位置
１０４      代表ノード番号
１１１      ノード対
１１２      ノード［０］、代表ノード
１１３      ノード［１］、代表ノードと対をなすノード
１１８      インデックスキー
３０１      データ処理装置
３０２      中央処理装置
３０３      キャッシュメモリ
３０４      バス
３０５      主記憶装置
３０６      外部記憶装置
３０７      通信装置
３０８      データ格納装置
３０９      配列
３１０      探索経路スタック
３１１      キー情報の記憶領域
３１２      ソート済みキー配列
３１３      マージ済みキー配列
【図１Ａ】
0004502223.tif 000002
【図１Ｂ】
0004502223.tif 000003
【図２Ａ】
0004502223.tif 000004
【図２Ｂ】
0004502223.tif 000005
【図３】
0004502223.tif 000006
【図４】
0004502223.tif 000007
【図５Ａ】
0004502223.tif 000008
【図５Ｂ】
0004502223.tif 000009
【図６Ａ】
0004502223.tif 000010
【図６Ｂ】
0004502223.tif 000011
【図６Ｃ】
0004502223.tif 000012
【図７】
0004502223.tif 000013
【図８Ａ】
0004502223.tif 000014
【図８Ｂ】
0004502223.tif 000015
【図９】
0004502223.tif 000016
【図１０Ａ】
0004502223.tif 000017
【図１０Ｂ】
0004502223.tif 000018
【図１１Ａ】
0004502223.tif 000019
【図１１Ｂ】
0004502223.tif 000020
【図１１Ｃ】
0004502223.tif 000021
【図１１Ｄ】
0004502223.tif 000022
【図１１Ｅ】
0004502223.tif 000023
【図１１Ｆ】
0004502223.tif 000024
【図１２Ａ】
0004502223.tif 000025
【図１２Ｂ】
0004502223.tif 000026
【図１３Ａ】
0004502223.tif 000027
【図１３Ｂ】
0004502223.tif 000028
【図１３Ｃ】
0004502223.tif 000029
【図１４Ａ】
0004502223.tif 000030
【図１４Ｂ】
0004502223.tif 000031
【図１５】
0004502223.tif 000032
【図１６】
0004502223.tif 000033
【図１７】
0004502223.tif 000034
【図１８】
0004502223.tif 000035
【図１９Ａ】
0004502223.tif 000036
【図１９Ｂ】
0004502223.tif 000037
【図２０Ａ】
0004502223.tif 000038
【図２０Ｂ】
0004502223.tif 000039
【図２０Ｃ】
0004502223.tif 000040
【図２１】
0004502223.tif 000041
【図２２Ａ】
0004502223.tif 000042
【図２２Ｂ】
0004502223.tif 000043
【図２３Ａ】
0004502223.tif 000044
【図２３Ｂ】
0004502223.tif 000045
【図２４Ａ】
0004502223.tif 000046
【図２４Ｂ】
0004502223.tif 000047
【図２４Ｃ】
0004502223.tif 000048