JP4502223B2 - ビット列のマージソート装置、方法及びプログラム - Google Patents

ビット列のマージソート装置、方法及びプログラム Download PDF

Info

Publication number
JP4502223B2
JP4502223B2 JP2007314782A JP2007314782A JP4502223B2 JP 4502223 B2 JP4502223 B2 JP 4502223B2 JP 2007314782 A JP2007314782 A JP 2007314782A JP 2007314782 A JP2007314782 A JP 2007314782A JP 4502223 B2 JP4502223 B2 JP 4502223B2
Authority
JP
Japan
Prior art keywords
key
node
merge
search
tree
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2007314782A
Other languages
English (en)
Other versions
JP2009140161A (ja
JP2009140161A5 (ja
Inventor
敏男 新庄
光裕 國分
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
S Grants Co Ltd
Original Assignee
S Grants Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by S Grants Co Ltd filed Critical S Grants Co Ltd
Priority to JP2007314782A priority Critical patent/JP4502223B2/ja
Priority to CN200880119130XA priority patent/CN101884043B/zh
Priority to EP08856620A priority patent/EP2244192A4/en
Priority to PCT/JP2008/003116 priority patent/WO2009072233A1/ja
Publication of JP2009140161A publication Critical patent/JP2009140161A/ja
Publication of JP2009140161A5 publication Critical patent/JP2009140161A5/ja
Priority to US12/801,319 priority patent/US8332410B2/en
Application granted granted Critical
Publication of JP4502223B2 publication Critical patent/JP4502223B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/22Arrangements for sorting or merging computer data on continuous record carriers, e.g. tape, drum, disc
    • G06F7/32Merging, i.e. combining data contained in ordered sequence on at least two record carriers to produce a single carrier or set of carriers having all the original data in the ordered sequence merging methods in general

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Stored Programmes (AREA)

Description

本発明は、ビット列のマージソート装置及び方法とその方法をコンピュータに実行させるプログラムに関する。
近年、社会の情報化が進展し、大規模なデータベースが各所で利用されるようになってきている。このような大規模なデータベースからレコードを検索するには、各レコードの記憶されたアドレスと対応づけられたレコード内の項目をインデックスキーとして検索をし、所望のレコードを探し出すことが通例である。また、全文検索における文字列も、文書のインデックスキーと見なすことができる。
そして、それらのインデックスキーはビット列で表現されることから、データベースの検索はビット列の検索に帰着されるということができる。
一方、データベースに関連した処理として、下記特許文献1及び下記特許文献2に記載されているように、データベース中のレコードのマージソートが行われている。このマージソートもビット列のマージソートに帰着される。
基本的なマージソートの手法は、データを2個の対まで分割してそれを並び替え、並び替えられたものを組み合せて行くものである。つまり、ソート対象データの分割を繰り返しながらソートして複数のソート済みのデータを得る前段の処理と、ソート済みのデータのマージを繰り返してソート対象データ全体のソートを行う後段の処理に分かれる。
特許文献2には、マージソートの後段の処理について図1Aに示す処理が開示されている。
図1Aに示すように、ブロック1〜ブロックNにはソート済みのデータが格納されており、ブロック1の最小値は13、ブロック2の最小値は8で、次に大きいデータは22であることが例示されている。同様に、ブロック3の最小値が53、ブロック4の最小値が24、ブロックNの最小値が9であると例示されている。
マージソートの後段の処理は、上記ブロック1〜ブロックNの存在を前提としたものであり、まず、各ブロックの最小値によるデータ列を生成する。図1Aの例示では、ブロック1、ブロック2、ブロック3、ブロック4、・・・、ブロックNの最小値によるデータ列<13,8,53,24,・・・,9>が生成されている。次にそのデータ列をソートしてソート済みのデータ列<8,9,13,15,・・・,100>を生成し、最小値8を出力している。そして、この最小値8が格納されていたブロック2から次のデータ22を取り出し、ソート済みのデータ列へのデータ22の挿入位置を求めてデータ22を挿入し、ソート済みのデータ列の次の最小値を出力することを繰り返すことで、ブロック1〜ブロックNに格納されたデータのマージを行い、データ全体のソートを完了させる。
上述のように、マージソートの後段の処理においては、次のデータのソート済みデータ列への挿入位置を求める必要がある。この挿入位置を求めるために、次のデータをキーとしてソート済みデータ列に含まれるデータとの比較処理を行うことになるが、この比較処理を伴う挿入処理は次のデータを検索キーとしたソート済みデータ列の検索処理、すなわちビット列の検索処理に帰着される。
ビット列の検索処理手法については、種々のものが知られている。それらのなかでも、ビット列の検索を高速に行うために、ビット列を記憶するデータ構造を種々に工夫することが従来から行われている。このようなものの一つとして、パトリシアツリーという木構造が知られている。
図1Bは、上述の従来の検索処理に用いられているパトリシアツリーの一例を示すものである。パトリシアツリーのノードは、インデックスキー、検索キーの検査ビット位置、左右のリンクポインタを含んで構成される。明示はされていないが、ノードにはインデックスキーに対応するレコードにアクセスするための情報が含まれていることは勿論である。
図1Bの例では、インデックスキー“100010”を保持するノード1750aがルートノードとなっており、その検査ビット位置は0である。ノード1750aの左リンク1740aにはノード1750bが接続され、右リンク1741aにはノード1750fが接続されている。
ノード1750bの保持するインデックスキーは“010011”であり、検査ビット位置2030bは1である。ノード1750bの左リンク1740bにはノード1750cが、右リンク1741bにはノード1750dが接続されている。ノード1750cが保持するインデックスキーは“000111”、検査ビット位置は3である。ノード1750dが保持するインデックスキーは“011010”、検査ビット位置は2である。
ノード1750cから実線で接続された部分はノード1750cの左右のリンクポインタを示すものであり、点線の接続されていない左ポインタ1740cは、その欄が空欄であることを示している。点線の接続された右ポインタ1741cの点線の接続先は、ポインタの示すアドレスを表しており、今の場合ノード1750cを右ポインタが指定していることを表している。
ノード1750dの右ポインタ1741dはノード1750d自身を指しており、左リンク1740dにはノード1750eが接続されている。ノード1750eの保持するインデックスキーは“010010”、検査ビット位置は5である。ノード1750eの左ポインタ1740eはノード1750bを、右ポインタ1741eはノード1750eを指している。
また、ノード1750fの保持するインデックスキーは“101011”であり、検査ビット位置1730fは2である。ノード1750fの左リンク1740fにはノード1750gが、右リンク1741fにはノード1750hが接続されている。
ノード1750gの保持するインデックスキーは“100011”であり、検査ビット位置1730gは5である。ノード1750gの左ポインタ1740gはノード1750aを、右ポインタ1741gはノード1750gを指している。
ノード1750hの保持するインデックスキーは“101100”であり、検査ビット位置1730hは3である。ノード1750hの左ポインタ1740hはノード1750fを、右ポインタ1741hはノード1750hを指している。
図1Bの例では、ルートノード1750aからツリーを降りるにしたがって、各ノードの検査ビット位置が大きくなるように構成されている。
ある検索キーで検索を行うとき、ルートノードから順次各ノードに保持される検索キーの検査ビット位置を検査していき、検査ビット位置のビット値が1であるか0であるか判定を行い、1であれば右リンクをたどり、0であれば左リンクをたどる。そして、リンク先のノードの検査ビット位置がリンク元のノードの検査ビット位置より大きくなければ、すなわち、リンク先が下方でなく上方に戻れば(図1Bにおいて点線で示されたこの逆戻りのリンクをバックリンクという)、リンク先のノードのインデックスキーと検索キーの比較を行う。比較の結果、等しければ検索成功であり、等しくなければ検索失敗であることが保証されている。
上記のように、パトリシアツリーを用いた検索処理では、必要なビットの検査だけで検索できること、キー全体の比較は1回ですむことなどのメリットがあるが、各ノードからの2つのリンクが必ずあることにより記憶容量が増大することや、バックリンクの存在による判定処理の複雑化、バックリンクにより戻ることで初めてインデックスキーと比較することによる検索処理の遅延及び追加削除等データメンテナンスの困難性などの欠点がある。
これらのパトリシアツリーの欠点を解消しようとするものとして、例えば下記特許文献3に開示された技術がある。下記特許文献3に記載されたパトリシアツリーにおいては、下位の左右のノードは連続した領域に記憶することによりポインタの記憶容量を削減するとともに、次のリンクがバックリンクであるか否かを示すビットを各ノードに設けることにより、バックリンクの判定処理を軽減している。
しかしながら、下記特許文献3に開示されたものにおいても、1つのノードは必ずインデックスキーの領域とポインタの領域を占めること、下位の左右のノードを連続した領域に記憶するようにしてポインタを1つとしたため、例えば図1Bに示したパトリシアツリーの最下段の部分である左ポインタ1740c、右ポインタ1741h等の部分にもノードと同じ容量の記憶領域を割り当てる必要があるなど、記憶容量の削減効果はあまり大きいものではない。また、バックリンクによる検索処理の遅延の問題や追加削除等の処理が困難であることも改善されていない。
したがって、超大量のデータのソートマージを実行しようとすると大量のコンピュータ資源を長時間占有することとなり、非常にコストの高いものとなる。
特開2000−010761号公報 特開2006−163565号公報 特開2001−357070号公報
そこで、本発明が解決しようとする課題は、高速なビット列検索手法を応用して効率的なソートマージ手法を提供することである。
上述の従来の検索手法における問題点を解決するものとして、本出願人は、特願2006−187827において、ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対からなるビット列検索に用いるツリーであって、ルートノードはツリーの始点を表すノードであって、該ツリーのノードが1つのときはリーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードの位置を示す位置情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索を提案した。
上記出願においては、与えられたインデックスキーの集合からカップルドノードツリーを生成する方法と、カップルドノードツリーから単一のインデックスキーを検索する手法等の、カップルドノードツリーを用いた基本的な検索手法が示されている。
また、ビット列の検索には、最小値、最大値を求める、ある範囲の値のものを求める等の各種の検索要求が存在する。そこで、本出願人は、特願2006−293619において、カップルドノードツリーの任意の部分木に含まれるインデックスキーの最大値/最小値を求める手法等を提案した。
さらに本出願人は、特願2007−114915において、インデックスキーをカップルドノードツリーとは別の領域に配置し、リーフノードにはインデックスキーに代えてインデックスキーの配置された領域へのポインタを格納したカップルドノードツリーとそれを用いた各種検索処理を提案した。
本発明は、このカップルドノードツリーを応用した高速なマージソート手法を実現することを目的とする。
本発明は、昇順あるいは降順にソート済みのビット列からなるキーを格納した複数のソート済みキー記憶領域からそれぞれ最小あるいは最大のキーをインデックスキーとして取り出すとともに、取り出し元であるソート済みキー記憶領域を識別する処理元識別子を付加してマージ用のカップルドノードツリーを生成し、カップルドノードツリーの最小値あるいは最大値検索によるキーのマージ済みキー記憶領域への書き出しと削除処理、及び、ソート済みキー記憶領域からキーを取り出しての挿入処理を繰り返し実行することにより、マージソートを実現する。
本発明によれば、マージ用キー列をカップルドノードツリーの構造を持つものとすることにより、マージ用キー列での最小値あるいは最大値検索処理、キーの削除と挿入処理を高速化することができるので、高速なマージソート手法を実現することができる。
まず、図2A及び図2Bを参照して、第1の実施形態に係るカップルドノードツリーを配列に格納する例について説明する。ブランチノードが保持するリンク先の位置を示すデータとして、記憶装置のアドレス情報とすることもできるが、ブランチノードあるいはリーフノードのうち占有する領域の記憶容量の大きい方を格納可能な配列要素からなる配列を用いることにより、ノードの位置を配列番号で表すことができ、位置情報の情報量を削減することができる。
図2Aは、本実施形態に係る、配列に格納されたカップルドノードツリーの構成例を説明する図である。
図2Aを参照すると、ノード101が配列100の配列番号10の配列要素に配置されている。ノード101はノード種別102、弁別ビット位置103及び代表ノード番号104で構成されている。ノード種別102は0であり、ノード101がブランチノードであることを示している。弁別ビット位置103には1が格納されている。代表ノード番号104にはリンク先のノード対の代表ノードの配列番号20が格納されている。なお、以下では表記の簡略化のため、代表ノード番号に格納された配列番号を代表ノード番号ということもある。また、代表ノード番号に格納された配列番号をそのノードに付した符号あるいはノード対に付した符号で表すこともある。
配列番号20の配列要素には、ノード対111の代表ノードであるノード[0]112が格納されている。そして隣接する次の配列要素(配列番号20+1)に代表ノードと対になるノード[1]113が格納されている。ノード[0]112のノード種別114には0が、弁別ビット位置115には3が、代表ノード番号116には30が格納されている。またノード[1]113のノード種別117には1が格納されており、ノード[1]113がリーフノードであることを示している。インデックスキー118には、“0001”が格納されている。パトリシアツリーについて先に述べたと同様に、リーフノードにインデックスキーと対応するレコードにアクセスする情報を含まれることは当然であるが、表記は省略している。
ノード[1]113には、さらに処理元識別子119の領域があり、図の例では“A”が格納されている。処理元識別子119の領域を設けたところが、先の出願である特願2006−187827において提案したカップルドノードツリーのリーフノードと異なる点である。本実施形態においては、リーフノードに処理元識別子119の領域を設け、そのリーフノードにインデックスキーとして格納されているビット列が、どのソート済みキーの記憶領域から取り出され、カップルドノードツリーに挿入されたかを識別するのに用いられる。
なお、代表ノードをノード[0]で表し、それと対になるノードをノード[1]で表すことがある。また、ある配列番号の配列要素に格納されたノードを、その配列番号のノードということがあり、ノードの格納された配列要素の配列番号を、ノードの配列番号ということもある。
配列番号30及び31の配列要素に格納されたノード122とノード123からなるノード対121の内容は省略されている。
ノード[0]112、ノード[1]113、ノード122、及びノード123の格納された配列要素にそれぞれ付された0あるいは1は、検索キーで検索を行う場合にノード対のどちらのノードにリンクするかを示すものである。前段のブランチノードの弁別ビット位置にある検索キーのビット値である0か1を代表ノード番号に加えた配列番号のノードにリンクする。
したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置のビット値を加えることにより、リンク先のノードが格納された配列要素の配列番号を求めることができる。
なお、上記の例では代表ノード番号をノード対の配置された配列番号のうち小さい方を採用しているが、大きいほうを採用することも可能であることは明らかである。
図2Bは、本実施形態に係るカップルドノードツリーのツリー構造を概念的に示す図である。図示の6ビットのインデックスキーは、図1Bに例示されたパトリシアツリーのものと同じである。
符号210aで示すのがルートノードである。図示の例では、ルートノード210aは配列番号220に配置されたノード対201aの代表ノードとしている。
ツリー構造としては、ルートノード210aの下にノート対201bが、その下層にノード対201cとノード対201fが配置され、ノード対201fの下層にはノード対201hとノード対201gが配置されている。ノード対201cの下にはノード対201dが、さらにその下にはノード対201eが配置されている。
各ノードの前に付された0あるいは1の符号は、図2Aにおいて説明した配列要素の前に付された符号と同じである。検索キーの弁別ビット位置のビット値に応じてツリーをたどり、検索対象のリーフノードを見つけることになる。
図示された例では、ルートノード210aのノード種別260aは0でブランチノードであることを示し、弁別ビット位置230aは0を示している。代表ノード番号は220aであり、それはノード対201bの代表ノード210bの格納された配列要素の配列番号である。
ノード対201bはノード210bと211bで構成され、それらのノード種別260b、261bはともに0であり、ブランチノードであることを示している。ノード210bの弁別ビット位置230bには1が格納され、リンク先の代表ノード番号にはノード対201cの代表ノード210cの格納された配列要素の配列番号220bが格納されている。
ノード210cのノード種別260cには1が格納されているので、このノードはリーフノードであり、したがって、インデックスキーと処理元識別子を含んでいる。インデックスキー250cには“000111”が格納され、処理元識別子270cには“a”が格納されている。一方ノード211cのノード種別261cは0、弁別ビット位置231cは2であり、代表ノード番号にはノード対201dの代表ノード210dの格納された配列要素の配列番号221cが格納されている。
ノード210dのノード種別260dは0、弁別ビット位置230dは5であり、代表ノード番号にはノード対201eの代表ノード210eの格納された配列要素の配列番号220dが格納されている。ノード210dと対になるノード211dのノード種別261dは1であり、インデックスキー251dには“011010”が格納され、処理元識別子271dには“d”が格納されている。
ノード対201eのノード210e、211eのノード種別260e、261eはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250e、251eにはインデックスキーとして“010010”と“010011”が格納されている。また、それぞれの処理元識別子270e、271eには“c”、“b”が格納されている。
ノード対201bのもう一方のノードであるノード211bの弁別ビット位置231bには2が格納され、リンク先の代表ノード番号にはノード対201fの代表ノード210fの格納された配列要素の配列番号221bが格納されている。
ノード対201fのノード210f、211fのノード種別260f、261fはともに0であり双方ともブランチノードである。それぞれの弁別ビット位置230f、231fには5、3が格納されている。ノード210fの代表ノード番号にはノード対201gの代表ノード210gの格納された配列要素の配列番号220fが格納され、ノード211fの代表ノード番号にはノード対201hの代表ノードであるノード[0]210hの格納された配列要素の配列番号221fが格納されている。
ノード対201gのノード210g、211gのノード種別260g、261gはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250g、251gには“100010”と“100011”が格納されている。また、それぞれの処理元識別子270g、271gには“e”、“f”が格納されている。
また同じくノード対201hの代表ノードであるノード[0]210hとそれと対をなすノード[1]211hのノード種別260h、261hはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250h、251hには“101011”と“101100“が格納されている。また、それぞれの処理元識別子270h、271hには“g”、“h”が格納されている。
以下、上述のツリーからインデックスキー“100010”を検索する処理の流れを簡単に説明する。弁別ビット位置は、左から0、1、2、・・・とする。
まず、ビット列“100010”を検索キーとしてルートノード210aから処理をスタートする。ルートノード210aの弁別ビット位置230aは0であるので、検索キー“100010”の弁別ビット位置が0のビット値をみると1である。そこで代表ノード番号の格納された配列番号220aに1を加えた配列番号の配列要素に格納されたノード211bにリンクする。ノード211bの弁別ビット位置231bには2が格納されているので、検索キー“100010”の弁別ビット位置が2のビット値をみると0であるから、代表ノード番号の格納された配列番号221bの配列要素に格納されたノード210fにリンクする。
ノード210fの弁別ビット位置230fには5が格納されているので、検索キー“100010”の弁別ビット位置が5のビット値をみると0であるから、代表ノード番号の格納された配列番号220fの配列要素に格納されたノード210gにリンクする。
ノード210gのノード種別260gは1でありリーフノードであることを示しているので、インデックスキー250gを読み出して検索キーと比較すると両方とも“100010”であって一致している。このようにしてカップルドノードツリーを用いた検索が行われる。
次に、図2Bを参照してカップルドノードツリーの構成の意味について説明する。
カップルドノードツリーの構成はインデックスキーの集合により規定される。図2Bの例で、ルートノード210aの弁別ビット位置が0であるのは、図2Bに例示されたインデックスキーに0ビット目が0のものと1のものがあるからである。0ビット目が0のインデックスキーのグループはノード210bの下に分類され、0ビット目が1のインデックスキーのグループはノード211bの下に分類されている。
ノード211bの弁別ビット位置が2であるのは、ノード211h、210h、211g、210gに格納された0ビット目が1のインデックスキーの1ビット目がすべて0で等しく、2ビット目で初めて異なるものがあるという、インデックスキーの集合の性質を反映している。
以下0ビット目の場合と同様に、2ビット目が1であるものはノード211f側に分類され、2ビット目が0であるものはノード210f側に分類される。
そして2ビット目が1であるインデックスキーは3ビット目の異なるものがあるのでノード211fの弁別ビット位置には3が格納され、2ビット目が0であるインデックスキーでは3ビット目も4ビット目も等しく5ビット目で異なるのでノード210fの弁別ビット位置には5が格納される。
ノード211fのリンク先においては、3ビット目が1のものと0のものがそれぞれ1つしかないことから、ノード210h、211hはリーフノードとなり、それぞれインデックスキー250hと251hに“101011”と“101100”が格納されている。
仮にインデックスキーの集合に“101100”の代わりに“101101”か“101110”が含まれていたとしても、3ビット目までは“101100”と等しいので、ノード211hに格納されるインデックスキーが変わるだけで、ツリー構造自体は変わることはない。しかし、“101100”に加えて“101101”が含まれていると、ノード211hはブランチノードとなり、その弁別ビット位置は5になる。追加されるインデックスキーが“101110”であれば、弁別ビット位置は4となる。
以上説明したように、カップルドノードツリーの構造は、インデックスキーの集合に含まれる各インデックスキーの各ビット位置のビット値により決定される。
そしてさらにいえば、異なるビット値となるビット位置ごとにビット値が“1”のノードとビット値が“0”のノードとに分岐していることから、ノード[1]側とツリーの深さ方向を優先させてリーフノードをたどると、それらに格納されたインデックスキーは、ノード211hのインデックスキー251hの“101100”、ノード210hのインデックスキー250hの“101011”、・・・、ノード210cのインデックスキー250cの“000111”となり降順にソートされている。
すなわち、カップルドノードツリーにおいては、インデックスキーはソートされてツリー上に配置されている。
検索キーで検索するときはインデックスキーがカップルドノードツリー上に配置されたルートをたどることになり、例えば検索キーが“101100”であればノード211hに到達することができる。また、上記説明からも想像がつくように、“101101”か“101110”を検索キーとした場合でもノード211hにたどり着き、インデックスキー251hと比較することにより同一のインデックスキーを求める検索が失敗したことが分かる。
また、例えば“100100”で検索した場合でも、ノード210a、211b、210fのリンク経路では検索キーの3ビット目と4ビット目は使われることがなく、“100100”の5ビット目が0なので、“100010”で検索した場合と同様にノード210gに到達することになる。このように、カップルドノードツリーに格納されたインデックスキーのビット構成に応じた弁別ビット位置を用いて分岐が行われる。
3は、本実施形態のためのハードウェア構成例を説明する図である。
本実施形態によるマージソートは中央処理装置302及びキャッシュメモリ303を少なくとも備えたデータ処理装置301によりデータ格納装置308を用いて実施される。カップルドノードツリーが配置されるマージ配列309、マージソートの前段の処理でソートされたキーを格納する複数のソート済みキー配列312、マージ済みであって全体としてソート済みのキーを格納するマージ済みキー配列313と検索中にたどるノードが格納された配列要素の配列番号を記憶する探索経路スタック310を有するデータ格納装置308は、主記憶装置305または外部記憶装置306で実現することができ、あるいは通信装置307を介して接続された遠方に配置された装置を用いることも可能である。
3の例示では、主記憶装置305、外部記憶装置306及び通信装置307が一本のバス304によりデータ処理装置301に接続されているが、接続方法はこれに限るものではない。また、主記憶装置305をデータ処理装置301内のものとすることもできるし、探索経路スタック310を中央処理装置302内のハードウェアとして実現することも可能である。あるいは、ソート済みキー配列312とマージ済みキー配列313は外部記憶装置306に、探索経路スタック310を主記憶装置305に持つなど、使用可能なハードウェア環境、インデックスキー集合の大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
また、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた主記憶装置305の一時記憶領域が用いられることは当然である。
図4は、本実施態様に係るカップルドノードツリーを用いたビット列検索の基本動作を示すフローチャートである。本出願人による出願である上記特願2006−293619で提案されたフローチャートに対して、リーフノードに格納された処理元識別子を取り出すステップが追加されている。
まず、ステップS401で、検索開始ノードの配列番号を取得する。取得された配列番号に対応する配列は、カップルドノードツリーを構成する任意のノードを格納したものである。検索開始ノードの指定は、後に説明する各種応用検索において行われる。
取得された検索開始ノードの配列番号は、図示しない検索開始ノード設定エリアに設定されるが、この検索開始ノード設定エリアは、先に述べた「処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶装置」の一つである。以下の説明では、「図示しない検索開始ノード設定エリアに設定する」のような表現に変えて、「検索開始ノードの配列番号を得る」、「検索開始ノードとして設定する」あるいは単に「検索開始ノードに設定する」のように記述することもある。
次に、ステップS402で、探索経路スタック310に取得された配列番号を格納し、ステップS403で、その配列番号に対応する配列要素を参照すべきノードとして読み出す。そして、ステップS404で、読み出したノードから、ノード種別を取り出し、ステップS405で、ノード種別がブランチノードであるか否かを判定する。
ステップS405の判定において、読み出したノードがブランチノードである場合は、ステップS406に進み、ノードから弁別ビット位置についての情報を取り出し、更に、ステップS407で、取り出した弁別ビット位置に対応するビット値を検索キーから取り出す。そして、ステップS408で、ノードから代表ノード番号を取り出して、ステップS409で、検索キーから取り出したビット値と代表ノード番号とを加算し、新たな配列番号として、ステップS402に戻る。
以降、ステップS405の判定においてリーフノードと判定されてステップS410aに進むまで、ステップS402からステップS409までの処理を繰り返す。ステップS410aで、リーフノードからインデックスキーを取り出し、ステップS410bで、リーフノードから処理元識別子を取り出して処理を終了する。
先に述べたように、ステップS410aで検索キーと一致するインデックスキーが取り出されるとは限らないが、それは検索キーと一致するインデックスキーがカップルドノードツリーに含まれていなかったからである。その場合でも、ステップS410aで取り出されたインデックスキーは、後に説明する各種処理において活用される。
図5Aは、本実施態様に係るカップルドノードツリーに格納されたインデックスキーの最小値を求める処理を示したフローチャートである。本出願人による出願である上記特願2006−293619で提案されたカップルドノードツリー(部分木を含む)の最小値を求める処理を示したフローチャートに対して、リーフノードに格納された処理元識別子を取り出すステップが追加されている。
これから説明するインデックスキーの最小値を求める処理は、先に述べたようなインデックスキーのツリー上の配置から、検索開始ノードからノード[0]をリーフノードに至るまでツリー上でたどることに相当する。
まず、ステップS501の検索開始ノードの配列番号の取得からステップS505のノード種別の判定までは、それぞれ上述の図4のステップS401からステップS405の処理と同様である。
ステップS505のノード種別の判定においてノード種別がブランチノードと判定されると、ステップS506に進み、ノードから配列の代表ノード番号を取り出し、ステップS507で、取り出した代表ノード番号に値「0」を加算してその結果を新たな配列番号とし、ステップS502に戻る。以降、ステップS505においてそのノードがリーフノードと判定されるまでステップS502からステップS507までの処理を繰り返し、ステップS508aで、リーフノードからインデックスキーを取り出し、ステップS508bで、リーフノードから処理元識別子を取り出して処理を終了する。
上記の図5Aに示す処理においては、ノード[0]をたどるため、代表ノード番号に一律「0」を加算している。すなわち、図5Aの処理によれば、リンク先のノードは、ノード対のうち必ずノード[0]とし、より小さい値のインデックスキーが格納されているノードのほうに分岐している。これにより、ツリー構造が先に述べたように順列構成であるカップルドノードツリーの最小のインデックスキーを取り出すことができる。
図5Bは、本実施態様に係るカップルドノードツリーに格納されたインデックスキーの最大値を求める処理を示したフローチャートである。本出願人による出願である上記特願2006−293619で提案されたカップルドノードツリー(部分木を含む)の最大値を求める処理を示したフローチャートに対して、リーフノードに格納された処理元識別子を取り出すステップが追加されている。
インデックスキーの最大値を求める処理は、ツリー上のノードのうちノード[1]について、リーフノードに至るまで順次たどっていくことに相当する。以下、任意の部分木の最大のインデックスキーを求める処理について、上記最小のインデックスキーを求める処理と比較しながら、異なる点を中心に説明する。
図5Bに示す一連の処理のうち、ステップS511からステップS516及びステップS518aとステップS518bについては、図5Aのステップ501からステップS506及びステップS508aとステップS508bにそれぞれ対応しており、同様の処理が実行される。図5Aの最小値を求める処理と異なる点は、ステップS517において、代表ノード番号に、値「1」を加算する点である。これにより、代表ノード番号が表すノード対のうち、ノード[1]に常にリンクすることとなり、リーフノードに至るまで順次ステップS512からステップS517の処理を繰り返すことにより、インデックスキーの最大値を得ることができる。
図4、図5A及び図5Bに示すように、インデックスキーを検索する基本動作やインデックスキーの最小値/最大値の検索処理を実行する際には、探索経路スタック310に参照した配列の配列番号が順次格納されていく。
なお、上述の図5A及び図5Bを参照したインデックスキーの最小値/最大値の検索処理では、カップルドノードツリーは配列に記憶されたものとして説明したが、カップルドノードツリーが配列に記憶されることは必須ではなく、ノード対を構成する2つのノードのうちの代表ノードのみあるいは代表ノードと隣接した記憶領域に配置されたノードのみをリンクしてリーフノードに至ることによりインデックスキーの最小値/最大値の検索が可能であることは明らかである。
次に、図6A〜図6C、図7により本実施態様に係るカップルドノードツリーにおけるノード挿入処理を説明する。図6A〜図6Cが通常の挿入処理を説明するものであり、図7はルートノードの挿入処理を説明するものである。ルートノードの挿入処理と通常の挿入処理により、カップルドノードツリーが生成されることから、ノード挿入処理の説明はカップルドノードツリーの生成処理の説明でもある。
本出願人による出願である上記特願2006−187827で提案されたカップルドノードツリーにおけるノード挿入処理と比べると、挿入キーをインデックスキーとするリーフノードに挿入キーを取り出したソート済みキー配列を識別する処理元識別子を格納する点で異なる。
図6Aは挿入処理の前段である検索処理の処理フローを示す図であり、図4に示した検索処理において、ルートノードを検索開始ノードとし、挿入キーを検索キーとしたものに相当する。
ステップS601において、検索開始ノードの配列番号を設定するエリアにルートノードの配列番号を設定し、ステップS602において、検索キーに挿入キーを設定する。
次にステップS610において、図4に示す検索処理を実行し検索結果のインデックスキーを得て、ステップS611に進む。
ステップS611において挿入キーとステップS610で得られたインデックスキーを比較し、等しければ挿入キーは既にカップルドノードツリーに存在するのであるから、挿入は失敗となり、処理を終了する。等しくなければ次の処理、図6BのステップS612以下の処理に進む。
図6Bは、挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。
ステップS612において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。
ステップS613に進み、挿入キーとステップS610で得たインデックスキーの大小を比較し、挿入キーが大きいときは値1を小さいときは値0のブール値を得る。
ステップS614に進み、ステップS612で得た代表ノードの配列番号にステップS613で得たブール値を加算した配列番号を得る。
ステップS615に進み、ステップS612で得た代表ノードの配列番号にステップS613で得たブール値の論理否定値を加算した配列番号を得る。
ステップS614で得た配列番号は、挿入キーをインデックスキーとして持つリーフノードが格納される配列要素の配列番号であり、ステップS615で得た配列番号は、そのリーフノードと対を成すリーフノードまたはブランチノードが格納される配列要素のものである。
つまり、前段の検索処理で得られたリーフノードに格納されたインデックスキーと挿入キーの大小により、挿入されるノード対のうちどちらのノードに挿入キーを保持するリーフノードが格納されるかが決定される。
例えば図2Bのカップルドノードツリーに“011011”を挿入する場合、検索結果のインデックスキーはノード211dに格納された“011010”になる。挿入キー“011011”とノード211dに格納されたインデックスキー“011010”の大小比較によりブール値が求められ、今の例では挿入キーが大きいのでブール値1が得られ、挿入されるノード対の代表ノード番号に1を加えた配列要素に挿入キーを保持するリーフノードが格納される。一方、インデックスキー“011010”は、大小比較で得られたブール値を論理反転した値を代表ノード番号に加算した配列番号の配列要素に格納される。
その際、インデックスキー“011010”と挿入キー“011011”とは5ビット目で異なることから、ノード211dは、弁別ビット位置を5とし、代表ノード番号を挿入されたノード対の代表ノードの配列番号とするブランチノードとなる。
また図2Bのカップルドノードツリーに“011001”を挿入しようとする場合も、検索結果のインデックスキーはノード211dに格納された“011010”になる。この場合には挿入キーが小さいのでブール値0が得られ、挿入されるノード対の代表ノード番号に0を加えた配列要素に挿入キーを保持するリーフノードが格納される。そして、インデックスキー“011010”と挿入キー“011001”とは4ビット目で異なることから、ノード211dは、弁別ビット位置を4とし、代表ノード番号を挿入されたノード対の代表ノードの配列番号とするブランチノードとなる。次に図6CのステップS616以下の処理に進む。
図6Cは図6Bで準備された配列にノードを格納するとともにその挿入位置を求め、既存のノードの内容を変更して挿入処理を完成させる処理フローを示す図である。
ステップS616〜ステップS623までの処理は、挿入するノード対のカップルドノードツリー上の位置を求める処理であり、ステップS624以下の処理は各ノードにデータを設定して挿入処理を完成させる処理である。
ステップS616で、挿入キーとステップS610で得たインデックスキーのビット列比較を例えば排他的論理和で行い、差分ビット列を得る。
ステップS617に進み、ステップS616で得た差分ビット列から、上位0ビット目から見た最初の不一致ビットのビット位置を得る。この処理は、例えばプライオリティエンコーダを有するCPUではそこに差分ビット列を入力し、不一致のビット位置を得ることができる。また、ソフト的にプライオリティエンコーダと同等の処理を行い最初の不一致ビットのビット位置を得ることも可能である。
次にステップS618に進み、探索経路スタックのスタックポインタがルートノードの配列番号を指しているか判定する。指していればステップS624に移行し、指していなければステップS619に進む。
ステップS619において、探索経路スタックのスタックポインタを1つ戻してそこにスタックされている配列番号を取り出す。
ステップS620に進み、ステップS619で取り出した配列番号の配列要素を配列からノードとして読み出す。
ステップS621に進み、ステップS620で読み出したノードから、弁別ビット位置を取り出す。
次にステップS622に進み、ステップS621で取り出した弁別ビット位置がステップS617で得たビット位置より上位の位置関係か判定する。ここで上位の位置関係とは、ビット列のより左側の位置、すなわちビット位置の値が小さい位置であることとする。
ステップS622の判定結果が否定であれば、ステップS618に戻り、ステップS618での判定が肯定になるかステップS622での判定が肯定になるまで繰り返す。ステップS622での判定が肯定になると、ステップS623で経路探索スタックのスタックポインタを1つ進め、ステップS624以下の処理に移行する。
上記ステップS616〜ステップS623で説明した処理は、挿入するノード対の挿入位置を決定するために、挿入するインデックスキーと検索により取得されたインデックスキーの間でビット列比較を行い、ビット列比較で異なるビット値となる先頭の(最上位の)ビット位置と探索経路スタックに格納されているブランチノードの弁別ビット位置との相対的位置関係を調べ、弁別ビット位置が上位となるブランチノードの次のブランチノードのリンク先を挿入するノード対の挿入位置とするものである。
例えば図2Bのカップルドノードツリーに“111000”を挿入するとき、検索結果のインデックスキーはノード210hに格納された“101011”になる。挿入キー“111000”とノード210hに格納されたインデックスキー“101011”のビット列比較により異なるビット値となる最上位のビット位置1が得られる。得られたビット位置1と経路探索スタックに積まれた配列番号の配列要素に格納されたブランチノードの弁別ビット位置との位置関係を弁別ビット位置が上位になるまでを順次経路探索スタック逆にたどると、ルートノード210aに至る。そこで探索経路スタックのポインタを1つ進め、ノード211bの配列番号を得る。挿入キー“111000”はノード211bのリンク先に挿入される。
また、経路探索スタック逆にたどりルートノードに至っても、ルートノードの弁別ビット位置が、先に求めたビット列比較で異なるビット値となる最上位のビット位置より上位のビット位置でないということは、そのカップルドノードツリーのインデックスキーの上位ビットで、ルートノードの弁別ビット位置より上位のビットの値は全て等しい場合である。そして、挿入するインデックスキーにおいて、初めてルートノードの弁別ビット位置より上位のビットの値に異なるビット値のものがあるということである。したがって、挿入するノード対はルートノードの直接のリンク先となり、ルートノードの弁別ビット位置は、既存のインデックスキーと異なる値である挿入キーの最上位ビットの位置に変わる。
次に、ステップS624以下の各ノードにデータを設定して挿入処理を完成させる処理について説明する。
ステップS624では探索経路スタックからスタックポインタの指す配列番号を取り出す。
ステップS625aにおいて、ステップS614で得た配列番号の指す配列要素のノード種別に1(リーフノード)を、インデックスキーに挿入キーを書き込む。また、挿入キーを取り出したソート済みキー配列を識別する処理元識別子を格納する。
ステップS626に進み、配列からステップS624で得た配列番号の配列要素を読み出す。
次にステップS627において、ステップS615で得た配列番号の配列要素にステップS626で読み出した内容を書き込む。
最後にステップS628において、ステップS624で得た配列番号の指す配列要素のノード種別に0(ブランチノード)を、弁別ビット位置にステップS617で得たビット位置を、代表ノード番号にステップS612で得た配列番号を書き込み、処理を終了する。
上述の図2Bのカップルドノードツリーに“111000”を挿入する例では、取得された空ノード対のノード[0]にノード211bの内容を書き込み(ステップS627)、ノード[1]を挿入キー“111000”を保持するリーフノードとする(ステップS625)。そして、ノード211bの弁別ビット位置にビット列比較により異なるビット値となる最上位のビット位置1を格納し、代表ノード番号には取得されたノード対の代表ノードが格納される配列要素の配列番号が格納される(ステップS628)。
図7は、本実施態様に係るカップルドノードツリーを新規に生成し登録する処理、すなわちルートノードの挿入処理を説明する図である。
まず、ステップS702において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。次にステップS703において、ステップS702で得た配列番号に0を加えた配列番号を求める。(実際には、ステップS702で取得した配列番号に等しい。)。
さらにステップS704aにおいて、ステップS703で得た配列番号の配列要素に、挿入するルートノードのノード種別に1(リーフノード)とインデックスキーに挿入キー、処理元識別子に挿入キーを取り出したソート済み配列の識別子を書き込み、ステップS705で、ステップS702で取得したルートノードの配列番号を登録して処理を終了する。
先にも述べたように、インデックスキーの集合があるとき、そこから順次インデックスキーを取り出し、図7及び図6A〜図6Cの処理を繰り返すことにより、インデックスキーの集合に対応した本発明のカップルドノードツリーを構築することができることは明らかである。
次に図8A、図8Bを参照して、本実施態様に係るカップルドノードツリーのインデックスキーのうち、特定のインデックスキーを削除する処理フローを説明する。
図8Aは、削除処理の前段である検索処理の処理フローを示す図であり、図4に示した検索処理において、検索開始ノードをルートノードとし、削除キーを検索キーとしたものに相当する。
ステップS801において、検索開始ノードの配列番号を設定するエリアにルートノードの配列番号を設定し、ステップS802において、検索キーに削除キーを設定する。
次にステップS810において、図4に示す検索処理を実行し検索結果のインデックスキーを得て、ステップS811に進む。
ステップS811において削除キーとインデックスキーを比較し、等しくなければければ削除するインデックスキーはカップルドノードツリーに存在しないのであるから、削除は失敗となり、処理を終了する。等しければ次の処理、図8BのステップS812以下の処理に進む。
図8Bは、削除処理の後段の処理フローを説明する図である。
まず、ステップS812で探索経路スタックに2つ以上の配列番号が格納されているか判定する。2つ以上の配列番号が格納されていないということは、言い換えれば1つだけで、その配列番号はルートノードの格納された配列要素のものである。その場合はステップS818に移行し、ステップS801で設定したルートノードの配列番号に係るノード対を削除する。次にステップS819に進み、登録されていたルートノードの配列番号を削除して処理を終了する。
ステップS812において探索経路スタックに2つ以上の配列番号が格納されていると判定されたときはステップS813に進み、ステップS810で実行した検索処理のステップS408で得た代表ノード番号にステップS407で得たビット値を反転した値を加算した配列番号を得る。この処理は、削除対象のインデックスキーが格納されたリーフノードと対をなすノードの配置された配列番号を求めるものである。
次にステップS814において、ステップS813で得た配列番号の配列要素の内容を読み出し、ステップS815において探索経路スタックのスタックポインタを1つ戻して配列番号を取り出す。
次にステップS816に進み、ステップS814で読み出した配列要素の内容をステップS815で得た配列番号の配列要素に上書きする。この処理は、削除対象のインデックスキーが格納されたリーフノードへのリンク元であるブランチノードを上記リーフノードと対をなすノードに置き換えるものである。
最後にステップS817においてステップS810で実行した検索処理のステップS408で得た代表ノード番号に係るノード対を削除して処理を終了する。
以上、本実施形態のソートマージで用いるカップルドノードツリーに関する技術を説明した。
次に、図9〜図11Fを参照して第1の実施形態に係るカップルドノードツリーを用いた本発明の実施例1を説明する。
図9は本実施例の概要を説明する図である。図9の(1)はマージ処理の前段を図9の(2)は後段を説明する図である。
図9の(1)に示す例では、ソート済みキー配列312aのキー配列番号0の配列要素に値が“010010”であるキー480a、キー配列番号1の配列要素に値が“100011”であるキー481a、キー配列番号2の配列要素に値が“010010” であるキー482aが格納されている。また、ソート済みキー配列312bのキー配列番号0の配列要素に値が“000111” であるキー480b、キー配列番号1の配列要素に値が“011010” であるキー481bが、ソート済みキー配列312cのキー配列番号0の配列要素に値が“010011” であるキー480c、キー配列番号1の配列要素に値が“100010” であるキー481cが格納されている。なお、図中の符号(A)〜(H)は、マージ処理の各ステップを示すものである。
図9の(1)に示すステップ(A)〜(D)の処理に対して、図9の(2)に示すステップ(E)〜(H)の処理はマージ処理の後段の処理を示している。
最初のステップ(A)において、ソート済みキー配列312a、312b、312cからそれぞれの最小値480a、480b、480cが取り出され、マージ配列309aに格納される。
次のステップ(B)において、マージ配列309aに格納された最小値であるキー480bがマージ済みキー配列313のキー配列番号0の配列要素に格納され、キー480bはマージ配列309aから削除される。そして、キー480bを取り出した処理元のソート済みキー配列312bからキー480bを取り出した後の最小値であるキー481bを取り出してマージ配列309aに挿入してマージ配列309bを得る。
次のステップ(C)において、マージ配列309bに格納された最小値であるキー480aがマージ済みキー配列313のキー配列番号1の配列要素に格納され、キー480aはマージ配列309bから削除される。次に、キー480aを取り出した処理元のソート済みキー配列312aからキー480aを取り出した後の最小値であるキー481aを取り出してマージ配列309bに挿入してマージ配列309cを得る。
次のステップ(D)において、マージ配列309cに格納された最小値であるキー480cがマージ済みキー配列313のキー配列番号2の配列要素に格納され、キー480cはマージ配列309cから削除される。キー480cを取り出した処理元のソート済みキー配列312cからキー480cを取り出した後の最小値であるキー481cを取り出してマージ配列309cに挿入してマージ配列309dを得る。
この段階では、図9の(1)に示すように、マージ済みキー配列313には、キー配列番号0〜2の配列要素に、それぞれキー480b“000111”、キー480a“001010”及びキー480c“010011”が格納されている。そして、ソート済みキー配列312bとソート済みキー配列312cのキーは全て取り出し済みであり、ソート済みキー配列312aにだけ、未取り出しのキーが残っている。
図9の(2)に示すのは、処理元のソート済みキー配列から全てのキーが取り出し済みとなった以降の処理例である。
ステップ(E)では、マージ配列309dに格納された最小値であるキー481bがマージ済みキー配列313のキー配列番号3の配列要素に格納され、キー481bはマージ配列309dから削除され、マージ配列309eを得る。
次にステップ(F)で、マージ配列309eに格納された最小値であるキー481cがマージ済みキー配列313のキー配列番号4の配列要素に格納され、キー481cはマージ配列309eから削除され、マージ配列309fを得る。
次のステップ(G)において、マージ配列309fに格納された最小値であるキー481aがマージ済みキー配列313のキー配列番号5の配列要素に格納され、キー481aはマージ配列309fから削除され、マージ配列は空になる。
次のステップ(H)において、未取り出しのキーが残っているソート済みキー配列312aからキー482aを取り出してマージ済みキー配列313のキー配列番号6の配列要素に格納してマージソートが完了する。
上述の説明におけるマージ配列309a〜309fは、本実施形態に係るカップルドノードツリーのデータ構造を有するものである。カップルドノードツリーを用いた処理について、次に詳細に説明する。なお、以下において、カップルドノードツリーをマージ配列ということもある。また、単にツリーという場合もある。
なお、マージ配列309a〜309fは、ステップを説明する便宜上、異なる符号を付与しているが、1つのマージ配列であることは当然である。また、後に説明するマージ配列においても同様である。
図10A及び図10Bは、本実施例におけるカップルドノードツリーを用いたマージソート処理フローを説明する図である。
図10Aは、例えば図9に示すマージ配列309aをカップルドノードツリーの構造を持つものとして生成し、検索開始ノードの配列番号を設定するエリアに、生成したカップルドノードツリーのルートノードの配列番号を設定するまでの初期処理を説明するものであり、図10Bは、それ以降の最小値を検索してマージを実行する処理を説明する図である。
図9及び図11A〜図11Fを適宜参照しながら、図10A及び図10Bにより本実施例における処理フローを説明する。
図10Aに示すように、ステップS1001においてソート済みキー配列を設定する。その際、ソート済みキー配列には識別子が与えられるものとする。図9に示す例では、ソート済みキー配列312a、312b及び312cが設定されている。各ソート済みキー配列を設定するためのソート手法は、任意のものでよく、何ら制限はない。
次にステップS1002において、すべてのソート済みキー配列の最小値をカップルドノードツリーに挿入済みか判定する。挿入済みであれば、ステップS1010において、検索開始ノードの配列番号を設定するエリアにルートノードの配列番号を設定して初期処理を完了し、図10Bに示すステップS1011以降の処理に進む。
挿入済みでなければステップS1003に進み、ソート済みキー配列を、配列の識別子により順次指定し、ステップS1004において指定したソート済みキー配列から、キーの最小値を取り出す。
次にステップS1005において、ステップS1004で取り出した最小値を挿入キーに設定し、ステップS1006で処理元識別子にステップS1003で指定したソート済みキー配列の識別子を設定する。
図11A(1)の例示では、ソート済みキー配列312aが指定され、矢印で表すポインタの指す最小値であるキー480aが取り出されて挿入キーに設定され、識別子“a”が処理元識別子に設定される。
次にステップS1007に進み、ルートノードは登録済みか判定する。登録済みでなければステップS1008に進み、挿入キーを含むリーフノードをルートノードとする図7に示すルートノードを挿入する処理を実行してステップS1002に戻る。
登録済みであれば、ステップS1009に進み、図6A〜図6Cに示す挿入処理を実行し、挿入キーにより、配列にノードを挿入してステップS1002に戻る。
図11A(1)の例示では、空のノード対401aの代表ノード番号420が得られ、ノード[0]にルートノード410aが格納されている。ルートノード410aのノード種別460aにはリーフノードであることを示す“1”、処理元識別子471aにはソート済みキー配列312aの識別子“a”、インデックスキー450aにはソート済みキー配列312aの最小値“001010”が格納されている。
また、図11A(2)の例示では、ソート済みキー配列312bが指定され、矢印で表すポインタの指す最小値であるキー480bが取り出されて挿入キーに設定され、識別子“b”が処理元識別子に設定される。そして、図11A(1)に示すカップルドノードツリーにキー480bの値“000111”をインデックスキーとして含むリーフノード410bが挿入されている。
図11A(2)に示すカップルドノードツリーのルートノード410aはノード種別460aが“0”、弁別ビット位置430aが“2”、代表ノード番号が420aのブランチノードであり、代表ノード番号420aが指すノード対401bが挿入されている。ノード位置がノード[0]のノード410bのノード種別460bには“1”、処理元識別子470bには“b”、インデックスキー450bには“000111”が格納され、ノード位置がノード[1]のノード411bには、図11A(1)に示すカップルドノードツリーのルートノード410aの内容がコピーされている。
図11A(3)の例示では、ソート済みキー配列312cが指定され、矢印で表すポインタの指す最小値であるキー480cが取り出されて挿入キーに設定され、識別子“c”が処理元識別子に設定される。そして、図11A(2)に示すカップルドノードツリーにキー480cの値“010011”をインデックスキーとして含むリーフノード411cが挿入されている。
図11A(3)に示すカップルドノードツリーのルートノード410aはノード種別460aが“0”、弁別ビット位置430aが“1”、代表ノード番号が420aのブランチノードであり、代表ノード番号420aが指すノード対401cが挿入されている。ノード位置がノード[0]のノード410cには、図11A(2)に示すカップルドノードツリーのルートノード410aの内容がコピーされている。ノード位置がノード[1]のノード411cのノード種別461cには“1”、処理元識別子471cには“c”、インデックスキー451cには“010011”が格納されている。ノード410cの代表ノード番号420cの指すノード対401bの内容は、図11A(2)に示すノード対401bの内容と同一である。
図11A(3)に示すカップルドノードツリーは、図9に示すソート済みキー配列に対して生成した状態であり、図9に示すマージ配列309aに相当する。
次に、図10Bを参照して、カップルドノードツリーの最小値検索と削除挿入処理を繰り返してマージソートを実行する処理を説明する。
図10Bに示すように、ステップS1011において、図5Aに示す最小値検索を実行し、最小値と処理元識別子を求め、ステップS1012において、ステップS1011で得た最小値をマージ済みキー配列に書き出す。
次にステップS1013に進み、削除キーにステップS1011で得た最小値を設定し、ステップS1014において、図8A、図8Bに示す削除処理を実行して削除キーを含むノードを削除する。
図11A(3)、(4)に示す例では、リーフノード410bに格納された最小値“000111”が求められ、矢印で表されるポインタの指すマージ済みキー配列313のキー配列番号0に書き出される。そして、ノード410bは図11A(3)に示すツリーから削除され、カップルドノードツリーは図11A(4)に示すように、ノード410bと対をなす図11A(3)に示すノード411bの内容がノード411cにコピーされたものになる。
次にステップS1015において、ステップS1011で求めた処理元識別子をソート済みキー配列の識別子としてソート済みキー配列識別子設定エリアに設定する。
次にステップS1016において、ルートノードが登録されているか判定する。この判定でルートノードが登録されていないと判定されるのは、図11E(3)、(4)に例示するように、マージ配列の最小値を含むノードがルートノードとなり、ステップS1014でマージ配列が抹消、すなわちルートノードの配列番号が削除され登録が抹消されたときである。
ステップS1016において、ルートノードが登録されていると判定されると、ステップS1017に移行し、ステップS1015でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列から、次のキーの取り出しを試みる。
図11B(1)に示す例では、矢印で表されるポインタの指すソート済みキー配列312bのキー配列番号1の配列要素に格納されたキー481bが次のキーとして取り出される。
ステップS1017に続いてステップS1018に進み、ステップS1017で次のキーを取り出せたか、すなわち全てのキーを取り出し済みであったかを判定する。
図11E(1)の例示では、次のキーを取り出すソート済みキー312bのポインタの指す配列要素にはキーが格納されていないことから、この場合、ステップS1017では次のキーを取り出すことはできないから、ステップS1018での判定は全てのキーは取り出し済みとなる。
全てのキーを取り出し済みであれば、ステップS1011に戻り、取り出し済みでなければ、ステップS1019〜ステップS1021の処理に進む。
ステップS1019では、挿入キーにステップS1017で取り出したキーを設定し、ステップS1020で、挿入処理のための処理元識別子設定エリアに、ステップS1015で設定した、すなわちステップS1011で求めた処理元識別子を設定する。そして、ステップS1021において、図6A〜図6Cに示す挿入処理を実行してステップS1011に戻る。
先に述べたように、図11B(1)に示す例では、矢印で表されるポインタの指すソート済みキー配列312bのキー配列番号1の配列要素に格納されたキー481bが次のキーとして取り出され、図11B(1)に示すカップルドノードツリーに挿入されたノード411dのインデックスキー451dに格納されている。
以上のステップS1011〜ステップS1021の処理を、ステップS1016においてルートノードは登録されていないと判定されるまで繰り返し、ルートノードは登録されていないと判定されるとステップS1022に進む。
ステップS1022では、ステップS1015でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列より、次のキーからキーの最大値まで取り出してマージ済みキー配列に順次書き出して処理を終了する。
先に述べたように、ステップS1016においてルートノードは登録されていないと判定されるのは、マージ処理が進行し、徐々に各ソート済みキー配列から全てのキーが取り出し済みとなり、マージ配列に挿入されるキーがなくなり、最後に残ったルートノードが削除されたからである。そして、ルートノードの処理元識別子の指すソート済みキー配列にのみ、まだ取り出していないキーが残っている可能性がある。
そこで、それらのキーを取り出してマージ済みキー配列に順次書き出すのがステップS1022の処理である。
ステップS1022の処理により、マージ処理が完了し、すべてのソート済みキー配列に格納されていたキー全体のマージソートが完成する。
図11A〜図11Fは、図9に例示するソート済みキー配列310a、310b、310cが与えられたときのマージ配列に対応したカップルドノードツリーの生成、挿入及び削除処理を説明する図である。一部繰り返しになるが、図11A〜図11Fを参照して、図9に示すソート済みキー配列310a、310b、310cが与えられたときのマージ処理について説明する。
最初に、図11A(1)に示すように、ソート済みキー配列312aより取り出した最小値480aをマージ配列のルートノードに登録する。図示のように、空のノード対401aの代表ノード番号420が得られ、ノード[0]にルートノード410aが格納されている。ルートノード410aのノード種別460aにはリーフノードであることを示す“1”、処理元識別子471aにはソート済みキー配列312aの識別子“a”、インデックスキー450aにはソート済みキー配列312aの最小値“001010”が格納されている。
次に、図11A(2)に示すように、矢印で表すポインタが指しているソート済みキー配列312bの最小値であるキー480bを取り出し、キー480bの値“000111”をインデックスキーとして含むリーフノード410bを図11A(1)に示すツリーに挿入して図11A(2)に示すツリーを得る。
次に、図11A(3)に示すように、矢印で表すポインタが指しているソート済みキー配列312cの最小値であるキー480cを取り出し、キー480cの値“000111”をインデックスキーとして含むリーフノード410cを図11A(2)に示すツリーに挿入して図11A(3)に示すツリーを得る。
以上により全てのソート済みキー配列の最小値がマージ配列に挿入済みであるので、次に、図11A(4)に示すように、マージ配列の最小値“000111”をマージ済みキー配列313に書き出し、図11A(3)に示すツリーから最小値を含むリーフノード410bを削除して図11A(4)に示すツリーを得る。
図11B(1)に示すのは、マージ配列309aの最小値の処理元識別子の指すソート済みキー配列312bと、矢印であらわすポインタの指す次のキー481bをインデックスキーとして含むリーフノードが図11A(4)に示すツリーに挿入されたものが示されている。すなわち、ソート済みキー配列310から次のキーが取り出され、マージ配列に挿入される。
次に図11B(2)に示すように、マージ配列の最小値“001010”をマージ済みキー配列313に書き出し、最小値を含むリーフノード410cを削除する。
リーフノード410cの処理元識別子470cの値は“a”なので、次に図11C(1)に示すように、ソート済みキー配列312aから次のキー481aを取り出してマージ配列に挿入する。次に図11C(2)に示すように、マージ配列の最小値“010011”をマージ済みキー配列313に書き出し、最小値を含むリーフノード410dを削除する。
リーフノード410dの処理元識別子470dの値は“c”なので、次に図11D(1)に示すように、ソート済みキー配列312cから次のキー481cを取り出してマージ配列に挿入する。次に図11D(2)に示すように、マージ配列の最小値“011010”をマージ済みキー配列313に書き出し、最小値を含むリーフノード410eを削除する。
リーフノード410eの処理元識別子470eの値は“b”なので、次に図11E(1)に示すように、ソート済みキー配列312bから次のキーを取り出そうとするが、ソート済みキー配列312bから全てのキーが取り出し済みなのでマージ配列に次のキーは挿入されない。次に図11E(2)に示すように、マージ配列の最小値“100010”をマージ済みキー配列313に書き出し、最小値を含むリーフノード410fを削除する。
リーフノード410fの処理元識別子470fの値は“c”なので、次に図11E(3)に示すように、ソート済みキー配列312cから次のキーを取り出そうとするが、ソート済みキー配列312cから全てのキーが取り出し済みなのでマージ配列に次のキーは挿入されない。次に図11E(4)に示すように、マージ配列の最小値“100011”をマージ済みキー配列313に書き出し、最小値を含むリーフノード411bであるルートノードを削除する。
ルートノードが削除されたことから、図11F(1)に示すように、リーフノード411bの処理元識別子270bの値“a”の示すソート済みキー配列312aから残りのキー482aが取り出され、マージ済みキー配列313に書き出され、マージ処理が完了する。
次に、図12A〜図14A及び図14Bを参照して第1の実施形態に係るカップルドノードツリーを用いた本発明の実施例2及び実施例3を説明する。
図12A、図13B及び図14Bは実施例2に関するものであり、図12B、図13Cは実施例3に関するものである。図13Aと図14Aは両実施例に共通である。
実施例1では、ルートノードを検索開始ノードとして最小値検索を行い、マージ配列から最小値を削除した後に次のキーを挿入することを繰り返す。それに対して、実施例2、3では、最小値検索、削除処理及び挿入処理の順番を変更したり、一部の処理をスキップすることにより、実行時のマージ処理時間を削減しようとするものである。
図12Aは実施例2の概要を説明する図であり、図12Aの(1)はマージ処理の前段を、図12Aの(2)はマージ処理の後段を説明する図である。
図12Aを図9に示す実施例1の概要と比較すると、説明の都合上、ソート済みキー配列312aのキー配列番号3に、キー483aが追加されている。また、ステップ(A)以外におけるマージ配列の部分が異なる。
後に図13Bを参照して詳細に説明するが、実施例2では、基本的には最小値検索、挿入処理及び削除処理の順番で処理を行う。そして、最小値検索の検索開始ノードを直前の削除処理で得られた削除ノードの親ノードとすることにより、最小値検索の実行ステップ数を削減する。
ステップ(A)での処理は図9に示すステップ(A)での処理と同様であり、マージ配列309aが生成される。
次のステップ(B)において、マージ配列309aに格納された最小値であるキー480bがマージ済みキー配列313のキー配列番号0の配列要素に格納される。そして、キー480bを取り出した処理元のソート済みキー配列312bからキー480bを取り出した後の最小値であるキー481bを取り出してマージ配列309aに挿入してマージ配列309b’を得る。さらに、マージ配列309b’の最小値であるキー480bがマージ配列309b’から削除され、次のステップ(C)において次のキーが挿入される前のマージ配列309c’を得る。
次のステップ(C)において、マージ配列309c’に格納された最小値であるキー480aがマージ済みキー配列313のキー配列番号1の配列要素に格納される。そして、キー480aを取り出した処理元のソート済みキー配列312aからキー480aを取り出した後の最小値であるキー481aを取り出してマージ配列309c’に挿入する。さらに、マージ配列309c’の最小値であるキー480aがマージ配列309c’から削除され、次のステップ(D)において次のキーが挿入される前のマージ配列309d’を得る。
次のステップ(D)において、マージ配列309d’に格納された最小値であるキー480cがマージ済みキー配列313のキー配列番号2の配列要素に格納される。そして、キー480cを取り出した処理元のソート済みキー配列312cからキー480cを取り出した後の最小値であるキー481cを取り出してマージ配列309d’に挿入する。さらに、マージ配列309d’の最小値であるキー480cがマージ配列309c’から削除され、マージ配列309e’を得る。
この段階では、図12Aの(1)に示すように、マージ済みキー配列313には、キー配列番号0〜2の配列要素に、それぞれキー480b“000111”、キー480a“001010”及びキー480c“010011”が格納されている。そして、ソート済みキー配列312bとソート済みキー配列312cのキーは全て取り出し済みであり、ソート済みキー配列312aにだけ、未取り出しのキーが残っている。
図12Aの(2)に示すのは、処理元のソート済みキー配列から全てのキーが取り出し済みとなった以降の処理例である。
ステップ(E)では、マージ配列309e’に格納された最小値であるキー481bがマージ済みキー配列313のキー配列番号3の配列要素に格納される。キー481bを取り出したソート済みキー配列312bのキーは全て取り出し済みなので、挿入されるキーはなく、キー481bはマージ配列309d’から削除され、マージ配列309f’を得る。
次にステップ(F)で、マージ配列309f’に格納された最小値であるキー481cがマージ済みキー配列313のキー配列番号4の配列要素に格納される。ステップ(E)と同様に、キー481cはマージ配列309f’から削除され、次のステップ(G)において次のキーが挿入される前のマージ配列309g’を得る。
次のステップ(G)において、マージ配列309g’に格納された最小値であるキー481aがマージ済みキー配列313のキー配列番号5の配列要素に格納される。そして、キー481aを取り出した処理元のソート済みキー配列312aからキー481aを取り出した後の最小値であるキー482aを取り出してマージ配列309g’に挿入する。さらに、マージ配列309g’の最小値であるキー481aがマージ配列309g’から削除され、マージ配列309h’を得る。
次のステップ(H)において、マージ配列309h’ に格納された最小値であるキー482aがマージ済みキー配列313のキー配列番号6の配列要素に格納される。キー482aを取り出したソート済みキー配列312aのキーは全て取り出し済みなので、挿入されるキーはなく、キー482aはマージ配列309h’から削除され、マージ配列は空になる。
最後のステップ(I)において、未取り出しのキーが残っているソート済みキー配列312aからキー483aを取り出してマージ済みキー配列313のキー配列番号7の配列要素に格納してマージソートが完了する。
次に図13A、図13B、図14A及び図14Bを参照して、本実施例におけるカップルドノードツリーを用いたマージソート処理フローを説明する。
図13Aは、図12Aの例示におけるマージ配列309aをカップルドノードツリーの構造を持つものとして生成するまでの初期処理を説明するものであり、図13Bは、それ以降のマージ配列から最小値を検索してマージ済み配列に書き込む処理を説明する図である。
図13Aは、図12Aを参照した先の説明からも分かるように、実施例1に係る図10Aのフロートと比べると、検索開始ノードを設定するステップが図13B側に移行したことを除いて全く同様であるので、説明を省略し、図13Bにより、本実施例のマージ処理のうち、マージ配列から最小値を検索してマージ済み配列に書き込む処理を次に説明する。
図13Bに示すように、ステップS1310において検索開始ノードにルートノードを設定する。
次にステップS1311に進み、図5Aに示す最小値検索を実行し、最小値と処理元識別子を求め、ステップS1312において、ステップS1311で得た最小値をマージ済みキー配列に書き出す。
次にステップS1313において、ステップS1311で求めた処理元識別子をソート済みキー配列の識別子としてソート済みキー配列識別子設定エリアに設定する。
次にステップS1314に進み、ステップS1313でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列から、次のキーの取り出しを試みる。
ステップS1314に続いてステップS1315に進み、ステップS1314で次のキーを取り出せたか、すなわち全てのキーを取り出し済みであったかを判定する。
全てのキーを取り出し済みであれば、ステップS1319に進み、取り出し済みでなければ、ステップS1316〜ステップS1318bの処理に進む。
ステップS1316では、挿入処理のための処理元識別子設定エリアに、ステップS1313で設定した、すなわちステップS1311で求めた処理元識別子を設定し、ステップS1317で、挿入キーにステップS1314で取り出したキーを設定する。そして、ステップS1318において、図6A〜図6Cに示す挿入処理を実行する。この挿入処理の過程で、図6Cに示すステップS624において、挿入キーをインデックスキーとして保持するステップS614で取得されたノードの直近上位のノード(以下、挿入ノードという。)の配列番号が得られる。なお、この挿入処理用の探索経路スタックは、後に説明する理由により、最小値検索用の探索経路スタックとは別のものを用いる。
次にステップS1318cにおいて、ステップS1318で得た挿入ノードの配列番号により、ステップS1311で実行した最小値検索の結果で得られた探索経路スタックを検索する。この探索経路スタックの検索の詳細については、後に図14Bを参照して説明する。
次にステップS1318dに進み、ステップS1318cでの検索の結果により、挿入ノードの配列番号と一致する配列番号が最小値検索の探索経路スタックに存在するか判定する。存在しなければステップS1319に移行し、存在すればステップS1318a〜ステップS1318bの処理を実行してからステップS1319に進む。
ステップS1318aにおいては、検索開始ノードにルートノードを設定し、ステップS1318bにおいて、ルートノードから図5Aに示す最小値検索を実行し、最小値と処理元識別子を求める。なお、ステップS1311で実行した最小値検索の結果で得られた探索経路スタックを検索し、ステップS1318bで最小値検索を再び行う理由については後に説明する。
ステップS1319においては、削除ノード設定エリアにステップS1318bで求めた最小値を含むノードの配列番号を設定し、次にステップS1320に進んでマージ配列から削除ノードを削除するとともに、削除ノードの直近上位の親ノードを得る。この削除処理においては、最小値検索用の探索経路スタックを利用する。なお、ステップS1320の処理の詳細は、後に図14Aを参照して説明する。
次にステップS1321に進み、ルートノードが登録されているか判定する。ルートノードがまだ削除されておらず登録されていれば、ステップS1322に進み、ステップS1320で得た親ノードを検索開始ノードに設定してステップS1311に戻る。
ルートノードが削除済みで登録されていなければ、ステップS1323に進み、ステップS1313でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列より、次のキーからキーの最大値まで取り出してマージ済みキー配列に順次書き出して処理を終了する。
先に述べたように、実施例2は、最小値検索の検索開始ノードを、直前の削除処理で得られた削除ノードの親ノードとすることにより、最小値検索の実行ステップ数を削減しようとするものである。しかし、次のキーを挿入するまでは次の最小値を確定することができない。
そこで、ステップS1318に示すように先に次のキーを挿入する。そして、次のキーを挿入したツリーから、次のキーを挿入する前のツリーの最小値検索により得られた最小値を含むノードを削除する。ところが、挿入ノードが最小値検索の時の経路上に存在する場合には、挿入処理により挿入キーを保持するリーフノードを含むノード対が挿入ノードと最小値を含むリーフノードとの間に挿入されている。したがって、次のキーの挿入後のルートノードから最小値を保持するリーフノードに至る経路が次のキーの挿入前と一致しない。すると、引き続いて実行される削除処理において、削除ノードの親ノードを正しく設定することができず、削除処理自体も正しく行うことができないので、再度ルートノードから、最小値検索を行い、最小値検索用の探索経路スタックをリフレッシュする必要がある。
一方、挿入ノードが最小値検索の時の経路上に存在しない場合には、挿入処理により挿入キーを保持するリーフノードを含むノード対が挿入ノードと最小値を含むリーフノードとの間に挿入されていないので、次のキーの挿入後のルートノードから最小値を保持するリーフノードに至る経路が次のキーの挿入前と一致する。したがって、挿入処理の後であっても、この場合には、削除処理において削除ノードの親ノードを正しく設定することができるので、削除処理を正しく実行し、その親ノードから次の最小値検索を行うことができる。
なお、念のため説明すれば、削除ノードは最小値を含むノードであることから、次の最小値を含むノードは、カップルドノードツリーの順序性によって、削除ノードの親ノードの下位のノードである。したがって、親ノードを次の最小値検索の検索開始ノードとすることができる。
次に、図14Aを参照して、マージ配列から削除ノードを削除するとともに、親ノードを得る処理を説明する。
図14Aに示すように、ステップS1402で探索経路スタックに2つ以上の配列番号が格納されているか判定する。図8BのステップS812で説明したのと同じく、2つ以上の配列番号が格納されていないということは、言い換えれば1つだけ配列番号が格納されており、その配列番号はルートノードの格納された配列要素のものである。その場合はステップS1407に移行し、ルートノードの配列番号に係るノード対を削除する。次にステップS1408に進み、登録されていたルートノードの配列番号を削除して処理を終了する。
ステップS1402において探索経路スタックに2つ以上の配列番号が格納されていると判定されたときはステップS1403に進み、ステップS1401で設定した削除ノードと対をなすノードの配列番号を求め、対ノードの配列番号として設定する。
次にステップS1404に進み、図13Bに示すステップS1311の最小値検索で用いた探索経路スタックのスタックポインタを1つ戻して配列番号を取り出し、親ノードの配列番号として設定する。
次にステップS1405に進み、ステップS1403で設定した対ノードの配列番号の指す配列要素の内容を読み出し、ステップS1404で設定した親ノードの配列番号の指す配列要素に格納する。
次にステップS1406に進み、削除ノードの配列番号に係るノード対を削除して処理を終了する。
次に図14Bを参照して、探索経路スタックの検索処理について説明する。
図14Bに示すように、ステップS1411において、検索用スタックポインタとして、図13Bに示すステップS1311で実行した最小値検索における探索経路スタックのスタックポインタを設定する。
次にステップS1412で、検索番号設定エリアに図13Bに示すステップS1318で得られた挿入ノードの配列番号を検索番号として設定する。
次にステップS1403で、検索用スタックポインタがルートノードの格納された配列要素の配列番号を指しているか判定する。検索用スタックポインタがルートノードの格納された配列要素の配列番号を指していれば、最小値検索の探索経路スタックに格納された配列番号は挿入ノードの配列番号と一致しないことを出力して処理を終了する。
検索用スタックポインタがルートノードの格納された配列要素の配列番号を指していなければ、ステップS1414に進み、検索用スタックポインタを1つ戻して配列番号を取り出す。
次にステップS1415において、ステップS1402で設定した検索番号とステップS1414で取り出した配列番号が一致するか判定する。一致しなければ、ステップS1413に戻る。
一致すれば、最小値検索の探索経路スタックに格納された配列番号には挿入ノードの配列番号と一致するものがあることを出力して処理を終了する。
次に実施例3について説明する。後に図13Cを参照して詳細に説明するが、実施例3では、基本的には実施例1と同様に最小値検索、削除処理、挿入処理の順番で処理を行うが、削除処理の後に削除ノードの親ノードを検索開始ノードとして中間的に最小値検索を行い、その最小値と次に処理元から取り出されるキーとの大小比較を行い、次のキーが小さければ挿入処理はスキップして直接マージ済みキー配列に書き出すものである。
図12Bは実施例3の概要を説明する図であり、図12Bの(1)はマージ処理の前段を、図12Bの(2)はマージ処理の後段を説明する図である。
図12Bを図9に示す実施例1の概要と比較すると、説明の都合上、ソート済みキー配列312cのキー配列番号2に、キー482cが追加されている。また、ステップ(A)以外におけるマージ配列の部分が異なる。
ステップ(A)での処理は図9に示すステップ(A)での処理と同様であり、マージ配列309aが生成される。
次のステップ(B)において、マージ配列309aに格納された最小値であるキー480bがマージ済みキー配列313のキー配列番号0の配列要素に格納され、キー480bはマージ配列309aから削除される。次にキー480b削除後のマージ配列309aの次の最小値であるキー480aと処理元識別子を求める。そして、キー480bを取り出した処理元のソート済みキー配列312bからキー480bを取り出した後の最小値である次のキー481bを取り出してキー480aとの大小比較を行う。次のキー481bがマージ配列309aの次の最小値であるキー480aより大きいので、キー481bをマージ配列309aに挿入してマージ配列309b’を得る。
次のステップ(C)において、マージ配列309b’に格納された最小値であるキー480aがマージ済みキー配列313のキー配列番号1の配列要素に格納され、キー480aはマージ配列309b’から削除される。次にキー480a削除後のマージ配列309b’の次の最小値であるキー480cと処理元識別子を求める。そして、キー480aを取り出した処理元のソート済みキー配列312aからキー480aを取り出した後の最小値である次のキー481aを取り出してキー480cとの大小比較を行う。次のキー481aがマージ配列309b’の次の最小値であるキー480cであるより大きいので、キー481aをマージ配列309b’に挿入してマージ配列309c’を得る。
次のステップ(D)において、マージ配列309c’に格納された最小値であるキー480cがマージ済みキー配列313のキー配列番号2の配列要素に格納され、マージ配列309c’から削除される。次にキー480c削除後のマージ配列309c’の次の最小値であるキー481bと処理元識別子を求める。そして、キー480cを取り出した処理元のソート済みキー配列312cからキー480cを取り出した後の最小値である次のキー481cを取り出してキー481bとの大小比較を行う。次のキー481cがマージ配列309c’の次の最小値であるキー481bより小さいので、次のキー481cをマージ済みキー配列313のキー配列番号3の配列要素に格納する。ステップ(D)ではマージ配列マージ配列309c’に挿入される次のキーはなく、キー480c削除後のマージ配列309c’が、図示のマージ配列309d’である。
この段階では、図12Bの(1)に示すように、マージ済みキー配列313には、キー配列番号0〜3の配列要素に、それぞれキー480b“000111”、キー480a“001010”、キー480c“010011” 及びキー481c“011000”が格納されている。そして、ソート済みキー配列312bのキーは全て取り出し済みであり、ソート済みキー配列312aとソート済みキー配列312cに、未取り出しのキーが残っている。
図12Bの(2)に示すステップ(E)では、ソート済みキー配列312cからキー481cを取り出した後の最小値である次のキー482cを取り出してキー481bとの大小比較を行う。次のキー482cがマージ配列309d’の最小値であるキー481bより大きいので、キー482cをマージ配列309d’に挿入する。
そして、キー482c挿入後のマージ配列309d’の最小値であるキー481bがマージ済みキー配列313のキー配列番号4の配列要素に格納され、マージ配列309d’から削除され、マージ配列309e’を得る。
次のステップ(F)では、ステップ(E)で削除されたキー481bの処理元のソート済みキー配列312bのキーは全て取り出し済みであるからマージ配列309e’へ挿入されるキーはない。マージ配列309e’に格納された最小値であるキー482cがマージ済みキー配列313のキー配列番号5の配列要素に格納され、キー482cはマージ配列309e’から削除され、マージ配列309f’を得る。
次のステップ(G)においても、ステップ(F)で削除されたキー482cの処理元のソート済みキー配列312cのキーは全て取り出し済みであるからマージ配列309f’へ挿入されるキーはない。マージ配列309f’に格納された最小値であるキー481aがマージ済みキー配列313のキー配列番号6の配列要素に格納され、キー481aはマージ配列309f’から削除される。そして、図に示すように、マージ配列は空、すなわちカップルドノードツリーのルートノードは削除済みとなる。
最後のステップ(H)において、未取り出しのキーが残っているソート済みキー配列312aからキー482aを取り出してマージ済みキー配列313のキー配列番号7の配列要素に格納してマージソートが完了する。
次に実施例3のマージ処理のフローについて説明する。図12Aの例示におけるマージ配列309aをカップルドノードツリーの構造を持つものとして生成するまでの初期処理は、図13Aに示す実施例2の処理フローと同一である。したがって、それ以降のマージ配列から最小値を検索してマージ済み配列に書き込む処理を、図13Cを参照して説明する。
図13Cに示すように、ステップS1350において検索開始ノードにルートノードを設定する。
次にステップS1351に進み、図5Aに示す最小値検索を実行し、最小値と処理元識別子を求め、ステップS1352において、ステップS1351で得た最小値をマージ済みキー配列に書き出す。
次にステップS1353において、ステップS1351で求めた処理元識別子をソート済みキー配列の識別子としてソート済みキー配列識別子設定エリアに設定する。
次にステップS1354に進み、削除ノード設定エリアにステップS1351あるいは後記ステップS1358で求めた最小値を含むノードの配列番号を設定し、次にステップS1355において、マージ配列から削除ノードを削除するとともに、削除ノードの直近上位の親ノードを得る。なお、ステップS1355の処理の詳細は、先に図14Aを参照して説明したものである。
次にステップS1356に進み、ルートノードが登録されているか判定する。ルートノードがまだ削除されておらず登録されていれば、ステップS1357以降の処理に進み、ステップS1352あるいはステップS1350に戻る。
ルートノードが削除済みで登録されていなければ、ステップS1366に進み、ステップS1353でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列より、次のキーからキーの最大値まで取り出してマージ済みキー配列に順次書き出して処理を終了する。
ステップS1357においては、ステップS1355で得た親ノードを検索開始ノードに設定し、ステップS1358に進み、図5Aに示す最小値検索を実行し、最小値と処理元識別子を求める。
次にステップS1359に進み、ステップS1353でソート済みキー配列識別子設定エリアに設定された識別子の指すソート済みキー配列から、次のキーの取り出しを試みる。
ステップS1359に続いてステップS1360に進み、ステップS1359で次のキーを取り出せたか、すなわち全てのキーを取り出し済みであったかを判定する。
全てのキーを取り出し済みであれば、ステップS1352に戻り、図12Bのステップ(E)、ステップ(F)について説明したように、挿入処理をスキップしてマージ済みキー配列への最小値書き出しと削除処理を行う。
全てのキーを取り出し済みでなければ、ステップS1361へ進む。ステップS1361では、ステップS1359で取り出した次のキーとステップS1358で求めた最小値の大小関係を判定する。
次のキーが最小値より小さければ、次のキーをマージ配列に挿入して最小値検索を行ったとしても、求められるのはその次のキーであるから、挿入処理は行わず、ステップS1362に分岐してマージ済みキー配列に次のキーを書き出し、ステップS1359に戻ってさらに次のキーを取り出す。
次のキーが最小値より小さくなければ、ステップS1363〜ステップS1365のキーをマージ配列に挿入する処理を実行してステップS1350に戻る。
ステップS1363において、挿入処理のための処理元識別子設定エリアに、ステップS1353で設定した、すなわちステップS1351で求めた処理元識別子を設定し、ステップS1364で、挿入キーにステップS1359で取り出したキーを設定する。そして、ステップS1365において、図6A〜図6Cに示す挿入処理を実行し、ステップS1350に戻る。
次に、図15〜図24Cを参照して、第2の実施形態に係るマージソートについて説明する。本実施形態は、先に述べた特願2007−114915において提案した、インデックスキーをカップルドノードツリーとは別の領域に配置し、リーフノードにはインデックスキーに代えてインデックスキーの配置された領域へのポインタを格納したカップルドノードツリーを用いるものである。その際、本実施例では、インデックスキーとともに処理元識別子を格納することにより、マージソートに適用可能とする。
図15は、第2の実施形態に係る配列に格納されたカップルドノードツリーの構成例を説明する図である。図2Aに示す第1の実施形態に係る構成例と比較すると、リーフノードであるノード[1]に、図2Aに示す処理元識別子119とインデックスキー118に代えて、該インデックスキーと処理元識別子の格納された領域を示す参照ポインタ118aが格納されている点でことなるだけで、他は同じであるから、説明は省略する。
図16の(1)に示すのは、本実施形態に係るカップルドノードツリーのツリー構造を概念的に示す図であり、同図の(2)に示すのは、参照ポインタの指す処理元識別子とインデックスキーからなるキー情報を格納したキー情報の記憶領域311を示す図である。
図16の(1)に示すカップルドノードツリーは、図2Bに例示するカップルドノードツリーの各リーフノードの処理元識別子とインデックスキーを参照ポインタ280c、281d、280e、281e、280g、281g、280h、281hで置き換えたものであり、図16の(2)に示すキー情報の記憶領域311の各参照ポインタの指すエリアには図2Aに示す対応するキー情報である処理元識別子とインデックスキーが格納されている。
図17は、本実施形態のためのハードウェア構成例を説明する図である。図3に示す第1の実施形態のためのハードウェア構成例と比較すると、キー情報の記憶領域311がデータ格納装置308に加わっただけであるから、説明を省略する。
図18は、本実施態様に係るカップルドノードツリーを用いたビット列検索の基本動作を示すフローチャートである。
ステップS1801〜ステップS1809の処理は、図4に示す第1の実施形態のビット列検索の基本動作を示すフローチャートのステップS401〜ステップS409と同じであるから、説明を省略する。
ステップS1805で、ノード種別がブランチでない、すなわち、リーフノードであると判定されると、ステップS1810aに分岐し、該リーフノードから参照ポインタを取り出し、ステップS1810bで参照ポインタの指すキー情報を読み出す。
そして、ステップS1810cでキー情報からインデックスキーを取り出し、ステップS1810dで処理元識別子を取り出して処理を終了する。
図19Aは、本実施態様に係るカップルドノードツリーに格納されたインデックスキーの最小値を求める処理を示したフローチャートである。
ステップS1901〜ステップS1907の処理は、図5Aに示す第1の実施形態の最小値検索を示すフローチャートのステップS401〜ステップS409と同じであるから、説明を省略する。
ステップS1905で、ノード種別がブランチでない、すなわち、リーフノードであると判定されると、ステップS1908aに分岐し、該リーフノードから参照ポインタを取り出し、ステップS1908bで参照ポインタの指すキー情報を読み出す。
そして、ステップS1908cでキー情報からインデックスキーを取り出し、ステップS1908dで処理元識別子を取り出して処理を終了する。
図19Bは、本実施態様に係るカップルドノードツリーに格納されたインデックスキーの最大値を求める処理を示したフローチャートである。
ステップS1911〜ステップS1918dまでの処理のうち、ステップS1917の処理が代表ノード番号に値1を加えて配列番号を得るものである点を除いて、図19Aに示すステップS1901〜S1908dまでの処理と同様であるので、説明は省略する。
図20A〜図20C、図21は、本実施態様に係るカップルドノードツリーにおけるノード挿入処理を説明する図である。図20A〜図20Cが通常の挿入処理を説明するものであり、図21はルートノードの挿入処理を説明するものである。
図20Aは挿入処理の前段である検索処理の処理フローを示す図である。
ステップS2001において、検索開始ノードの配列番号を設定するエリアにルートノードの配列番号を設定し、ステップS2002において、検索キーに挿入キーを設定する。
次にステップS2010において、図18に示す検索処理を実行し検索結果のインデックスキーを得て、ステップS2011に進む。
ステップS2011において挿入キーとステップS2010で得られたインデックスキーを比較し、等しければ挿入キーは既にカップルドノードツリーに存在するのであるから、挿入は失敗となり、処理を終了する。挿入キーとステップS2010で得られたインデックスキーが等しくなければ、ステップS2011aに進み、キー情報設定エリアのインデックスキーに挿入キーを設定する。
次にステップS2011bにおいてキー情報設定エリアの処理元識別子に、挿入キーの処理元識別子を設定して図20BのステップS2012に進む。
図20Bは、挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。図6Bに示す第1の実施形態のものと、図20Aにおける検索処理が図18に示すものである点を除いて同一であるので、説明を省略する。
図20Cは図20Bで準備された配列にノードを格納するとともにその挿入位置を求め、既存のノードの内容を変更して挿入処理を完成させる処理フローを示す図である。図20Cに示すステップS2016〜ステップS2024までの処理は、第1の実施形態の図6Cに示すステップS616〜ステップS624までの処理と同じであるので、説明を省略する。
ステップS2024に引き続き、ステップS2025aにおいて、キー情報の記憶領域の空き領域へのポインタを取得する。この空き領域へのポインタを取得は、キー情報の記憶領域の管理手法に応じて行うことができる。
次にステップS2025bに進み、ステップS2011a、ステップS2011bで設定したキー情報を、ステップS2025aで取得したポインタの指すキー情報の記憶領域に書き込む。
次にステップS2025cに進み、ステップS2014で得た配列番号の指す配列要素の、ノード種別にリーフを、参照ポインタにステップS2025aで得たポインタを書き込む。
次のステップS2026〜ステップS2028の処理終了までの処理は、第1の実施形態の図6Cに示すステップS626〜ステップS628までの処理と同じであるので、説明を省略する。
図21は、本実施態様に係るカップルドノードツリーを新規に生成し登録する処理、すなわちルートノードの挿入処理を説明する図である。
まず、ステップS2102において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。次にステップS2103において、ステップS2102で得た配列番号に0を加えた配列番号を求める。(実際には、ステップS2102で取得した配列番号に等しい。)
次にステップS2103aにおいて、キー情報の記憶領域の空き領域へのポインタを取得し、ステップS2103bで取得してポインタの指す記憶領域のキー情報の処理元識別子に挿入キーを取り出したソート済み配列の識別子を、インデックスキーに挿入キーを書き込む。
さらにステップS2104において、ステップS2103で得た配列番号の配列要素に、ノード種別に1(リーフノード)を、参照ポインタにS2103aで得たポインタを書き込み、ステップS2105に進む。
ステップS2105で、ステップS2102で取得したルートノードの配列番号を登録して処理を終了する。
図22Aと図22Bは、本実施態様に係るカップルドノードツリーのインデックスキーのうち、特定のインデックスキーを削除する処理フローを説明する図である。
図22Aは、削除処理の前段である検索処理の処理フローを示す図であるが、図8Aに示す第1の実施形態のものと、検索処理が図18に示すものである点を除いて同一であるので、説明を省略する。
図22Bは、削除処理の後段の処理フローを説明する図である。図22Bに示すステップS2212〜ステップS2219の処理は、図8Bに示す第1の実施形態のものと同一であるので、説明を省略する。
本実施例ではキー情報の記憶領域を用いていることから、最後の処理として、ステップS2220において、ステップS2210で得た参照ポインタの指す記憶領域を開放し、処理を終了する。
以上、本実施形態のソートマージで用いるカップルドノードツリーとキー情報の記憶領域について説明した。
次に、図23A、図23Bを参照して第2の実施形態に係るカップルドノードツリーを用いた本発明の実施例4を説明する。
本実施例は、第1の実施形態に係るカップルドノードツリーを用いた実施例1において、第2の実施形態に係るカップルドノードツリーを用いるようにしたものである。
図23A及び図23Bは、本実施例におけるカップルドノードツリーを用いたマージソート処理フローを説明する図である。
図23Aは、例えば図9に示すマージ配列309aをカップルドノードツリーの構造を持つものとして生成し、検索開始ノードの配列番号を設定するエリアに、生成したカップルドノードツリーのルートノードの配列番号を設定するまでの初期処理を説明するものであり、図23Bは、それ以降の最小値を検索してマージを実行する処理を説明する図である。
図23Aに示すステップS2301〜ステップS2310の処理は、図10Aに示す実施例1の処理と比較すると、ステップ2309における挿入処理が第2の実施態様に係る図20A〜図20Cに示すものであることと、ステップS2308におけるルートノードの挿入処理が第2の実施態様に係る図21に示すものであることを除けば、図10Aに示すステップS1001〜ステップS1010と同じであるので、説明を省略する。
また、図23Bに示すステップS2311〜S2322の処理も、図10Bに示す実施例1の処理と比較すると、ステップS2311の検索処理が第2の実施態様に係る図19に示すものであること、ステップS2314の削除処理が第2の実施態様に係る図22A、図22Bに示すものであること、及びステップ2321における挿入処理が第2の実施態様に係る図20A〜図20Cに示すものであることを除けば、図10Bに示すステップS1011〜ステップS1022と同じであるので、説明を省略する。
次に、図24A、図24Bを参照して第2の実施形態に係るカップルドノードツリーを用いた本発明の実施例5を説明する。
本実施例は、第1の実施形態に係るカップルドノードツリーを用いた実施例2において、第2の実施形態に係るカップルドノードツリーを用いるようにしたものである。
図24A及び図24Bは、本実施例におけるカップルドノードツリーを用いたマージソート処理フローを説明する図である。
図24Aは、例えば図12Bに示すマージ配列309aをカップルドノードツリーの構造を持つものとして生成し、検索開始ノードの配列番号を設定するエリアに、生成したカップルドノードツリーのルートノードの配列番号を設定するまでの初期処理を説明するものであり、図24Bは、それ以降の最小値を検索してマージを実行する処理を説明する図である。
図24Aは、図12Bを参照した先の説明からも分かるように、実施例4に係る図23Aのフロート全く同様であるので、説明を省略する。
また、図24Bに示すステップS2410〜S2423の処理も、図13Bに示す実施例2の処理と比較すると、ステップS2411の検索処理が第2の実施態様に係る図19に示すものであること、ステップ2418における挿入処理が第2の実施態様に係る図20A〜図20Cに示すものであること及びステップS2420の削除処理の次に、ステップS2420aが挿入され、ステップS2410で得た参照ポインタの指す記憶領域を開放することを除けば、図13Bに示すステップS1310〜ステップS1323と同じであることを指摘して、説明の繰り返しを省略する。
次に第2の実施形態に係るカップルドノードツリーを用いた本発明の実施例6を説明する。本実施例は、第1の実施形態に係るカップルドノードツリーを用いた実施例において、第2の実施形態に係るカップルドノードツリーを用いるようにしたものである。
図24A及び図24Cは、本実施例におけるカップルドノードツリーを用いたマージソート処理フローを説明する図である。マージソートの初期処理は実施例5とまったく同じで、図24Aに示す処理は共通である。
初期処理以降の最小値を検索してマージを実行する処理を説明する図24Cも、実施例3の初期処理以降の最小値を検索してマージを実行する処理を説明する図13Cと同様なものである。
図24Cに示すステップS2450〜S2466の処理は、図13Cに示す実施例3の処理と比較すると、ステップS2451及びステップS2458の検索処理が第2の実施態様に係る図19に示すものであること、ステップ2465における挿入処理が第2の実施態様に係る図20A〜図20Cに示すものであること及びステップS2455の削除処理の次に、ステップS2455aが挿入され、ステップS2451で得た参照ポインタの指す記憶領域を開放することを除けば、図13Cに示すステップS1350〜ステップS1366と同じであることを指摘して、説明の繰り返しを省略する。
以上本発明を実施するための最良の形態について昇順のソートマージを例にとって詳細に説明したが、降順のソートマージについても昇順のソートマージを修正することにより実施可能であることは明らかである。また、本発明の実施の形態は上記に限ることなく種々の変形が可能であることは当業者に明らかである。さらに、本発明のビット列のマージソート方法をコンピュータに実行させるプログラムによりコンピュータ上に構築可能なことは明らかである。
したがって、上記プログラム、及びプログラムを記憶したコンピュータ読み取り可能な記憶媒体は、本発明の実施の形態に含まれる。さらに、本発明のカップルドノードツリーのデータ構造も、本発明の実施の形態に含まれる。
ソート済みのデータのマージを繰り返してソート対象データ全体のソートを行うマージソートの後段の処理を説明する図である。 従来の検索で用いられるパトリシアツリーの一例を示す図である。 第1の実施形態に係る配列に格納されたカップルドノードツリーの構成例を説明する図である。 第1の実施形態に係るカップルドノードツリーのツリー構造を概念的に示す図である。 第1の実施形態のためのハードウェア構成例を説明する図である。 第1の実施形態に係るビット列検索の基本動作を示したフローチャートである。 第1の実施形態に係る、カップルドノードツリーに格納されたインデックスキーの最小値を求める処理を示したフローチャートである。 第1の実施形態に係る、カップルドノードツリーに格納されたインデックスキーの最大値を求める処理を示したフローチャートである。 第1の実施形態に係る、挿入処理の前段である検索処理の処理フローを示す図である。 第1の実施形態に係る、挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。 第1の実施形態に係る、ノード対を挿入する位置を求め、ノード対の各ノードの内容を書き込んで挿入処理を完成させる処理フローを示す図である。 第1の実施形態に係る、ルートノードの挿入処理を説明する処理フロー図である。 第1の実施形態に係る、削除処理の前段である検索処理の処理フローを示す図である。 第1の実施形態に係る、削除処理の後段の処理フローを説明する図である。 実施例1の概要を説明する図である。 実施例1におけるカップルドノードツリーを用いたマージソートの初期処理を説明する図である。 実施例1におけるカップルドノードツリーの最小値を検索してマージを実行する処理を説明する図である。 図9に示す例をカップルドノードツリーで説明する第1の図である。 図9に示す例をカップルドノードツリーで説明する第2の図である。 図9に示す例をカップルドノードツリーで説明する第3の図である。 図9に示す例をカップルドノードツリーで説明する第4の図である。 図9に示す例をカップルドノードツリーで説明する第5の図である。 図9に示す例をカップルドノードツリーで説明する第6の図である。 実施例2の概要を説明する図である。 実施例3の概要を説明する図である。 実施例2及び3におけるカップルドノードツリーを用いたマージソートの初期処理を説明する図である。 実施例2におけるカップルドノードツリーの最小値を検索してマージを実行する処理を説明する図である。 実施例3におけるカップルドノードツリーの最小値を検索してマージを実行する処理を説明する図である。 実施例2及び3における削除処理を説明する図である。 探索経路スタックの検索処理を説明する図である。 第2の実施形態に係る配列に格納されたカップルドノードツリーの構成例を説明する図である。 第2の実施形態に係るカップルドノードツリーのツリー構造を概念的に示す図である。 第2の実施形態のためのハードウェア構成例を説明する図である。 第2の実施形態に係るビット列検索の基本動作を示したフローチャートである。 第2の実施形態に係る、カップルドノードツリーを用いたインデックスキーの最小値を求める処理を示したフローチャートである。 第2の実施形態に係る、カップルドノードツリーを用いたインデックスキーの最大値を求める処理を示したフローチャートである。 第2の実施形態に係る、挿入処理の前段である検索処理の処理フローを示す図である。 第2の実施形態に係る、挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。 第2の実施形態に係る、ノード対を挿入する位置を求め、ノード対の各ノードの内容を書き込んで挿入処理を完成させる処理フローを示す図である。 第2の実施形態に係る、ルートノードの挿入処理を説明する処理フロー図である。 第2の実施形態に係る、削除処理の前段である検索処理の処理フローを示す図である。 第2の実施形態に係る、削除処理の後段の処理フローを説明する図である。 実施例4におけるカップルドノードツリーを用いたマージソートの初期処理を説明する図である。 実施例4におけるカップルドノードツリーにより最小値を検索してマージを実行する処理フローを説明する図である。 実施例5及び6におけるカップルドノードツリーを用いたマージソートの初期処理を説明する図である。 実施例5におけるカップルドノードツリーにより最小値を検索してマージを実行する処理フローを説明する図である。 実施例6におけるカップルドノードツリーにより最小値を検索してマージを実行する処理フローを説明する図である。
符号の説明
10、20、30 配列番号
100 配列
101 ノード
102 ノード種別
103 弁別ビット位置
104 代表ノード番号
111 ノード対
112 ノード[0]、代表ノード
113 ノード[1]、代表ノードと対をなすノード
118 インデックスキー
301 データ処理装置
302 中央処理装置
303 キャッシュメモリ
304 バス
305 主記憶装置
306 外部記憶装置
307 通信装置
308 データ格納装置
309 配列
310 探索経路スタック
311 キー情報の記憶領域
312 ソート済みキー配列
313 マージ済みキー配列

Claims (15)

  1. コンピュータが実行するマージソート方法であって、昇順あるいは降順にソート済みのビット列からなるキーを格納した複数のソート済みキー記憶領域からそれぞれ最小値あるいは最大値であるキーを取り出してマージ用キー列を生成し、該マージ用キー列のうちの最小値あるいは最大値であるものを該マージ用キー列から取り出してマージ済みキー記憶領域に格納し、該マージ済みキー記憶領域に格納されたキーが取り出された前記ソート済みキー記憶領域から次の最小値あるいは次の最大値である次のキーを取り出して前記マージ用キー列に挿入し、該マージ用キー列のうちの最小値あるいは最大値であるキーを該マージ用キー列から取り出して前記マージ済みキー記憶領域に格納することを前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納するまで繰り返すことにより、前記複数のソート済みキー記憶領域に格納された全てのキーを昇順あるいは降順にソートするビット列のマージソート方法において、
    前記マージ用キー列のキーを、
    ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含み、前記ツリーの任意のノードを検索開始ノードとして前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索結果である検索結果キーとするように構成されたカップルドノードツリー上のインデックスキーとして保持するとともに、前記リーフノードは前記キーの格納されていた前記ソート済みキー記憶領域を識別する処理元識別子を含むものとし、
    前記ソート済みのキーを格納した複数のソート済みキー記憶領域からそれぞれ最小あるいは最大のキーを取り出して前記カップルドノードツリーを生成するマージツリー生成ステップと、
    該カップルドノードツリーを用いて最小値あるいは最大値検索を行い、検索結果の最小値である最小キーあるいは最大値である最大キーと前記処理元識別子を取得し該最小キーあるいは最大キーを前記マージ済みキー記憶領域に格納するマージステップと、
    該最小キーあるいは最大キーを前記カップルドノードツリーから削除するキー削除ステップと、
    前記マージステップにおいて取得された処理元識別子が示す前記ソート済みキー記憶領域から前記最小キーの次の最小値である次のキーあるいは前記最大キーの次の最大値である次のキーを取り出す次キー取り出しステップと、
    該取り出した次のキーを前記カップルドノードツリーに挿入する次キー挿入ステップと、
    を備え、
    前記マージステップ、前記キー削除ステップ、前記次キー取り出しステップ及び前記次キー挿入ステップを、前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納するまで繰り返すことにより、
    前記複数のソート済みキー記憶領域に格納されたキーを昇順あるいは降順に前記マージ済みキー記憶領域に格納することを特徴とするビット列のマージソート方法。
  2. 請求項1に記載のビット列のマージソート方法において、
    前記次キー取り出しステップは、前記取得された処理元識別子が示す前記ソート済みキー記憶領域から前記次のキーが取り出せたか判定する次キー取り出し判定ステップを含み、
    該次キー取り出し判定ステップで前記次のキーが取り出せないと判定した場合に、前記次キー挿入ステップをスキップすることを特徴とするビット列のマージソート方法。
  3. 請求項2に記載のビット列のマージソート方法において、
    前記キー削除ステップは、前記最小キーあるいは最大キーを前記カップルドノードツリーから削除した後に前記カップルドノードツリーの前記ルートノードが登録されているか判定するルートノード登録判定ステップを含み、
    前記ルートノード登録判定ステップにおいて前記ルートノードが登録されていないと判定された場合に未取り出しのキーが存在する前記ソート済みキー記憶領域から順次最大あるいは最小のキーまで取り出して前記マージ済みキー記憶領域に格納する最終マージステップを備えることを特徴とするビット列のマージソート方法。
  4. 請求項1に記載のビット列のマージソート方法において、
    前記キー削除ステップ、前記次キー取り出しステップ及び前記次キー挿入ステップの実行順序を、前記次キー取り出しステップ、前記次キー挿入ステップ及び前記キー削除ステップの実行順序とすることを特徴とするビット列のマージソート方法。
  5. 請求項4に記載のビット列のマージソート方法において、
    前記削除された最小値あるいは最大値を含むノードの直近上位のノードを前記マージステップにおける最小値あるいは最大値検索の検索開始ノードとすることを特徴とするビット列のマージソート方法。
  6. 請求項5に記載のビット列のマージソート方法において、
    前記挿入された次のキーをインデックスキーとして含むノードの直近上位のノードである挿入ノードが、前記最小値検索あるいは最大値検索におけるルートノードから該最小値あるいは最大値を含むリーフノードに至る検索経路に存在するか判定する挿入ノード検索ステップと、
    前記挿入ノード検索ステップで該挿入ノードが前記検索経路に存在すると判定されるとルートノードを検索開始ノードとして再度最小値検索あるいは最大値検索を行う再検索ステップと、
    を備えることを特徴とするビット列のマージソート方法。
  7. 請求項1に記載のビット列のマージソート方法において、
    前記キー削除ステップの次に、該キー削除ステップで削除された最小値あるいは最大値を含むノードの直近上位のノードを検索開始ノードとして最小値あるいは最大値検索を行う中間検索ステップと、
    前記次キー取り出しステップの次に、該次キー取り出しステップで取り出した前記次のキーが前記中間検索ステップで求めた最小値あるいは最大値より小さいかあるいは大きいか判定する次キー大小判定ステップを備え、
    前記次のキーが前記最小値あるいは最大値より小さいかあるいは大きい場合、該次のキーを前記マージ済みキー記憶領域に格納して再度前記次キー取り出しステップを実行し、
    前記次のキーが前記最小値あるいは最大値より大きいかあるいは小さい場合、前記次キー挿入ステップを実行することを特徴とするビット列のマージソート方法。
  8. 請求項7に記載のビット列のマージソート方法において、
    前記次キー取り出しステップは、前記取得された処理元識別子が示す前記ソート済みキー記憶領域から前記次のキーが取り出せたか判定する次キー取り出し判定ステップを含み、
    該次キー取り出し判定ステップで前記次のキーが取り出せないと判定した場合に、前記次キー挿入ステップとルートノードを検索開始ノードとして最小値検索あるいは最大値検索を行う検索ステップとをスキップすることを特徴とするビット列のマージソート方法。
  9. 請求項1〜8のいずれか1項に記載のビット列のマージソート方法において、
    前記カップルドノードツリーのリーフノードには、処理元識別子とインデックスキーに替えて、該処理元識別子とインデックスキーの配置された領域へのポインタを格納し、処理元識別子とインデックスキーの取得は、該ポインタを介して行われることを特徴とするビット列のマージソート方法。
  10. 請求項1〜9のいずれか1項に記載のビット列のマージソート方法をコンピュータに実行させるためのプログラム。
  11. 請求項1〜9のいずれか1項に記載のビット列のマージソート方法をコンピュータに実行させるためのプログラムを記憶したことを特徴とするコンピュータ読み取り可能な記憶媒体。
  12. コンピュータが実行するマージソート方法であって、昇順あるいは降順にソート済みのビット列からなるキーを格納した複数のソート済みキー記憶領域からそれぞれ最小値あるいは最大値であるキーを取り出してマージ用キー列を生成し、該マージ用キー列のうちの最小値あるいは最大値であるものを該マージ用キー列から取り出してマージ済みキー記憶領域に格納し、該マージ済みキー記憶領域に格納されたキーが取り出された前記ソート済みキー記憶領域から次の最小値あるいは次の最大値である次のキーを取り出して前記マージ用キー列に挿入し、該マージ用キー列のうちの最小値あるいは最大値であるキーを該マージ用キー列から取り出して前記マージ済みキー記憶領域に格納することを前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納するまで繰り返すことにより、前記複数のソート済みキー記憶領域に格納された全てのキーを昇順あるいは降順にソートするビット列のマージソート方法におけるマージ用キー列のためのツリー状のデータ構造において
    ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるカップルドノードツリーであって
    前記ルートノードは、前記ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、該ツリーのノードが2つ以上のときは前記ブランチノードであり、
    前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードの位置を示す情報を含み、
    前記リーフノードは、前記ソート済みキー記憶領域から取り出したキーであって検索対象のビット列からなるインデックスキーと前記キーの格納されていた前記ソート済みキー記憶領域を識別する処理元識別子を含むものであり
    前記コンピュータが、
    前記ソート済みのキーを格納した複数のソート済みキー記憶領域からそれぞれ最小あるいは最大のキーを取り出して前記カップルドノードツリーを生成するマージツリー生成ステップと、
    該カップルドノードツリーを用いて最小値あるいは最大値検索を行い、検索結果の最小値である最小キーあるいは最大値である最大キーと前記処理元識別子を取得し該最小キーあるいは最大キーを前記マージ済みキー記憶領域に格納するマージステップと、
    該最小キーあるいは最大キーを前記カップルドノードツリーから削除するキー削除ステップと、
    前記マージステップにおいて取得された処理元識別子が示す前記ソート済みキー記憶領域から前記最小キーの次の最小値である次のキーあるいは前記最大キーの次の最大値である次のキーを取り出す次キー取り出しステップと、
    該取り出した次のキーを前記カップルドノードツリーに挿入する次キー挿入ステップと、
    を備え、
    前記マージステップ、前記キー削除ステップ、前記次キー取り出しステップ及び前記次キー挿入ステップを、前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納するまで繰り返すことにより、
    前記複数のソート済みキー記憶領域に格納されたキーを昇順あるいは降順に前記マージ済みキー記憶領域に格納するビット列のマージソート方法、
    を実行することを可能とすることを特徴とするデータ構造。
  13. 請求項12記載のデータ構造を有するデータを記憶したことを特徴とするコンピュータ読み取り可能な記憶媒体。
  14. 昇順あるいは降順にソート済みのビット列からなるキーを格納した複数のソート済みキー記憶領域からそれぞれ最小値あるいは最大値であるキーを取り出してマージ用キー列を生成し、該マージ用キー列のうちの最小値あるいは最大値であるものを該マージ用キー列から取り出してマージ済みキー記憶領域に格納し、該マージ済みキー記憶領域に格納されたキーが取り出された前記ソート済みキー記憶領域から次の最小値あるいは次の最大値である次のキーを取り出して前記マージ用キー列に挿入し、該マージ用キー列のうちの最小値あるいは最大値であるキーを該マージ用キー列から取り出して前記マージ済みキー記憶領域に格納することを前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納するまで繰り返すことにより、前記複数のソート済みキー記憶領域に格納された全てのキーを昇順あるいは降順にソートするビット列のマージソート装置において、
    前記マージ用キー列のキーを、
    ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは、検索対象のビット列からなるインデックスキーと前記キーの格納されていた前記ソート済みキー記憶領域を識別する処理元識別子を含み、前記ツリーの任意のノードを検索開始ノードとして前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索結果である検索結果キーとするように構成されたカップルドノードツリー上のインデックスキーとして保持するマージツリー格納手段と、
    前記ソート済みのキーを格納した複数のソート済みキー記憶領域からそれぞれ最小あるいは最大のキーを取り出して前記カップルドノードツリーを生成して前記マージツリー格納手段に格納するマージツリー生成手段と、
    該カップルドノードツリーを用いて最小値あるいは最大値検索を行い、検索結果の最小値である最小キーあるいは最大値である最大キーと前記処理元識別子を取得し該最小キーあるいは最大キーを前記マージ済みキー記憶領域に格納するとともに、該最小キーあるいは最大キーを前記カップルドノードツリーから削除するマージ手段と、
    前記マージ手段により取得された処理元識別子が示す前記ソート済みキー記憶領域から前記最小キーの次の最小値である次のキーあるいは前記最大キーの次の最大値である次のキーを取り出すとともに、該取り出した次のキーを前記カップルドノードツリーに挿入する次キー挿入手段と、
    を備え、
    前記マージ手段、及び前記次キー挿入手段により、前記複数のソート済みキー記憶領域からすべてのキーを取り出して前記マージ済みキー記憶領域に格納することにより、
    前記複数のソート済みキー記憶領域に格納されたキーを昇順あるいは降順に前記マージ済みキー記憶領域に格納することを特徴とするビット列のマージソート装置。
  15. 請求項14に記載のビット列のマージソート装置において、
    前記マージ手段は、該削除した最小値あるいは最大値を含むノードの直近上位のノードを検索開始ノードとして最小値あるいは最大値検索を行う中間検索部を備えるとともに、
    前記次キー挿入手段は、前記取り出した次のキーが、前記中間検索部が求めた最小値あるいは最大値より小さいかあるいは大きいか判定する次キー大小判定部を備え、
    前記次キー判定部が、前記次のキーが前記最小値あるいは最大値より小さいかあるいは大きいと判定すると、
    前記マージ手段は該次のキーを前記マージ済みキー記憶領域に格納し、
    前記次キー挿入手段は再度前記次キーを取り出し、
    前記次キー判定部が、前記次のキーが前記最小値あるいは最大値より大きいかあるいは小さいと判定すると、
    前記次キー挿入手段は該次のキーを前記カップルドノードツリーに挿入することを特徴とするビット列のマージソート装置。
JP2007314782A 2007-12-05 2007-12-05 ビット列のマージソート装置、方法及びプログラム Expired - Fee Related JP4502223B2 (ja)

Priority Applications (5)

Application Number Priority Date Filing Date Title
JP2007314782A JP4502223B2 (ja) 2007-12-05 2007-12-05 ビット列のマージソート装置、方法及びプログラム
CN200880119130XA CN101884043B (zh) 2007-12-05 2008-10-30 比特序列合并排序装置、方法以及程序
EP08856620A EP2244192A4 (en) 2007-12-05 2008-10-30 BIT CHAIN COMBINATION SORTING DEVICE, METHOD AND PROGRAM
PCT/JP2008/003116 WO2009072233A1 (ja) 2007-12-05 2008-10-30 ビット列のマージソート装置、方法及びプログラム
US12/801,319 US8332410B2 (en) 2007-12-05 2010-06-03 Bit string merge sort device, method, and program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007314782A JP4502223B2 (ja) 2007-12-05 2007-12-05 ビット列のマージソート装置、方法及びプログラム

Publications (3)

Publication Number Publication Date
JP2009140161A JP2009140161A (ja) 2009-06-25
JP2009140161A5 JP2009140161A5 (ja) 2010-02-18
JP4502223B2 true JP4502223B2 (ja) 2010-07-14

Family

ID=40717419

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007314782A Expired - Fee Related JP4502223B2 (ja) 2007-12-05 2007-12-05 ビット列のマージソート装置、方法及びプログラム

Country Status (5)

Country Link
US (1) US8332410B2 (ja)
EP (1) EP2244192A4 (ja)
JP (1) JP4502223B2 (ja)
CN (1) CN101884043B (ja)
WO (1) WO2009072233A1 (ja)

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8495701B2 (en) * 2008-06-05 2013-07-23 International Business Machines Corporation Indexing of security policies
JP4921453B2 (ja) * 2008-12-22 2012-04-25 株式会社エスグランツ ビット列データソート装置、方法及びプログラム
US8515976B2 (en) 2008-12-22 2013-08-20 KOUSOKUYA, Inc. Bit string data sorting apparatus, sorting method, and program
CN101968807A (zh) * 2010-10-15 2011-02-09 北京思在信息技术有限责任公司 一种内容检索的方法及装置
US8527546B2 (en) * 2010-11-25 2013-09-03 International Business Machines Corporation Generating a checkpoint image for use with an in-memory database
US9155320B2 (en) * 2011-07-06 2015-10-13 International Business Machines Corporation Prefix-based leaf node storage for database system
US9904721B1 (en) * 2013-01-25 2018-02-27 Gravic, Inc. Source-side merging of distributed transactions prior to replication
CN104424204B (zh) * 2013-08-21 2017-08-11 华为技术有限公司 索引机制合并方法、搜索方法、装置及设备
US9588978B2 (en) 2013-09-30 2017-03-07 International Business Machines Corporation Merging metadata for database storage regions based on overlapping range values
JP6016215B2 (ja) 2013-12-20 2016-10-26 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation トライ木構造を有するレコード群を高い効率でマージソートする方法、装置及びコンピュータプログラム
WO2015097834A1 (ja) * 2013-12-26 2015-07-02 株式会社東芝 通信制御装置、通信制御方法およびプログラム
US9519687B2 (en) 2014-06-16 2016-12-13 International Business Machines Corporation Minimizing index maintenance costs for database storage regions using hybrid zone maps and indices
CN105468603B (zh) * 2014-08-22 2019-04-02 腾讯科技(深圳)有限公司 数据选择方法及装置
US10042887B2 (en) 2014-12-05 2018-08-07 International Business Machines Corporation Query optimization with zone map selectivity modeling
JP6380952B2 (ja) 2014-12-12 2018-08-29 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation 多数の要素からなる配列をソートする装置、方法およびプログラム
CN109271132B (zh) * 2018-09-19 2023-07-18 中南大学 一种基于机器学习模型的排序方法
US11048756B2 (en) * 2019-01-31 2021-06-29 EMC IP Holding Company LLC Inserting datasets into database systems utilizing hierarchical value lists

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001357070A (ja) * 2000-06-13 2001-12-26 Nec Corp 情報検索方法及び装置
JP2006163565A (ja) * 2004-12-03 2006-06-22 Mitsubishi Electric Corp ソート処理装置及びソート処理方法及びプログラム

Family Cites Families (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5287494A (en) * 1990-10-18 1994-02-15 International Business Machines Corporation Sorting/merging tree for determining a next tournament champion in each cycle by simultaneously comparing records in a path of the previous tournament champion
ATE210856T1 (de) * 1994-06-06 2001-12-15 Nokia Networks Oy Verfahren zum daten speichern und daten wiederfinden und eine speicheranordnung
US5852826A (en) * 1996-01-26 1998-12-22 Sequent Computer Systems, Inc. Parallel merge sort method and apparatus
JP3344559B2 (ja) 1998-06-19 2002-11-11 三菱電機株式会社 マージソート処理装置
US6571244B1 (en) * 1999-10-28 2003-05-27 Microsoft Corporation Run formation in large scale sorting using batched replacement selection
EP1107126A2 (en) * 1999-12-08 2001-06-13 Hewlett-Packard Company, A Delaware Corporation A fast, efficient, adaptive, hybrid tree
US6931424B1 (en) * 2000-03-21 2005-08-16 Alantro Communications, Inc. Storage efficient minimization logic
US6675163B1 (en) * 2000-04-06 2004-01-06 International Business Machines Corporation Full match (FM) search algorithm implementation for a network processor
EP1648060B1 (en) 2004-10-14 2008-07-23 Samsung Electronics Co.,Ltd. Funnel structure vertical external cavity surface-emitting laser (VECSEL)
JP2006187872A (ja) 2004-12-28 2006-07-20 Canon Inc インクジェット記録装置およびインクジェット記録方法
JP2006187827A (ja) 2005-01-05 2006-07-20 Toyo Tire & Rubber Co Ltd 研磨パッド
JP2006293619A (ja) 2005-04-08 2006-10-26 Toshiba Tec Corp コンピュータ装置及びログ出力プログラム
JP2007114915A (ja) 2005-10-19 2007-05-10 Kazumi Sonomoto 自己診断チェックシステムを活用したユーザー側に設置されている通報装置からの情報送出による自動メンテチェックシステム。
JP4271227B2 (ja) 2006-10-30 2009-06-03 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム
JP4271214B2 (ja) * 2006-07-07 2009-06-03 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム
JP4379894B2 (ja) * 2006-11-28 2009-12-09 株式会社エスグランツ カップルドノードツリーの分割/結合方法及びプログラム
JP4402120B2 (ja) 2007-01-24 2010-01-20 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム
JP4514768B2 (ja) 2007-04-19 2010-07-28 株式会社エスグランツ カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム
EP2149845B1 (en) * 2007-04-19 2013-06-12 Kousokuya, Inc. Coupled node tree backup/restore apparatus, backup/restore method, and program

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001357070A (ja) * 2000-06-13 2001-12-26 Nec Corp 情報検索方法及び装置
JP2006163565A (ja) * 2004-12-03 2006-06-22 Mitsubishi Electric Corp ソート処理装置及びソート処理方法及びプログラム

Also Published As

Publication number Publication date
WO2009072233A1 (ja) 2009-06-11
US8332410B2 (en) 2012-12-11
US20100250560A1 (en) 2010-09-30
EP2244192A4 (en) 2011-11-23
CN101884043A (zh) 2010-11-10
JP2009140161A (ja) 2009-06-25
CN101884043B (zh) 2012-07-04
EP2244192A1 (en) 2010-10-27

Similar Documents

Publication Publication Date Title
JP4502223B2 (ja) ビット列のマージソート装置、方法及びプログラム
JP4498409B2 (ja) データベースのインデックスキー更新方法及びプログラム
JP4271227B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4271214B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4527753B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4402120B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4379894B2 (ja) カップルドノードツリーの分割/結合方法及びプログラム
JP4514771B2 (ja) カップルドノードツリーの最長一致/最短一致検索装置、検索方法及びプログラム
JP4514768B2 (ja) カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム
JP5473893B2 (ja) コード列検索装置、検索方法及びプログラム
JP4439013B2 (ja) ビット列検索方法及び検索プログラム
WO2009122651A1 (ja) ビット列検索装置、検索方法及びプログラム
JP4417431B2 (ja) カップルドノードツリーの分割/結合方法及びプログラム
JP4567754B2 (ja) ビット列検索装置、検索方法及びプログラム
JP2011018296A (ja) カップルドノードツリーのインデックスキー挿入/削除方法
EP2149845A1 (en) Coupled node tree save/restore method, longest consistence/shortest consistence retrieval method, bit retrieval method and memory medium
JP5220057B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4813575B2 (ja) ビット列検索装置
WO2009093290A1 (ja) ビット列検索装置、検索方法及びプログラム

Legal Events

Date Code Title Description
A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20091225

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20091225

A871 Explanation of circumstances concerning accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A871

Effective date: 20091225

A975 Report on accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A971005

Effective date: 20100119

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100202

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100325

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20100414

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20100414

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130430

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130430

Year of fee payment: 3

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313111

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130430

Year of fee payment: 3

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130430

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20160430

Year of fee payment: 6

LAPS Cancellation because of no payment of annual fees