JP4514768B2 - カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム - Google Patents

カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム Download PDF

Info

Publication number
JP4514768B2
JP4514768B2 JP2007110019A JP2007110019A JP4514768B2 JP 4514768 B2 JP4514768 B2 JP 4514768B2 JP 2007110019 A JP2007110019 A JP 2007110019A JP 2007110019 A JP2007110019 A JP 2007110019A JP 4514768 B2 JP4514768 B2 JP 4514768B2
Authority
JP
Japan
Prior art keywords
node
tree
coupled
representative
array
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
JP2007110019A
Other languages
English (en)
Other versions
JP2008269197A (ja
JP2008269197A5 (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 JP2007110019A priority Critical patent/JP4514768B2/ja
Priority to PCT/JP2008/000983 priority patent/WO2008132806A1/ja
Priority to EP08738589.4A priority patent/EP2149845B1/en
Priority to CN2008800122779A priority patent/CN101657818B/zh
Priority to TW097114278A priority patent/TW200846955A/zh
Publication of JP2008269197A publication Critical patent/JP2008269197A/ja
Priority to US12/588,531 priority patent/US8386526B2/en
Publication of JP2008269197A5 publication Critical patent/JP2008269197A5/ja
Application granted granted Critical
Publication of JP4514768B2 publication Critical patent/JP4514768B2/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
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/14Error detection or correction of the data by redundancy in operation
    • G06F11/1402Saving, restoring, recovering or retrying
    • G06F11/1446Point-in-time backing up or restoration of persistent data
    • G06F11/1448Management of the data involved in backup or backup restore
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/903Querying
    • G06F16/90335Query processing
    • G06F16/90344Query processing by using string matching techniques
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/14Error detection or correction of the data by redundancy in operation
    • G06F11/1402Saving, restoring, recovering or retrying
    • G06F11/1446Point-in-time backing up or restoration of persistent data
    • G06F11/1458Management of the backup or restore process
    • G06F11/1469Backup restoration techniques

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Quality & Reliability (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Description

本発明は、ビット列を記憶するツリー状のデータ構造を用いてビット列の集合から所望のビット列を検索する技術に関するものであり、特に本出願人が特願2006−187827において提案したカップルドノードツリーの退避/復元方法及びそのプログラムに関するものである。
近年、社会の情報化が進展し、大規模なデータベースが各所で利用されるようになってきている。このような大規模なデータベースからレコードを検索するには、各レコードの記憶されたアドレスと対応づけられたレコード内の項目をインデックスキーとして検索をし、所望のレコードを探し出すことが通例である。また、全文検索における文字列も、文書のインデックスキーと見なすことができる。
そして、それらのインデックスキーはビット列で表現されることから、データベースの検索はビット列の検索に帰着されるということができる。
上記ビット列の検索を高速に行うために、ビット列を記憶するデータ構造を種々に工夫することが従来から行われている。このようなものの一つとして、パトリシアツリーという木構造が知られている。
図16は、上述の従来の検索処理に用いられているパトリシアツリーの一例を示すものである。パトリシアツリーのノードは、インデックスキー、検索キーの検査ビット位置、左右のリンクポインタを含んで構成される。明示はされていないが、ノードにはインデックスキーに対応するレコードにアクセスするための情報が含まれていることは勿論である。
図16の例では、インデックスキー“100010”を保持するノード1750aがルートノードとなっており、その検査ビット位置1730aは0である。ノード1750aの左リンク1740aにはノード1750bが接続され、右リンク1741aにはノード1750fが接続されている。
ノード1750bの保持するインデックスキーは“010011”であり、検査ビット位置1730bは1である。ノード1750bの左リンク1740bにはノード1750cが、右リンク1741bにはノード1750dが接続されている。ノード1750cが保持するインデックスキーは“000111”、検査ビット位置1730cは3である。ノード1750dが保持するインデックスキーは“011010”、検査ビット位置1730dは2である。
ノード1750cから実線で接続された部分はノード1750cの左右のリンクポインタを示すものであり、点線の接続されていない左ポインタ1740cは、その欄が空欄であることを示している。点線の接続された右ポインタ1741cの点線の接続先は、ポインタの示すアドレスを表しており、今の場合ノード1750cを右ポインタ1741cが指定していることを表している。
ノード1750dの右ポインタ1741dはノード1750d自身を指しており、左リンク1740dにはノード1750eが接続されている。ノード1750eの保持するインデックスキーは“010010”、検査ビット位置1730eは5である。ノード1750eの左ポインタ1740eはノード1750bを、右ポインタ1741eはノード1
750eを指している。
また、ノード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を指している。
図16の例では、ルートノード1750aからツリーを降りるにしたがって、各ノードの検査ビット位置が大きくなるように構成されている。
ある検索キーで検索を行うとき、ルートノードから順次各ノードに保持される検索キーの検査ビット位置を検査していき、検査ビット位置のビット値が1であるか0であるか判定を行い、1であれば右リンクをたどり、0であれば左リンクをたどる。そして、リンク先のノードの検査ビット位置がリンク元のノードの検査ビット位置より大きくなければ、すなわち、リンク先が下方でなく上方に戻れば(図16において点線で示されたこの逆戻りのリンクをバックリンクという)、リンク先のノードのインデックスキーと検索キーの比較を行う。比較の結果、等しければ検索成功であり、等しくなければ検索失敗であることが保証されている。
上記のように、パトリシアツリーを用いた検索処理では、必要なビットの検査だけで検索できること、キー全体の比較は1回ですむことなどのメリットがあるが、各ノードからの2つのリンクが必ずあることにより記憶容量が増大することや、バックリンクの存在による判定処理の複雑化、バックリンクにより戻ることで初めてインデックスキーと比較することによる検索処理の遅延及び追加削除等データメンテナンスの困難性などの欠点がある。
これらのパトリシアツリーの欠点を解消しようとするものとして、例えば下記特許文献1に開示された技術がある。下記特許文献1に記載されたパトリシアツリーにおいては、下位の左右のノードは連続した領域に記憶することによりポインタの記憶容量を削減するとともに、次のリンクがバックリンクであるか否かを示すビットを各ノードに設けることにより、バックリンクの判定処理を軽減している。
しかしながら、下記特許文献1に開示されたものにおいても、1つのノードは必ずインデックスキーの領域とポインタの領域を占めること、下位の左右のノードを連続した領域に記憶するようにしてポインタを1つとしたため、例えば図16に示したパトリシアツリーの最下段の部分である左ポインタ1740c、右ポインタ1741h等の部分にもノードと同じ容量の記憶領域を割り当てる必要があるなど、記憶容量の削減効果はあまり大きいものではない。また、バックリンクによる検索処理の遅延の問題や追加削除等の処理が困難であることも改善されていない。
上述の従来の検索手法における問題点を解決するものとして、本出願人は、特願2006−187827において、ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対からなるビット列検索に用いるツリーであって、ルートノードはツリーの始点を表すノードであ
って、該ツリーのノードが1つのときはリーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索を提案した。
上記出願においては、与えられたインデックスキーの集合からカップルドノードツリーを生成する方法と、カップルドノードツリーから単一のインデックスキーを検索する手法等の、カップルドノードツリーを用いた基本的な検索手法が示されている。また、カップルドノードツリーの構成が、インデックスキーの集合により一意に規定されることも説明されている。
また、ビット列の検索には、最小値、最大値を求める、ある範囲の値のものを求める等の各種の検索要求が存在する。そこで、本出願人は、特願2006−293619において、カップルドノードツリーの任意の部分木に含まれるインデックスキーの最大値/最小値を求める手法及びカップルドノードツリーに格納されたインデックスキーを昇順または降順に取り出す手法等を提案した。
インデックスキーの最大値/最小値を求める手法は、代表ノードあるいは代表ノードと対を成すノード(以下、非代表ノードということがある。)のみをリーフノードに至るまでリンクするものであり、カップルドノードツリーに格納されたインデックスキーを昇順または降順に取り出す手法は、後に説明するように、インデックスキーはカップルドノードツリーにおいて、順序性をもって配置されていることを利用したものであり、検索開始ノードを前記順序性に基づいて変更しながら最小値検索または最大値検索を繰り返すものである。
また、上記各出願において、カップルドノードツリーを配列に配置すること、上記提案した各検索処理における検索開始ノードからのツリー上の探索経路のノードの配列番号を探索経路スタックに順次スタックし、探索経路スタックにスタックされた配列番号を用いた処理も開示した。
特開2001−357070号公報
上記各出願で提案されたカップルドノードツリーの記憶領域上の配置については、先に述べたように、対をなすノード同士は隣接した記憶領域に配置されることが規定されているが、ノード対間についてはどのように配置されるかについては、特に制限はなく、アプリケーションあるいは記憶領域を管理する記憶管理システムに任されるものである。
また、そもそも、ブランチノードの有するリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報は、そのカップルドノードツリーが格納されている記憶領域により規定されるものである。
したがって、カップルドノードツリーを他の記憶領域にコピーして利用しようとすると、仮にノード対間の配置の記憶領域上での相対的関係を保存したままコピーしたとしても、ブランチノードに含まれる上記リンク先に関する位置情報の値は変更する必要がある。
また、コピー先の事情で、ノード対間の配置の記憶領域上での相対的関係を保存したままコピーできない場合もあり得るし、相対的関係を保存したままコピーすることが適切とは限らず、その必要性も一般的には認められない。
以上述べたとおりであるので、カップルドノードツリーを例えば主記憶上から外部記憶装置に格納したり、通信回線を経由して別のコンピュータの記憶装置に転送したりするようなコピー処理を行う場合、何らかの変換処理が必要になる。
そこで、その変換処理を容易にするため、カップルドノードツリーの記憶領域上の配置によらない、カップルドノードツリーのノード情報の交換形式を定義し、その交換形式を利用してコピー処理を行うことが考えられる。
例えばカップルドノードツリーに格納されたインデックスキー自体を転送して転送されたインデックスキーに基づいて受信側でカップルドノードツリーの生成処理を行えばコピー処理が完成することは明らかである。しかし、それではカップルドノードツリーの転送というよりはインデックスキーの転送であり、転送先では再度、インデックスキー同士の比較に基づいてブランチノードに含めるべき弁別ビット位置を決定する処理や、新たなノードを挿入すべき場所を決定する処理を含むカップルドノードツリーの生成処理を行う必要がある。したがって、弁別ビット位置やノードの挿入場所の決定などの処理が不要で、より効率的な変換処理を可能とする手法を創案することが望ましい。
そこで本発明の目的は、カップルドノードツリーの記憶領域上の具体的な配置によらない、カップルドノードツリーのノード情報の交換形式にカップルドノードツリーを変換してある記憶領域に保存する退避方法及び該退避方法に対応する上記交換形式からカップルドノードツリーへの逆変換である復元方法であって、効率的な退避方法及び復元方法を提供することである。
本発明の一つの態様によれば、カップルドノードツリーのツリー構造を、ノード情報の列に変換して退避する。つまり、カップルドノードツリーのノードの内容を退避用の記憶領域に順次書き出す。この記憶領域は配列とすることができる。
その際、先に提案したカップルドノードツリーに格納されたインデックスキーを昇順または降順に取り出す手法を応用し、最小値検索または最大値検索を繰り返すときにたどるノード、すなわち検索開始ノードから最小値または最大値に至るリンク経路のノードと次の最小値検索または最大値検索を開始する検索開始ノード、の内容をそのノードをたどる順序で退避用の記憶領域に書き出す。
上述の本発明によるカップルドノードツリーのノードを順次たどることを、ノードを巡回するあるいは経路を巡回すると表記することとし、検索開始ノードを巡回開始ノードと表記することとすると、本発明の退避方法の具体的アルゴリズムは次のとおりである。
インデックスキーを昇順または降順に取り出す手法が、カップルドノードツリーの任意の部分木に対して適用可能であるのと同様に、退避においても、任意の部分木に対して適用可能であることから、まず、退避しようとする部分木のルートノードを、巡回開始ノードとして指定する。
次に、巡回開始ノードから、ノード対のうち代表ノードのみあるいは非代表ノードのみをリンクしてリーフノードに至るまで巡回しながら、巡回開始ノードからリーフノードに至る前記経路上の各ノードについて、当該ノードの位置を示す位置情報を順次スタックに格納するとともに当該ノードの内容を順次別の記憶領域に退避する。
次に、代表ノードあるいは非代表ノードの位置情報が得られるまで前記スタックのポッ
プ動作を繰り返し行って該スタックから該位置情報を読み出し、該位置情報が読み出された前記代表ノードあるいは前記非代表ノードとノード対をなす非代表ノードあるいは代表ノードを、新たな前記巡回開始ノードとして指定して前記ノードの巡回と退避を繰り返す。
以上の処理により、カップルドノードツリーの各ノードは、ノードの巡回順により退避用記憶領域に格納される。その際、ブランチノードにおける代表ノードの位置情報は、カップルドノードツリーを復元する場合には一般的に退避前の記憶領域とは別の領域に復元されることから復元時には意味を持たなくなるので、ブランチノードについてはノード種別と弁別ビット位置だけを退避するようにしてもよい。
本発明の別の態様によれば、退避用の記憶領域に格納されたノード情報(退避情報)からカップルドノードツリーを復元する復元方法が提供される。
この復元は、カップルドノードツリーの記憶領域上の配置によらない、カップルドノードツリーのノード情報の交換形式に変換されたノード情報の列であるデータ構造を、カップルドノードツリーのデータ構造に逆変換するものである。各ノードは退避された順番で復元される。
この復元方法では、前記退避情報から順次ノードを読み出し、読み出した順番でノードを復元する。
復元しようとするカップルドノードツリーのルートノードが、復元される順番にあるときは、該ルートノード用の記憶領域を取得し、読み出したノードの内容を該記憶領域に格納することにより、該ルートノードを復元する。
また、読み出されたノードがブランチノードである間は順次、前記退避情報において該ブランチノードの次の順番にある子ノードを、該子ノードと対になるノード用の記憶領域も取得しながら、該子ノード用の記憶領域を取得して読み出した該子ノードの内容を前記記憶領域に格納することによって復元し、リーフノードが読み出されたら、復元中の前記カップルドノードツリーのツリー構造をルートノードに向かって遡って、取得済みだがノードの内容が格納されていない記憶領域を探索し、該探索により見つかった該記憶領域を、次に復元すべきノードの内容を格納すべき記憶領域として決定することを、この復元方法では繰り返す。
また、本発明の別の態様によれば、上記退避用記憶領域を構成する記憶媒体に替えて伝送媒体を用い、送信側ではカップルドノードツリーを巡回して順番にノードを取り出し、取り出したノードを、伝送媒体を経由して送信し、受信側では受信したノードを復元ノードとしてカップルドノードツリーを受信側の記憶領域に復元する。
さらに本発明の別の態様によれば、上記カップルドノードツリーの退避方法あるいはカップルドノードツリーの復元方法をコンピュータに実行させるプログラムが提供される。
本発明によるカップルドノードツリーの退避方法は、退避の対象であるカップルドノードツリーの部分木を構成するノードを、深さ優先探索順に退避する方法である。そのため、元のカップルドノードツリーが記憶領域上に具体的にどのように配置されているかということに依存しない順序(深さ優先探索順)でノードが退避される。このような退避/復元処理を介すことにより、カップルドノードツリーが再利用しやすくなる。
また、上記の退避方法及び復元方法は、ノードに含まれる弁別ビット位置やインデックスキーの値に基づく判断等の複雑な処理を含まない、簡潔な方法である。すなわち、本発
明によれば、カップルドノードツリーの構造の特徴を利用することにより、簡単な処理で、効率よくカップルドノードツリーの退避/復元処理を実施することができる。
最初に、本出願人により先の上記出願において提案された、本発明の前提となるカップルドノードツリーについて、カップルドノードツリーを配列に格納する例を説明する。ブランチノードが保持するリンク先の位置を示すデータとして、記憶装置のアドレス情報とすることもできるが、ブランチノードあるいはリーフノードのうち占有する領域の記憶容量の大きい方を格納可能な配列要素からなる配列を用いることにより、ノードの位置を配列番号で表すことができ、位置情報の情報量を削減することができる。
図1は、配列に格納されたカップルドノードツリーの構成例を説明する図である。
図1を参照すると、ノード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”が格納されている。パトリシアツリーについて先に述べたと同様に、リーフノードにインデックスキーと対応するレコードにアクセスする情報が含まれることは当然であるが、表記は省略している。
なお、代表ノードをノード[0]で表し、それと対になるノードをノード[1]で表すことがある。また、ある配列番号の配列要素に格納されたノードを、その配列番号のノードということがあり、ノードの格納された配列要素の配列番号を、ノードの配列番号ということもある。
配列番号30及び31の配列要素に格納されたノード122とノード123からなるノード対121の内容は省略されている。
ノード[0]112、ノード[1]113、ノード122、及びノード123の格納された配列要素にそれぞれ付された0あるいは1は、検索キーで検索を行う場合にノード対のどちらのノードにリンクするかを示すものである。前段のブランチノードの弁別ビット位置にある検索キーのビット値である0か1を代表ノード番号に加えた配列番号のノードにリンクする。
したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置のビット値を加えることにより、リンク先のノードが格納された配列要素の配列番号を求めることができる。
なお、上記の例では代表ノード番号をノード対の配置された配列番号のうち小さい方を採用しているが、大きいほうを採用することも可能であることは明らかである。
図2は、カップルドノードツリーのツリー構造を概念的に示す図である。図示の6ビットのインデックスキーは、図16に例示されたパトリシアツリーのものと同じである。
符号210aで示すのがルートノードである。図示の例では、ルートノード210aは配列番号220に配置されたノード対201aの代表ノードとしている。
ツリー構造としては、ルートノード210aの下にノート対201bが、その下層にノード対201cとノード対201fが配置され、ノード対201fの下層にはノード対201hとノード対201gが配置されている。ノード対201cの下にはノード対201dが、さらにその下にはノード対201eが配置されている。
各ノードの前に付された0あるいは1の符号は、図1において説明した配列要素の前に付された符号と同じである。検索キーの弁別ビット位置のビット値に応じてツリーをたどり、検索対象のリーフノードを見つけることになる。
図示された例では、ルートノード210aのノード種別260aは0でブランチノードであることを示し、弁別ビット位置230aは0を示している。代表ノード番号は220aであり、それはノード対201bの代表ノード210bの格納された配列要素の配列番号である。
ノード対201bはノード210bと211bで構成され、それらのノード種別260b、261bはともに0であり、ブランチノードであることを示している。ノード210bの弁別ビット位置230bには1が格納され、リンク先の代表ノード番号にはノード対201cの代表ノード210cの格納された配列要素の配列番号220bが格納されている。
ノード210cのノード種別260cには1が格納されているので、このノードはリーフノードであり、したがって、インデックスキー250cを含んでいる。インデックスキー250cには“000111”が格納されている。一方ノード211cのノード種別261cは0、弁別ビット位置231cは2であり、代表ノード番号にはノード対201dの代表ノード210dの格納された配列要素の配列番号221cが格納されている。
ノード210dのノード種別260dは0、弁別ビット位置230dは5であり、代表ノード番号にはノード対201eの代表ノード210eの格納された配列要素の配列番号220dが格納されている。ノード210dと対になるノード211dのノード種別261dは1であり、インデックスキー251dには“011010”が格納されている。
ノード対201eのノード210e、211eのノード種別260e、261eはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250e、251eにはインデックスキーとして“010010”と“010011”が格納されている。
ノード対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”が格納されている。
また同じくノード対201hの代表ノードであるノード[0]210hとそれと対をなすノード[1]211hのノード種別260h、261hはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250h、251hには“101011”と“101100”が格納されている。
以下、上述のツリーからインデックスキー“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”であって一致している。このようにしてカップルドノードツリーを用いた検索が行われる。
次に、図2を参照してカップルドノードツリーの構成の意味について説明する。
カップルドノードツリーの構成はインデックスキーの集合により規定される。図2の例で、ルートノード210aの弁別ビット位置が0であるのは、図2に例示されたインデックスキーに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と検索中にたどるノードが格納された配列要素の配列番号を記憶する探索経路スタック310を有するデータ格納装置308は、主記憶装置305または外部記憶装置306で実現することができ、あるいは通信装置307を介して接続された遠方に配置された装置を用いることも可能である。図1の配列100は、配列309の一例である。
図3の例示では、主記憶装置305、外部記憶装置306及び通信装置307が一本のバス304によりデータ処理装置301に接続されているが、接続方法はこれに限るものではない。また、主記憶装置305をデータ処理装置301内のものとすることもできるし、探索経路スタック310を中央処理装置302内のハードウェアとして実現することも可能である。あるいは、配列309は外部記憶装置306に、探索経路スタック310を主記憶装置305に持つなど、使用可能なハードウェア環境、インデックスキー集合の
大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
また、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶装置が用いられることは当然である。
次に、上述の出願において、本出願人により提案されたカップルドノードツリーを用いた基本的な検索処理、及びカップルドノードツリーに含まれるインデックスキーの最大値/最小値を求める処理等の応用処理の一部について、本発明を理解するために必要な範囲で紹介する。
図4は、本出願人による出願である上記特願2006−293619で提案されたビット列検索の基本動作を示したフローチャートである。
まず、ステップS401で、検索開始ノードの配列番号を取得する。取得された配列番号に対応する配列要素は、カップルドノードツリーを構成する任意のノードを格納したものである。検索開始ノードの指定は、後に説明する各種応用検索において行われる。
次に、ステップS402で、探索経路スタック310に取得された配列番号を格納し、ステップS403で、その配列番号に対応する配列要素を参照すべきノードとして読み出す。そして、ステップS404で、読み出したノードから、ノード種別を取り出し、ステップS405で、ノード種別がブランチノードであるか否かを判定する。
ステップS405の判定において、読み出したノードがブランチノードである場合は、ステップS406に進み、ノードから弁別ビット位置についての情報を取り出し、更に、ステップS407で、取り出した弁別ビット位置に対応するビット値を検索キーから取り出す。そして、ステップS408で、ノードから代表ノード番号を取り出して、ステップS409で、検索キーから取り出したビット値と代表ノード番号とを加算し、新たな配列番号として、ステップS402に戻る。
以降、ステップS405の判定においてリーフノードと判定されてステップS410に進むまで、ステップS402からステップS409までの処理を繰り返す。ステップS410で、リーフノードからインデックスキーを取り出して、処理を終了する。
図5は、本出願人による出願である上記特願2006−293619で提案されたカップルドノードツリー(部分木を含む)に格納されたインデックスキーの最小値を求める処理を示したフローチャートである。先に述べたようなインデックスキーのツリー上の配置から、インデックスキーの最小値を求める処理は検索開始ノードからノード[0]をリーフノードに至るまでツリー上でたどることに相当する。
まず、ステップS501の検索開始ノードの配列番号の取得からステップS505のノード種別の判定までは、それぞれ上述の図4のステップS401からステップS405の処理と同様である。
ステップS505のノード種別の判定においてノード種別がブランチノードと判定されると、ステップS506に進み、ノードから配列の代表ノード番号を取り出し、ステップS507で、取り出した代表ノード番号に値「0」を加算してその結果を新たな配列番号とし、ステップS502に戻る。以降、ステップS505においてそのノードがリーフノードと判定されるまでステップS502からステップS507までの処理を繰り返し、ステップS508で、リーフノードからインデックスキーを取り出し、処理を終了する。
上記の図5に示す処理においては、ノード[0]をたどるため、代表ノード番号に一律「0」を加算している。すなわち、図5の処理によれば、リンク先のノードは、ノード対
のうち必ずノード[0]とし、より小さい値のインデックスキーが格納されているノードのほうに分岐している。これにより、ツリー構造が先に述べたように順列構成であるカップルドノードツリーの最小のインデックスキーを取り出すことができる。
図6は、本出願人による出願である上記特願2006−293619で提案されたカップルドノードツリー(部分木を含む)に格納されたインデックスキーの最大値を求める処理を示したフローチャートである。
インデックスキーの最大値を求める処理は、ツリー上のノードのうちノード[1]について、リーフノードに至るまで順次たどっていくことに相当する。以下、任意の部分木の最大のインデックスキーを求める処理について、上記最小のインデックスキーを求める処理と比較しながら、異なる点を中心に説明する。
図6に示す一連の処理のうち、ステップS601からステップS606及びステップS608については、図5のステップ501からステップS506及びステップS508にそれぞれ対応しており、同様の処理が実行される。図5の最小値を求める処理と異なる点は、ステップS607において、代表ノード番号に、値「1」を加算する点である。これにより、代表ノード番号が表すノード対のうち、ノード[1]に常にリンクすることとなり、リーフノードに至るまで順次ステップS602からステップS607の処理を繰り返すことにより、インデックスキーの最大値を得ることができる。
図4から図6に示すように、検索キーと一致するインデックスキーを検索する基本動作やインデックスキーの最小値/最大値の検索処理を実行する際には、探索経路スタック310に参照した配列の配列番号が順次格納されていく。
なお、上述の図5及び図6を参照したインデックスキーの最小値/最大値の検索処理では、カップルドノードツリーは配列に記憶されたものとして説明したが、カップルドノードツリーが配列に記憶されることは必須ではなく、ノード対を構成する2つのノードのうちの代表ノードのみあるいは代表ノードと隣接した記憶領域に配置されたノードのみをリンクしてリーフノードに至ることによりインデックスキーの最小値/最大値の検索が可能であることは明らかである。
図7は、本出願人による出願である上記特願2006−293619で提案されたカップルドノードツリーに格納されたインデックスキーを昇順に取り出す処理を示したフローチャートである。インデックスキーを昇順に取り出す処理は、ノード対をなすノードのうちノード[0]側及びツリーの深さを優先させてルートノードから順次リーフノードをたどり、各リーフノードからインデックスキーを取り出していくことに相当する。
まず、ステップS701で、検索開始ノードの配列番号にルートノードの配列番号を設定し、ステップS702で、上記図5を参照して説明した最小のインデックスキーを求める処理を実行して、カップルドノードツリーに含まれるインデックスキーの中で最小のインデックスキーを取得する。そして、ステップS703で、取得したインデックスキーを取り出し、ステップS704に進む。
ステップS704で、探索経路スタック310を参照し、スタックポインタがルートノードの配列番号を指しているか否かを判定する。ポインタが指す配列番号がルートノード以外である場合は、ステップS705に進む。そして、ステップS705で、探索経路スタック310からポインタの指す配列番号を取り出してから、ポインタを1減らす。上記ステップS705で探索経路スタック310からポインタの指す配列番号を取り出してからポインタを1減らすことは、スタックのポップ動作により実行される。以下の各実施態
様におけるスタックからの配列番号の読み出しにおいても同様である。
ステップS706で、ステップS705で取り出した配列番号から、その配列番号のノードがノード対のどちらの配列要素に格納されているかのノード位置を得る。例えばノード[0]については偶数番号の配列の配列要素に格納する等により、配列番号からノード位置を求めることができる。そして、ステップS707で、ステップS706で得たノード位置がノード[1]側であるか否かを判定する。ステップS707においてノード[1]側と判定された場合は、ステップS704に戻り、ポインタの指す配列番号のノードがノード[0]あるいはルートノードとなるまで、ステップS704からステップS707までの処理を繰り返す。
ステップS707においてノード[0]側と判定されると、ステップS708に進み、配列番号に1を加算し、そのノードと対をなすノード[1]の配列番号を得る。そして、ステップS709で、検索開始ノードの配列番号にステップS708で得たノード[1]の配列番号を設定し、ステップS710で、検索開始ノードをルートノードとする部分木の最小のインデックスキーを求める処理を実行する。ステップS710の処理は、ステップS702と同様であり、図5に示す最小値検索処理が用いられる。
ステップS710で最小のインデックスキーを求めると、ステップS703に戻り、求めたインデックスキーを取り出し、以降ステップS704においてスタックポインタがルートノードの配列番号を指していると判定されるまで、同様の処理を繰り返す。
このように、探索経路スタック310のポインタが指す配列番号を参照し、探索経路スタック310に格納されている配列番号のノード[0]と対をなすノード[1]について、そのノードを検索開始ノードとしてそのノード配下で最小のインデックスキーを求める。ステップS702で最小値が求められた段階においては、探索経路スタック310のポインタは、カップルドノードツリーの最小のインデックスキーを含むノードの配列番号を指している。続いて探索経路スタック310のポップ動作を行い、取り出した配列番号のノードのうちノード[1]を検索開始ノードとして該検索開始ノードをルートノードとする部分木のインデックスキーの最小値を求める処理を行い、探索経路スタック310のポップ動作の結果カップルドノードツリーのルートノードの配列番号が取り出されるまでポップ動作と最小値検索処理を繰り返す。
探索経路スタック310には、先にステップS702においてルートノード配下のノードについて最小値を求める処理を行っていることにより、リンク経路についての配列番号が順次格納されている。このため、探索経路スタック310のポインタを1減らして新たにポインタが指す配列番号のノードのうち、ノード[0]について、そのノードと対をなすノード[1]を求め、ノード[1]のノード配下について順次最小値検索の処理を行っていくと、インデックスキーは昇順に取り出されることとなる。
図8は、カップルドノードツリーに格納されたインデックスキーを降順に取り出す処理を示したフローチャートである。インデックスキーを降順に取り出す処理は、ノード対をなすノードのうちノード[1]及びツリーの深さを優先させてルートノードから順次リーフノードをたどっていくことに相当する。ここでは、図7のインデックスキーを昇順に取り出す処理と比較して、異なる点を中心に説明する。
上記のインデックスキーを昇順に取り出す処理においては、図7のステップS702及びステップS710において検索開始ノード配下の最小値をとるインデックスキーを求めていたのに対し、図8のステップS802及びステップS810において求めるのは、検索開始ノード配下の最大値をとるインデックスキーである。
また、図7においてはステップS703で所望のインデックスキーを取り出した後、探索経路スタック310に格納されている配列番号のうち、ノード[0]の配列番号を求め、そのノードと対をなすノード[1]を検索開始ノードとして設定して、最小値検索処理を行っている。これに対して、図8の降順取り出し処理においては、ステップS803において所望のインデックスキーを取り出した後、探索経路スタック310に格納されている配列番号のうち、ノード[1]の配列番号を求め、そのノードと対をなすノード[0]を検索開始ノードとして設定して、最大値検索処理を行っている。
次に、図9A〜図9C、図9Dにより本出願人による出願である上記特願2006−187827で提案されたカップルドノードツリーにおけるノード挿入処理を説明する。図9A〜図9Cが通常の挿入処理を説明するものであり、図9Dはルートノードの挿入処理を説明するものである。ルートノードの挿入処理と通常の挿入処理により、カップルドノードツリーが生成されることから、ノード挿入処理の説明はカップルドノードツリーの生成処理の説明でもある。
図9Aは挿入処理の前段である検索処理の処理フローを示す図であり、図4に示した検索処理において挿入キーを検索キーとしたものに相当する。ステップS901は図4のステップS401で検索開始ノードをルートノードとしたものに相当し、ステップS902〜ステップS910の処理は図4のステップS402〜ステップS410に完全に対応するので説明は省略する。
図9AのステップS911において挿入キーとインデックスキーを比較し、等しければ挿入キーは既にカップルドノードツリーに存在するのであるから、挿入は失敗となり、処理を終了する。等しくなければ次の処理、図9BのステップS912以下の処理に進む。
図9Bは、挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。
ステップS912において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。
ステップS913に進み、挿入キーとステップS910で得たインデックスキーの大小を比較し、挿入キーが大きいときは値1を小さいときは値0のブール値を得る。
ステップS914に進み、ステップS912で得た代表ノードの配列番号にステップS913で得たブール値を加算した配列番号を得る。
ステップS915に進み、ステップS912で得た代表ノードの配列番号にステップS913で得たブール値の論理否定値を加算した配列番号を得る。
ステップS914で得た配列番号は、挿入キーをインデックスキーとして持つリーフノードが格納される配列要素の配列番号であり、ステップS915で得た配列番号は、そのリーフノードと対を成すノードが格納される配列要素のものである。
つまり、前段の検索処理で得られたリーフノードに格納されたインデックスキーと挿入キーの大小により、挿入されるノード対のうちどちらのノードに挿入キーを保持するリーフノードが格納されるかが決定される。
例えば図2のカップルドノードツリーに“011011”を挿入する場合、検索結果のインデックスキーはノード211dに格納された“011010”になる。挿入キー“011011”とノード211dに格納されたインデックスキー“011010”の大小比較によりブール値が求められ、今の例では挿入キーが大きいのでブール値1が得られ、挿
入されるノード対の代表ノード番号に1を加えた配列要素に挿入キーを保持するリーフノードが格納される。一方、インデックスキー“011010”は、大小比較で得られたブール値を論理反転した値を代表ノード番号に加算した配列番号の配列要素に格納される。
その際、インデックスキー“011010”と挿入キー“011011”とは5ビット目で異なることから、ノード211dは、弁別ビット位置を5とし、代表ノード番号を挿入されたノード対の代表ノードの配列番号とするブランチノードとなる。
また図2のカップルドノードツリーに“011001”を挿入しようとする場合も、検索結果のインデックスキーはノード211dに格納された“011010”になる。この場合には挿入キーが小さいのでブール値0が得られ、挿入されるノード対の代表ノード番号に0を加えた配列要素に挿入キーを保持するリーフノードが格納される。そして、インデックスキー“011010”と挿入キー“011001”とは4ビット目で異なることから、ノード211dは、弁別ビット位置を4とし、代表ノード番号を挿入されたノード対の代表ノードの配列番号とするブランチノードとなる。次に図9CのステップS916以下の処理に進む。
図9Cは図9Bで準備された配列要素にノードを格納するとともにその挿入位置を求め、既存のノードの内容を変更して挿入処理を完成させる処理フローを示す図である。
ステップS916〜ステップS923までの処理は、挿入するノード対のカップルドノードツリー上の位置を求める処理であり、ステップS924以下の処理は各ノードにデータを設定して挿入処理を完成させる処理である。
ステップS916で、挿入キーとステップS910で得たインデックスキーのビット列比較を例えば排他的論理和で行い、差分ビット列を得る。
ステップS917に進み、ステップS916で得た差分ビット列から、上位0ビット目から見た最初の不一致ビットのビット位置を得る。この処理は、例えばプライオリティエンコーダを有するCPUではそこに差分ビット列を入力し、不一致のビット位置を得ることができる。また、ソフト的にプライオリティエンコーダと同等の処理を行い最初の不一致ビットのビット位置を得ることも可能である。
次にステップS918に進み、探索経路スタックのスタックポインタがルートノードの配列番号を指しているか判定する。指していればステップS924に移行し、指していなければステップS919に進む。
ステップS919において、探索経路スタックのスタックポインタを1つ戻してそこにスタックされている配列番号を取り出す。
ステップS920に進み、ステップS919で取り出した配列番号の配列要素を配列からノードとして読み出す。
ステップS921に進み、ステップS920で読み出したノードから、弁別ビット位置を取り出す。
次にステップS922に進み、ステップS921で取り出した弁別ビット位置がステップS917で得たビット位置より上位の位置関係か判定する。ここで上位の位置関係とは、ビット列のより左側の位置、すなわちビット位置の値が小さい位置であることとする。
ステップS922の判定結果が否定であれば、ステップS918に戻り、ステップS918での判定が肯定になるかステップS922での判定が肯定になるまで繰り返す。ステップS922での判定が肯定になると、ステップS923で探索経路スタックのスタックポインタを1つ進め、ステップS924以下の処理に移行する。
上記ステップS916〜ステップS923で説明した処理は、挿入するノード対の挿入位置を決定するために、挿入するインデックスキーと検索により取得されたインデックスキーの間でビット列比較を行い、ビット列比較で異なるビット値となる先頭の(最上位の)ビット位置と探索経路スタックに格納されているブランチノードの弁別ビット位置との相対的位置関係を調べ、弁別ビット位置が上位となるブランチノードの次のブランチノードのリンク先を挿入するノード対の挿入位置とするものである。
例えば図2のカップルドノードツリーに“111000”を挿入するとき、検索結果のインデックスキーはノード210hに格納された“101011”になる。挿入キー“111000”とノード210hに格納されたインデックスキー“101011”のビット列比較により異なるビット値となる最上位のビット位置1が得られる。得られたビット位置1と探索経路スタックに積まれた配列番号の配列要素に格納されたブランチノードの弁別ビット位置との位置関係をチェックしながら、弁別ビット位置が上位になるまで順次探索経路スタックを逆にたどると、ルートノード210aに至る。そこで探索経路スタックのポインタを1つ進め、ノード211bの配列番号を得る。挿入キー“111000”はノード211bのリンク先に挿入される。
また、探索経路スタックを逆にたどりルートノードに至っても、ルートノードの弁別ビット位置が、先に求めたビット列比較で異なるビット値となる最上位のビット位置より上位のビット位置でないということは、そのカップルドノードツリーのインデックスキーの上位ビットで、ルートノードの弁別ビット位置より上位のビットの値は全て等しい場合である。そして、挿入するインデックスキーにおいて、初めてルートノードの弁別ビット位置より上位のビットの値に異なるビット値のものがあるということである。したがって、挿入するノード対はルートノードの直接のリンク先となり、ルートノードの弁別ビット位置は、既存のインデックスキーと異なる値である挿入キーの最上位ビットの位置に変わる。
次に、ステップS924以下の各ノードにデータを設定して挿入処理を完成させる処理について説明する。
ステップS924では探索経路スタックからスタックポインタの指す配列番号を取り出す。
ステップS925において、ステップS914で得た配列番号の指す配列要素のノード種別に1(リーフノード)を、インデックスキーに挿入キーを書き込む。
ステップS926に進み、配列からステップS924で得た配列番号の配列要素を読み出す。
次にステップS927において、ステップS915で得た配列番号の配列要素にステップS926で読み出した内容を書き込む。
最後にステップS928において、ステップS924で得た配列番号の指す配列要素のノード種別に0(ブランチノード)を、弁別ビット位置にステップS917で得たビット位置を、代表ノード番号にステップS912で得た配列番号を書き込み、処理を終了する。
上述の図2のカップルドノードツリーに“111000”を挿入する例では、取得された空ノード対のノード[0]にノード211bの内容を書き込み(ステップS927)、ノード[1]を挿入キー“111000”を保持するリーフノードとする(ステップS925)。そして、ノード211bの弁別ビット位置にビット列比較により異なるビット値となる最上位のビット位置1を格納し、代表ノード番号には取得されたノード対の代表ノ
ードが格納される配列要素の配列番号が格納される(ステップS928)。
図9Dは、本出願人による出願である上記特願2006−187827で提案されたルートノードの挿入処理を含むインデックスキーを追加する場合のノード挿入処理全体を説明する処理フロー図である。
ステップS101において、取得することを求められたカップルドノードツリーのルートノードの配列番号が登録済みであるか判定される。登録済みであれば、図9A〜図9Cを用いて説明した通常の挿入処理が行われる。
ステップS101での判定が登録済みでなければ、まったく新しいカップルドノードツリーの登録、生成が始まることになる。
まず、ステップS102において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。次にステップS103において、ステップS102で得た配列番号に0を加えた配列番号を求める。(実際には、ステップS102で取得した配列番号に等しい。)。さらにステップS104において、ステップS103で得た配列番号の配列要素に、挿入するルートノードのノード種別に1(リーフノード)とインデックスキーに挿入キーを書き込み、ステップS105で、ステップS102で取得したルートノードの配列番号を登録して処理を終了する。
先にも述べたように、インデックスキーの集合があるとき、そこから順次インデックスキーを取り出し、図9D及び図9A〜図9Cの処理を繰り返すことにより、インデックスキーの集合に対応した本発明のカップルドノードツリーを構築することができることは明らかである。
以上、カップルドノードツリーの退避/復元処理の前提となる技術を説明したが、必要とあれば、上述の特許出願の明細書及び図面の記載を参照されたい。
次に、本発明によるカップルドノードツリーの退避/復元処理について説明する。
図10Aと図10Bは、本発明の一実施形態によるカップルドノードツリーを退避する退避処理を示したフローチャートである。本実施形態では、配列309に配置されたカップルドノードツリーのノード対をなすノードのうち、ノード[0]側及びツリーの深さを優先させてルートノードからカップルドノードツリーの各ノードをたどり、その深さ優先探索順に、たどったノードをノード退避配列401に退避する。ノード退避配列401は、本実施形態において退避用の記憶領域として用いられる配列である。深さ優先探索順にノードをたどる点は、図7を参照して説明したインデックスキーを昇順に取り出す処理と共通であるから、図10Aは図7と類似したものである。
まず、ステップS1001で、巡回開始ノードの配列番号としてルートノードの配列番号を設定する。つまり、巡回開始ノードの配列番号を設定すべきワークエリアを用意し、そのワークエリアにルートノードの配列番号を設定する。
次に、ステップS1002で、後述の図10Bの処理を実行して、ノード[0]のみをたどって巡回開始ノードからリーフノードへ至るまでの経路を巡回し、巡回したノードを順次ノード退避配列401に格納する。ステップS1001とS1002は、図7のステップS701とS702に類似の処理である。
ステップS1002の実行後、ステップS1003に進む。ステップS1003からステップS1009は、図7のステップS704からステップS710に類似の処理である。
ステップS1003で、探索経路スタック310を参照し、スタックポインタがルートノードの配列309上の配列番号を指しているか否かを判定する。ポインタが指す配列309上の配列番号がルートノード以外である場合は、ステップS1004に進む。そして、ステップS1004で、探索経路スタック310からポインタの指す配列309上の配列番号を取り出してから、ポインタを1減らす。すなわち、ステップS1004ではポップ動作が行われる。
ステップS1005で、ステップS1004で取り出した配列309の配列番号から、その配列番号のノードがノード対のどちらの配列要素に格納されているかのノード位置を得る。そして、ステップS1006で、ステップS1005で得たノード位置がノード[1]側であるか否かを判定する。ステップS1006においてノード[1]側と判定された場合は、ステップS1003に戻り、ポインタの指す配列番号のノードがノード[0]あるいはルートノードとなるまで、ステップS1003からステップS1006までの処理を繰り返す。
ステップS1006においてノード[0]側と判定されると、ステップS1007に進み、配列番号に1を加算し、そのノード[0]と対をなすノード[1]の配列309上の配列番号を得る。そして、ステップS1008で、巡回開始ノードの配列番号としてステップS1007で得たノード[1]の配列番号を設定し、ステップS1009で、ステップS1002と同様に図10Bの処理を実行し、ノード[0]のみをたどって巡回開始ノードからリーフノードへ至るまでの経路を巡回し、巡回したノードを順次ノード退避配列401に格納する。その後はステップS1003に戻り、以降ステップS1003においてスタックポインタがルートノードの配列309上の配列番号を指していると判定されるまで、同様の処理を繰り返す。
なお、図10AのステップS1002とステップS1009は同じ処理であるから、ステップS1008からステップS1002に戻るように図示することも可能である。しかし、後の説明の都合上、ステップS1003からステップS1009までを連続する番号で参照することが便利なため、図10Aのように示した。
次に、図10Bを参照して、ノードを巡回しながらノードをノード退避配列401に格納する処理について説明する。図10Bの処理は、図10AのステップS1002またはS1009から呼び出される。また、図10Bの処理は、図5を参照して説明したインデックスキーの最小値を求める処理の応用例である。
まず、ステップS1011で、図10AのステップS1001またはステップS1008で設定された巡回開始ノードの配列番号を取得する。この配列番号は配列309の配列番号である。次に、取得された配列番号をステップS1012で探索経路スタック310に格納し、ステップS1013で、その配列番号に対応する配列要素を参照すべきノードとして配列309から読み出す。そして、ステップS1014で、読み出したノードをノード退避配列401に格納する。なお、ノード退避配列401は、最初の配列要素から順に、間を空けずに詰めて使われる。
続いてステップS1015で、読み出したノードからノード種別を取り出し、ステップS1016で、ノード種別がブランチノードであるか否かを判定する。
ステップS1016の判定において、読み出したノードがブランチノードである場合は、ステップS1017に進んでノードから代表ノード番号を取り出し、ステップS1018で取り出した代表ノード番号に値「0」を加算してその結果を新たな配列番号とし、ステップS1012に戻る。以降、ステップS1016においてそのノードがリーフノード
と判定されるまでステップS1012からステップS1018までの処理を繰り返す。ステップS1016においてノード種別がリーフノードと判定されると、処理を終了する。
図10Bの処理は、図5のインデックスキーの最小値を求める処理との共通点から明らかなとおり、巡回開始ノードをルートノードとする部分木において、巡回開始ノードから最小のインデックスキーを含むリーフノードまでの経路を巡回する処理である。そして、巡回開始ノードからリーフノードまでの経路上のノードは、経路の両端である巡回開始ノードとリーフノードを含めて、順次、探索経路スタック310に配列番号が格納され、ノード退避配列401にそのノードの内容が格納される。
インデックスキーを昇順に取り出す図7の処理が、最小のインデックスキーを検索する図5の処理を含むのと同様に、ノード[0]側及びツリーの深さを優先させた探索順にノードをノード退避配列401に退避する図10Aの処理が、巡回開始ノードから巡回開始ノードをルートノードとする部分木で最小のインデックスキーを含むリーフノードまでのノードをたどる図10Bの処理を含む。
図11と図12は、図10Aと図10Bのフローチャートにより示した本実施形態に係る退避処理を、図2に例示したカップルドノードツリーを退避する例を用いて説明する図である。以下では、図11と図12の双方を参照して、図2のカップルドノードツリーが図10Aと図10Bの退避処理により退避される流れを説明する。
図11には、処理の流れを表す矢印とともに図2と同じカップルドノードツリーを示し、ノード退避配列401の最終的な内容も示した。図12は、図11の処理の各段階における探索経路スタック310の状態とノード退避配列401に退避された内容を示す図である。
ノード退避配列401の各配列要素には、その配列要素に退避されるノードの符号と対応する、アポストロフィ付きの符号を付した。例えば、ノード210aの内容を退避した配列要素には「210a’」なる符号を付した。また、説明の便宜上、ノード退避配列401の配列要素を、0から始まる配列番号により参照する。この配列番号は、図11と図12のノード退避配列401の左側に示してある。なお、図12の探索経路スタック310に格納されている配列309の配列番号は、図11に示すカップルドノードツリーと対応付けられている。
退避処理は、図11のステップS1101の矢印に示すように、ルートノード210aを巡回開始ノードとして、ルートノード210aの配下で最小のインデックスキーを含むリーフノード210cへの経路を巡回することから始まる。これは図10AのステップS1001とステップS1002に対応する。よって、ステップS1002から呼び出された図10BのステップS1011からステップS1018の実行結果として、図12(a)に示すとおり、探索経路スタック310にはルートノード210aの配列番号220から順に、配列番号220a、220bが格納され、ノード退避配列401の配列番号0、1、2の配列要素には、ルートノード210a、ノード210b、ノード210cの内容がそれぞれ退避される。
続いて、ステップS1003からステップS1008が実行される。それにより、ステップS1004で配列番号220bが探索経路スタック310から得られ、配列番号220bのノード210cはノード[0]なので、ステップS1006からステップS1007に進んで配列番号(220b+1)が得られ、これがステップS1008で巡回開始ノードの配列番号に指定される。
そして、図11のステップS1102に示すとおり、配列番号(220b+1)のノード211cを巡回開始ノードとして、ノード211cの配下で最小のインデックスキーを含むリーフノード210eへの経路を巡回する。これは図10AのステップS1009から図10Bの処理を呼び出して実行することに対応する。よって、図10BのステップS1011からステップS1018の実行結果として、図12(b)に示すとおり、探索経路スタック310には配列番号(220b+1)、221c、220dが順に格納され、ノード退避配列401の配列番号3、4、5の配列要素には、ノード211c、ノード210d、ノード210eの内容がそれぞれ退避される。なお、図12(b)のノード退避配列401のうち、ステップS1101で退避済みのノードに対応する配列番号0から2の部分は細線で囲い、ステップS1102で退避されたノードに対応する配列番号3から5の部分は太線で囲んである。以下のステップでも同様にノード退避配列401を表現する。
続いて、ステップS1003からステップS1008が実行される。それにより、ステップS1004で配列番号220dが探索経路スタック310から得られ、配列番号220dのノード210eはノード[0]なので、ステップS1006からステップS1007に進んで配列番号(220d+1)が得られ、これがステップS1008で巡回開始ノードの配列番号に指定される。
そして、図11のステップS1103に示すとおり、配列番号(220d+1)のノード211eを巡回開始ノードとして、図10AのステップS1009から図10Bの処理が呼び出されて、ステップS1011からステップS1016が実行される。ノード211eはリーフノードなので、図12(c)に示すとおり、この処理の結果として、配列番号(220d+1)のみが探索経路スタック310に格納され、ノード退避配列401には配列番号6の配列要素としてノード211eの内容のみが退避される。
続いて、ステップS1003からステップS1008が次のように実行される。すなわち、ステップS1004で配列番号(220d+1)が探索経路スタック310から得られ、配列番号(220d+1)のノード211eはノード[1]なので、ステップS1006からステップS1003に戻る。そして再びステップS1004のポップ動作が行われ、配列番号221cが探索経路スタック310から得られる。配列番号221cのノード210dはノード[0]なので、ステップS1006からステップS1007に進んで配列番号(221c+1)が得られ、これがステップS1008で巡回開始ノードの配列番号に指定される。
そして、図11のステップS1104に示すとおり、配列番号(221c+1)のノード211dを巡回開始ノードとして、図10AのステップS1009から図10Bの処理が呼び出されて、ステップS1011からステップS1016が実行される。ノード211dもリーフノードなので、図12(d)に示すとおり、この処理の結果として、配列番号(221c+1)のみが探索経路スタック310に格納され、ノード退避配列401には配列番号7の配列要素としてノード211dの内容のみが退避される。
続いて、ステップS1003からステップS1008が次のように実行される。すなわち、ステップS1004で配列番号(221c+1)が探索経路スタック310から得られる。配列番号(221c+1)のノード211dはノード[1]なのでステップS1006からステップS1003に戻り、再びステップS1004のポップ動作が行われ、配列番号(220b+1)が探索経路スタック310から得られる。配列番号(220b+1)のノード211cもノード[1]なので再度ステップS1003に戻り、ステップS1004のポップ動作によって、配列番号220aが探索経路スタック310から得られる。配列番号220aのノード210bはノード[0]なので、ステップS1006から
ステップS1007に進んで配列番号(220a+1)が得られ、これがステップS1008で巡回開始ノードの配列番号に指定される。
そして、図11のステップS1105に示すとおり、配列番号(220a+1)のノード211bを巡回開始ノードとして、図10AのステップS1009から図10Bの処理を呼び出してステップS1011からステップS1018を実行し、ノード211bの配下で最小のインデックスキーを含むリーフノード210gへの経路を巡回する。その結果、図12(e)に示すとおり、探索経路スタック310には配列番号(220a+1)、221b、220fが順に格納され、ノード退避配列401の配列番号8、9、10の配列要素には、ノード211b、ノード210f、ノード210gの内容がそれぞれ退避される。
続いて、ステップS1003からステップS1008が実行される。それにより、ステップS1004で配列番号220fが探索経路スタック310から得られ、配列番号220fのノード210gはノード[0]なので、ステップS1006からステップS1007に進んで配列番号(220f+1)が得られ、これがステップS1008で巡回開始ノードの配列番号に指定される。
そして、図11のステップS1106に示すとおり、配列番号(220f+1)のノード211gを巡回開始ノードとして、図10AのステップS1009から図10Bの処理が呼び出されてステップS1011からステップS1016が実行される。ノード211gはリーフノードなので、図12(f)に示すとおり、この処理の結果として、配列番号(220f+1)のみが探索経路スタック310に格納され、ノード退避配列401には配列番号11の配列要素としてノード211gの内容のみが退避される。
続いて、ステップS1003からステップS1008が次のように実行される。すなわち、ステップS1004で配列番号(220f+1)が探索経路スタック310から得られ、配列番号(220f+1)のノード211gはノード[1]なので、ステップS1006からステップS1003に戻る。そして、ステップS1004で配列番号221bが探索経路スタック310から得られる。配列番号221bのノード210fはノード[0]なので、ステップS1006からステップS1007に進んで配列番号(221b+1)が得られ、これがステップS1008で巡回開始ノードの配列番号に指定される。
そして、図11のステップS1107に示すとおり、配列番号(221b+1)のノード211fを巡回開始ノードとして、図10AのステップS1009から図10Bの処理を呼び出してステップS1011からステップS1018を実行し、ノード211fの配下で最小のインデックスキーを含むリーフノード210hへの経路を巡回する。その結果、図12(g)に示すとおり、探索経路スタック310には配列番号(221b+1)、221fが順に格納され、ノード退避配列401の配列番号12、13の配列要素には、ノード211f、ノード210hの内容がそれぞれ退避される。
続いて、ステップS1003からステップS1008が実行される。それにより、ステップS1004で配列番号221fが探索経路スタック310から得られ、配列番号221fのノード210hはノード[0]なので、ステップS1006からステップS1007に進んで配列番号(221f+1)が得られ、これがステップS1008で巡回開始ノードの配列番号に指定される。
そして、図11のステップS1108に示すとおり、配列番号(221f+1)のノード211hを巡回開始ノードとして、図10AのステップS1009から図10Bの処理が呼び出されてステップS1011からステップS1016が実行される。ノード211
hはリーフノードなので、図12(h)に示すとおり、この処理の結果として、配列番号(221f+1)のみが探索経路スタック310に格納され、ノード退避配列401には配列番号14の配列要素としてノード211hの内容のみが退避される。
その後、ステップS1003からステップS1008が次のように実行される。すなわち、ステップS1004で配列番号(221f+1)が探索経路スタック310から得られ、配列番号(221f+1)のノード211hはノード[1]なので、ステップS1006からステップS1003に戻る。そして、ステップS1004で配列番号(221b+1)が探索経路スタック310から得られ、配列番号(221b+1)のノード211fもノード[1]なのでステップS1006から再度ステップS1003に戻る。そして、ステップS1004で配列番号(220a+1)が得られ、配列番号(220a+1)のノード211bもノード[1]なのでステップS1006から再度ステップS1003に戻り、ここで、スタックポインタはルートノード210aの配列番号220を指しているため、退避処理が終了する。
以上の処理により、図11に示したカップルドノードツリーを構成するノードはすべてノード退避配列401に退避される。また、ノードが退避される順序は、図11のノード退避配列401と処理順を表す矢印とを比較すれば明らかなとおり、カップルドノードツリーのノード[0]側と深さ方向を優先して探索した順である。
また、周知のように、ツリー構造のノードを深さ優先探索順に並べると、任意の部分木を構成するノードは連続した順序で並ぶ。例えば、ノード211cをルートノードとする部分木は、配列番号3から7の連続する領域に退避されている。
図13は、上記で説明した退避処理により得られたノード退避配列401からカップルドノードツリーを復元する復元処理を示したフローチャートであり、復元後のカップルドノードツリーが配列に記憶される場合のフローチャートである。復元後のカップルドノードツリーを記憶する配列は、例えば図3の配列309と同様の配列である。以下では、復元後のカップルドノードツリーを記憶する配列を「309’」なる符号で参照するが、配列309’は図示していない。
実施形態によって、配列309と配列309’は同じ配列でもよく、同じ記憶装置上の異なる配列でもよく、異なる記憶装置上の異なる配列でもよい。また、以下の復元処理の説明では、探索経路スタック310を使うものとして説明しているが、元のカップルドノードツリーの検索等に使う探索経路スタック310とは異なる探索経路スタックを用いて復元処理を行ってもよいことは当然である。
図13では、まず、ステップS1301で、復元対象のカップルドノードツリーのノードを格納するための配列309’から、空きのノード対の代表ノード番号を得て、ステップS1302で、その代表ノード番号に値「0」を加え、ノード対のうちノード[0]の配列番号を得る。そしてステップS1303で、ルートノードの配列番号としてステップS1302で得た配列番号を登録する。ステップS1301からステップS1303の処理により、復元すべきカップルドノードツリーのルートノードの領域が確保され、ルートノードが登録される。
続いてステップS1304で、探索経路スタック310に配列番号を格納する。図13に示すとおり、ステップS1304は、ステップS1303、ステップS1313、またはステップS1317の直後に実行される。ステップS1304で探索経路スタック310に格納される配列番号は、ステップS1304の直前のステップがステップS1303の場合はステップS1302で得られた配列309’の配列番号であり、直前のステップ
がステップS1313の場合はステップS1313で得られた配列309’の配列番号であり、直前のステップがステップS1317の場合はステップS1317で得られた配列309’の配列番号である。
次にステップS1305で、ノード退避配列401の未処理のノードのうちの先頭のノードの内容を取り出し、ステップS1306で、ステップS1305で取り出したノードの内容を、ステップS1304で探索経路スタック310に格納した配列番号が指す、配列309’の配列要素に書き込む。
ステップS1304からステップS1306の処理により、1つのノードが復元される。正確には、リーフノードはステップS1304からステップS1306の処理により完全に復元され、ブランチノードは、後続のステップS1310からステップS1312により復元されるリンク先の代表ノード番号以外の情報(ノード種別及び弁別ビット位置)が復元される。
次にステップS1307に進んで、ノード退避配列401からすべてのノードを取り出したか否かを判断する。すべてのノードを取り出したら復元処理は終了し、未処理のノードがノード退避配列401に残っていれば、ステップS1308に進む。
ステップS1308では、ステップS1305で取り出したノードから、ノード種別を取り出し、ステップS1309でそのノード種別(ステップS1306で復元したノードの種別)がブランチノードか否かを判定する。ノード種別がブランチノードならステップS1310に進み、リーフノードならステップS1314に進む。
ステップS1310ではステップS1301と同様に、配列309’から空きのノード対の代表ノード番号を得る。そしてステップS1311では探索経路スタック310からスタックポインタが指す配列番号を取り出す。なお、ステップS1311の処理はポップ動作ではなく、スタックポインタは変更されない。
続いてステップS1312で、ステップS1311で取り出した配列番号の、配列309’の配列要素の代表ノード番号に、ステップS1310で得た代表ノード番号を書き込む。これにより、ステップS1306で一部が復元されたブランチノードが完全に復元された状態となる。
そして、ステップS1313では、次に復元すべきノードに対応する、配列309’の配列番号を得る。つまり、ステップS1310で得た代表ノード番号に値0を加えて、ノード[0]の配列309’上の配列番号を得る。ステップS1313の実行後、処理はステップS1304に戻る。
一方、ステップS1309でリーフノードと判定された場合は、ステップS1314で、探索経路スタック310からスタックポインタが指す配列309’の配列要素の配列番号を取り出し、スタックポインタを1つ減らす。
続いて、ステップS1315で、ステップS1314で取り出した配列番号から、その配列番号のノードがノード対のどちらの配列要素に格納されているかのノード位置を得る。
そして、ステップS1316で、ステップS1315で得たノード位置がノード[0]側であるか否かを判定する。ステップS1316でノード[1]側と判定された場合はステップS1314に戻り、スタックポインタの指す配列番号のノードがノード[0]とな
るまで、ステップS1314からステップS1316までの処理を繰り返す。
ステップS1316においてノード[0]側と判定されると、ステップS1317に進み、ステップS1314で取り出した配列番号に1を加えて、そのノードと対をなすノード[1]の配列番号を得る。そしてステップS1304に進む。
ステップS1314からステップS1316は、リーフノードを復元した後、次に復元すべきノードを決定するために探索経路スタック310を遡るステップである。
以上のようにして、ステップS1307でノード退避配列401から全てのノードを取り出したと判定されるまで、同様の処理が繰り返される。
つまり、図13の処理は、ノード退避配列401に含まれるノードを先頭から順番に1つずつ復元することの繰り返しである。そして、1つのノードの復元は、そのノードを復元すべき位置である復元先位置としての配列309’の配列番号を決定し、その配列番号を探索経路スタック310に格納し、ノード退避配列401から未処理の先頭にあるノードの内容を読み出し、読み出したノードの内容を配列番号の指す配列要素に書き込むことにより行われる。
図14と図15は、図11と図12のノード退避配列401から、図2の元のカップルドノードツリーを、不図示の配列309’上に復元する例を用いて、図13のフローチャートにより示した本実施形態に係る復元処理を説明する図である。以下では、図14と図15の双方を参照して、図2のカップルドノードツリーが図13の復元処理により配列309’上に復元される流れを説明する。
図14には、処理の流れを表す矢印とともに復元後のカップルドノードツリーの構造を示し、ノード退避配列401の内容も示した。図14のノード退避配列401は、左側に示したステップの番号を除いて、図11に示したものと同一である。
図14に示した復元後のカップルドノードツリーは、図2と図11に例示された元のカップルドノードツリーと同じ構造であり、各リーフノードが含むインデックスキーの値も図2及び図11と同様である。しかし、元のカップルドノードツリーと復元後のカップルドノードツリーでは、ノードの配列番号の値が一般には異なる。
そこで、図14では、元のノード及び代表ノード番号を表す符号にアポストロフィをつけた符号を用いる。例えば、元のノード210bを復元したノードには「210b’」なる符号を付した。また、元のノード210bの配列309上の配列番号220aと、復元されたノード210b’の配列309’上の配列番号220a’は、値が異なるかもしれないが、互いに対応するので、「220a」と「220a’」という対応する符号を用いた。なお、図15の探索経路スタック310に格納されている配列309’の配列番号は、図14に示すカップルドノードツリーと対応付けられている。
図15は、図14の処理の各段階における探索経路スタック310の状態を示すとともに、ノード退避配列401のうちその段階で処理される部分を強調して示した図である。
復元処理は、図14のステップS1401の矢印に示すように、図13のステップS1301からステップS1303によりルートノード210a’を復元することから始まる。つまり、配列309’から空きのノード対の代表ノード番号220’が得られ、(220’+0)=220’なる配列番号が得られ、この配列番号が、ルートノード210a’の配列番号として登録される。ただし、この時点ではルートノード210a’の代表ノード番号の値は未定であり、ルートノード210a’の復元は不完全である。
続いて、ステップS1304からステップS1309とステップS1310を経てステップS1313に至る一連の処理が、ステップS1309の判定がブランチノードである間、繰り返される。
すなわち、ステップS1304で探索経路スタック310に配列番号220’がプッシュされ、ステップS1305でノード退避配列401の配列番号0のノードが取り出される。このノードは、図11と図12で説明したとおり、ルートノードである。ステップS1306では、配列309’の配列番号220’の配列要素に、ステップS1305で取り出したノードの内容が書き込まれる。これにより、ルートノード210a’は、ノード種別にはブランチノードを示す0が、弁別ビット位置には0が、代表ノード番号にはノード退避配列401から取得した220aなる配列番号が、それぞれ格納された状態となる。
続いて、ステップS1307からステップS1309が実行され、ルートノード210a’がブランチノードであることからステップS1310に進み、配列309’から空きのノード対の代表ノード番号220a’が取得される。そしてステップS1311で探索経路スタック310から配列番号220’が取得され、ステップS1312で、配列番号220’が指すルートノード210a’の代表ノード番号に、ステップS1310で取得した代表ノード番号220a’が書き込まれる。その結果、ルートノード210a’の復元が完了し、ルートノード210a’は図14に示す状態となる。
次のステップS1313では、(220a’+0)=220a’なる配列番号が取得され、これが次のステップS1304で探索経路スタック310にプッシュされる。そして、ステップS1305でノード退避配列401の配列番号1のノードが取り出され、ステップS1306で、配列309’の配列番号220a’の配列要素に、ノード種別0、弁別ビット位置1、代表ノード番号220bなる取得したノードの内容が書き込まれる。
上記と同様にしてステップS1307からステップS1312が実行されてノード210b’が復元された後、ステップS1313からステップS1304に戻って配列番号220b’が探索経路スタック310にプッシュされる。そしてステップS1305でノード退避配列401の配列番号2のノードが取り出される。ステップS1306で、配列309’の配列番号220b’の配列要素には、ノード種別としてリーフノードを示す1が、インデックスキーとして“000111”が、それぞれ格納され、ノード210c’が図14のとおり復元される。続いて、ステップS1307からステップS1309が実行され、ノード210c’がリーフノードと判定される。
図15(a)はこの段階、すなわち図14のステップS1401を実行した段階の探索経路スタック310の状態を示す。また、この段階までにノード退避配列401のうち配列番号0から2に相当する3つのノードが復元されたので、これら3つのノードに対応するノード退避配列401の配列要素が、図15(a)では太線で囲われており、配列番号0から2の配列要素が復元済みであるため、後続の図15(b)〜(h)では省略されている。
続いて、S1314からステップS1317が実行される。それにより、ステップS1314で探索経路スタック310から配列番号220b’がポップされ、配列番号220b’のノード210c’がノード[0]なので、ステップS1316からステップS1317に進み、配列番号(220b’+1)が得られる。
そして、図14のステップS1402に示すように、ステップS1304からステップS1309とステップS1310を経てステップS1313に至る一連の処理が、ステッ
プS1309の判定がブランチノードである間、繰り返される。この過程では、下記のようにしてノード211c’とノード210d’とノード210e’が復元される。
ステップS1402を構成する最初のステップであるステップS1304では、探索経路スタック310に配列番号(220b’+1)がプッシュされる。ステップS1305でノード退避配列401の配列番号3のノードが取り出され、上記と同様にしてステップS1306からステップS1312によりノード211c’が復元される。そしてステップS1313からステップS1304に戻って配列番号221c’が探索経路スタック310にプッシュされる。
続いて、ステップS1305でノード退避配列401の配列番号4のノードが取り出され、ステップS1306からステップS1312により、上記と同様にしてノード210d’が復元される。そしてステップS1313からステップS1304に戻って配列番号220d’が探索経路スタック310にプッシュされる。
そして、ステップS1305でノード退避配列401の配列番号5のノードが取り出され、ステップS1306でこのノードの内容が配列309’の配列番号220d’の配列要素に書き込まれて、ノード210e’が復元される。続いて、ステップS1307からステップS1309が実行され、ノード210e’がリーフノードと判定される。
図15(b)はこの段階、すなわちステップS1402を実行した段階の探索経路スタック310を表す。また、図15(a)の状態から図15(b)の状態になる過程でノード退避配列401のうち配列番号3から5に相当する3つのノードが復元されたので、これらを太線で囲って示した。
続いて、ステップS1314からステップS1317が実行される。それにより、ステップS1314で探索経路スタック310から配列番号220d’がポップされ、配列番号220d’のノード210e’はノード[0]なので、ステップS1316からステップS1317に進み、配列番号(220d’+1)が得られる。
次に、図14のステップS1403に示すように、ステップS1304からステップS1309が実行される。つまり、ステップS1304で探索経路スタック310に配列番号(220d’+1)がプッシュされ、ステップS1305でノード退避配列401の配列番号6のノードが取り出され、ステップS1306でノード211e’が復元される。その後、ステップS1309でノード211e’がリーフノードだと判定される。
図15(c)はこの段階、つまりステップS1403が実行された段階の探索経路スタック310の状態を示す。また、図15(b)の状態から図15(c)の状態になる過程で、ノード退避配列401のうち配列番号6に相当するノードが復元された。
続いて、ステップS1314からステップS1317が次のように実行される。まず、ステップS1314で探索経路スタック310から配列番号(220d’+1)がポップされる。配列番号(220d’+1)のノード211e’はノード[1]なので、ステップS1316からステップS1314に戻り、探索経路スタック310から配列番号221c’がポップされる。配列番号221c’のノード210d’はノード[0]なので、ステップS1316からステップS1317に進み、配列番号(221c’+1)が得られる。
次に、図14のステップS1404に示すように、ステップS1304からステップS1309が実行される。それにより、ステップS1304で探索経路スタック310に配
列番号(221c’+1)がプッシュされ、ステップS1305でノード退避配列401の配列番号7のノードが取り出され、ステップS1306でノード211d’が復元される。その後、ステップS1309でノード211d’がリーフノードだと判定される。
図15(d)はこの段階、つまりステップS1404が実行された段階の探索経路スタック310の状態を示す。また、図15(c)の状態から図15(d)の状態になる過程で、ノード退避配列401のうち配列番号7に相当するノードが復元された。
続いて、ステップS1314からステップS1317が実行される。すなわち、ノード[0]であるノード210b’の配列番号220a’が得られるまで、ステップS1314からステップS1316が繰り返されてから、ステップS1317が実行される。この過程で、探索経路スタック310から、配列番号(221c’+1)と(220b’+1)と220a’が順次ポップされる。その後ステップS1317で配列番号(220a’+1)が得られる。
次に、図14のステップS1405に示すように、ステップS1304からステップS1309とステップS1310を経てステップS1313に至る一連の処理が、ステップS1309の判定がブランチノードである間、繰り返される。この過程では、下記のようにしてノード211b’とノード210f’とノード210g’が復元される。
ステップS1405を構成する最初のステップであるステップS1304では、探索経路スタック310に配列番号(220a’+1)がプッシュされる。ステップS1305でノード退避配列401の配列番号8のノードが取り出され、その内容がステップS1306で配列309’の配列番号(220a’+1)の配列要素に書き込まれる。
そしてステップS1307からステップS1309が実行され、書き込まれたのがブランチノードの内容であることからステップS1310に進み、配列309’から空きのノード対の代表ノード番号221b’が取得される。そしてステップS1311で探索経路スタック310から配列番号(220a’+1)が取得され、ステップS1312で、配列番号(220a’+1)のノード211b’の代表ノード番号に、ステップS1310で取得した代表ノード番号221b’が書き込まれる。その結果、ノード211b’の復元が完了し、ノード211b’は図14に示す状態となる。
次のステップS1313では、(221b’+0)=221b’なる配列番号が取得され、これがステップS1304で探索経路スタック310にプッシュされる。そして、ステップS1305でノード退避配列401の配列番号9のノードが取り出され、その内容がステップS1306で配列309’の配列番号221b’の配列要素に書き込まれる。
そしてステップS1307からステップS1309が実行され、書き込まれたのがブランチノードの内容であることからステップS1310に進み、配列309’から空きのノード対の代表ノード番号220f’が取得される。そしてステップS1311で探索経路スタック310から配列番号221b’が取得され、ステップS1312で、配列番号221b’のノード210f’の代表ノード番号に、ステップS1310で取得した代表ノード番号220f’が書き込まれる。その結果、ノード210f’の復元が完了し、ノード210f’は図14に示す状態となる。
次のステップS1313では、(220f’+0)=220f’なる配列番号が取得され、これがステップS1304で探索経路スタック310にプッシュされる。そして、ステップS1305でノード退避配列401の配列番号10のノードが取り出され、その内容がステップS1306で配列309’の配列番号220f’の配列要素に書き込まれて
、ノード210g’が復元される。その後、ステップS1307からステップS1309が実行され、ノード210g’がリーフノードだと判定される。
図15(e)はこの段階、すなわちステップS1405が実行された段階の探索経路スタック310を示す。また、図15(d)の状態から図15(e)の状態になる過程でノード退避配列401のうち配列番号8から10に相当する3つのノードが復元された。
続いて、テップS1314からステップS1317が実行される。すなわち、ステップS1314で探索経路スタック310から配列番号220f’がポップされ、配列番号220f’のノード210g’がノード[0]なので、ステップS1316からステップS1317に進み、配列番号(220f’+1)が得られる。
次に、図14のステップS1406に示すように、ステップS1304からステップS1309が実行される。それにより、ステップS1304で探索経路スタック310に配列番号(220f’+1)がプッシュされ、ステップS1305でノード退避配列401の配列番号11のノードが取り出され、ステップS1306でノード211g’が復元される。その後、ステップS1309でノード211g’がリーフノードだと判定される。
図15(f)はこの段階、つまりステップS1406が実行された段階の探索経路スタック310の状態を示す。また、図15(e)の状態から図15(f)の状態になる過程で、ノード退避配列401のうち配列番号11に相当するノードが復元された。
続いて、ステップS1314からステップS1317が次のように実行される。まず、ステップS1314で探索経路スタック310から配列番号(220f’+1)がポップされる。配列番号(220f’+1)のノード211g’はノード[1]なので、ステップS1316からステップS1314に戻り、探索経路スタック310から配列番号221b’がポップされる。配列番号221b’のノード210f’はノード[0]なので、ステップS1316からステップS1317に進み、配列番号(221b’+1)が得られる。
次に、図14のステップS1407に示すように、ステップS1304からステップS1309とステップS1310を経てステップS1313に至る一連の処理が、ステップS1309の判定がブランチノードである間、繰り返される。この過程では、下記のようにしてノード211f’とノード210h’が復元される。
ステップS1407を構成する最初のステップであるステップS1304では、探索経路スタック310に配列番号(221b’+1)がプッシュされる。ステップS1305でノード退避配列401の配列番号12のノードが取り出され、その内容がステップS1306で配列309’の配列番号(221b’+1)の配列要素に書き込まれる。
そしてステップS1307からステップS1309が実行され、書き込まれたのがブランチノードの内容であることからステップS1310に進み、配列309’から空きのノード対の代表ノード番号221f’が取得される。そしてステップS1311で探索経路スタック310から配列番号(221b’+1)が取得され、ステップS1312で、配列番号(221b’+1)のノード211f’の代表ノード番号に、ステップS1310で取得した代表ノード番号221f’が書き込まれる。その結果ノード211f’の復元が完了し、ノード211f’は図14に示す状態となる。
次のステップS1313では、(221f’+0)=221f’なる配列番号が取得され、これがステップS1304で探索経路スタック310にプッシュされる。ステップS
1305でノード退避配列401の配列番号13のノードが取り出され、ステップS1306によりノード210h’が復元される。その後、ステップS1309でノード210h’がリーフノードだと判定される。
図15(g)はこの段階、すなわちステップS1407が実行された段階の探索経路スタック310を示す。また、図15(f)の状態から図15(g)の状態になる過程でノード退避配列401のうち配列番号12と13に相当する2つのノードが復元された。
続いて、ステップS1314からステップS1317が実行される。すなわち、ステップS1314で探索経路スタック310から配列番号221f’がポップされ、配列番号221f’のノード210h’はノード[0]なので、ステップS1316からステップS1317に進み、配列番号(221f’+1)が得られる。
次に、図14のステップS1408に示すように、ステップS1304からステップS1307が実行されて復元処理が完了する。すなわち、ステップS1304で探索経路スタック310に配列番号(221f’+1)がプッシュされ、ステップS1305でノード退避配列401の配列番号14のノードが取り出され、ステップS1306によりノード211h’が復元される。そして、ステップS1307でノード退避配列401からすべてのノードを取り出したと判定され、復元処理が終了する。
図15(h)はこの段階、すなわちステップS1408が実行された段階の探索経路スタック310を示す。また、図15(g)の状態から図15(h)の状態になる過程でノード退避配列401のうち配列番号14に相当するノードが復元された。
図15には(a)〜(h)の8つの段階が示されているが、上記のとおり、これら8つの段階はいずれも、0個以上のブランチノードを復元してから1個のリーフノードを復元する一連のステップに対応している。復元処理がこのような一連のステップの繰り返しであることは、ノードが深さ優先探索順で退避されたことの帰結である。
深さ優先探索順にノードが退避されたノード退避配列401からは、退避された順序のとおりにノードを復元するだけでよい。つまり、ノード退避配列401から配列要素を順次読み出し、ブランチノードが続く間は順次、子ノードを、復元すべき子ノードと対になるノードの記憶領域も確保しながら復元し、リーフノードが読み出されたら、ツリー構造をルートノードに向かって遡って、復元後のノードを格納するための記憶領域が確保済みだがまだ復元されていないノードを見つけ、その見つけたノードを次に復元すべきノードとして決定する、という処理を繰り返すだけで、容易にカップルドノードツリーを復元することができる。上記のとおり、復元処理では探索経路スタック310を利用するが、ノードに含まれるインデックスキーや弁別ビット位置に基づく判断などは必要ない。
このように単純かつ効率的にカップルドノードツリーを復元することができる点は、本発明による復元方法の利点である。上記のとおり、カップルドノードツリーは、インデックスキーの集合により一意に構造が規定される。よって、インデックスキーの集合さえ退避されていればカップルドノードツリーを復元すること自体は可能である。しかしながら、インデックスキーの集合のみからカップルドノードツリーを復元する方法は、弁別ビット位置を調べるなどの処理が必要である。一方、本発明による復元方法は、インデックスキーや弁別ビット位置に基づく判断などは必要なく、その分処理時間が短くて済む。
また、本発明による復元方法は、退避情報に退避された順にノードを復元するだけでよいので、退避情報がネットワークを介して送信され、送信先のコンピュータがカップルドノードツリーを受信して復元する場合に時間短縮の効果がある。なぜなら、受信が完了す
る前に、受信した部分から順次ノードを復元することによって、受信と復元を同時に行うことができるためである。
以上、本発明を実施するための最良の形態について詳細に説明したが、本発明の実施の形態はそれに限ることなく種々の変形が可能である。
上記で説明したフローチャートは、処理の一例であり、処理順を入れ替えたり並行に処理したりすることが可能なステップが存在することは自明である。例えば、図13のステップS1304は、ステップS1305の直後あるいはステップS1306の直後に移動させてもよく、ステップS1305及びステップS1306からなる処理と並行して実行してもよい。
上記の例では、ビット値0に対応してリンクされるノード[0]を代表ノードとし、ビット値1に対応してリンクされるノード[1]を代表ノードと対になる非代表ノードとしていた。しかし、ノード[1]を代表ノードとし、ノード[0]を非代表ノードとしてもよい。
また、例えば、元のカップルドノードツリーにおいてノード[0]が代表ノードでありノード[1]が非代表ノードである場合に、復元したカップルドノードツリーにおいては、ノード[0]が代表ノードでありノード[1]が非代表ノードであってもよく、ノード[0]が非代表ノードでありノード[1]が代表ノードであってもよい。
なお、ルートノードを代表ノードの位置に配置するか非代表ノードの位置に配置するかが任意であることは、図2などに関する説明から明らかであろう。
また、上記の例では、ビット値0を優先させた深さ優先探索順にノードを退避し、復元しているが、ビット値1を優先させた深さ優先探索順にノードを退避し、復元することも当然可能である。
ビット値0を優先させた深さ優先探索順は、カップルドノードツリーに格納されたインデックスキーを昇順に取り出す図7の処理順と同じである。よって、上記実施形態における退避処理は、図7と類似した図10Aのフローチャートにより示され、図10Aから呼び出される図10Bの処理は、図7から呼び出される図5の最小値を求める処理と類似している。
同様に、ビット値1を優先させた深さ優先探索順は、カップルドノードツリーに格納されたインデックスキーを降順に取り出す図8の処理順と同じである。よって、この場合は、図8と図6に示したのと同様の処理順でノードを巡回するように、図10Aと図10Bの処理をそれぞれ変更すればよい。また、それにあわせて図13の処理を変更すればよい。
上記の実施形態と同様に、ノード[0]を代表ノードとするという仮定のもとで説明すると、具体的には次のような変更が必要である。まず、図10AのステップS1006を、ノード[1]のときにステップS1007に進むようにする。ステップS1007は、配列番号から1を減じてノード[0]の配列番号を得るように変更し、ステップS1008は、巡回開始ノードの配列番号にノード[0]の配列番号を設定するように変更する。そして、図10BのステップS1018は、値0のかわりに値1を加えるように変更する。
そのようにビット値1を優先させた深さ優先探索順で退避されたカップルドノードツリーを復元するには、図13を次のように変更すればよい。まず、ステップS1313を、代表ノード番号に値1を加えてノード[1]の配列番号を得るように変更し、ステップS
1316を、ノード[1]のときにステップS1317に進むように変更し、ステップS1317を、配列番号から1を減じてノード[0]の配列番号を得るように変更する。
換言すれば、上記の変形例は次のようにまとめられる。退避処理において代表ノード側を優先してたどると、ノード[0]が代表ノードのときは図10Aと同様にインデックスキーの昇順に、ノード[1]が代表ノードのときはインデックスキーの降順に、カップルドノードツリーを退避することになる。一方、退避処理において非代表ノード側を優先してたどると、ノード[0]が代表ノードのときはインデックスキーの降順に、ノード[1]が代表ノードのときはインデックスキーの昇順に、カップルドノードツリーを退避することになる。復元処理は、ノード[0]とノード[1]のいずれが代表ノードであるか、退避はインデックスキーの昇順と降順のいずれの順序でなされたか、ということに基づいて、実施形態に応じて適宜変形される。
図10Aから図15の例では、退避されたノードの内容の退避情報における並び順を表すのに便利なので、説明の便宜上、退避情報がノード退避配列401に格納される例を用いて説明した。しかし退避情報は、ノードが退避された順序にノードの情報が並んだ情報であればよく、ノード退避配列401のような配列でなくともよい。
退避情報は、実施形態によって、外部記憶装置306上にファイルとして格納されてもよく、主記憶装置305上にノード退避配列401のような配列あるいはその他の形式で格納されてもよく、通信装置307とネットワークを介して他のコンピュータに送信されてもよい。上記の実施形態では説明の便宜上、ノード退避配列401にノードを格納する、あるいはノード退避配列401にノードを退避する、などと表現したが、ネットワークを介してノードの内容を送信することによってノードの内容を退避するといった形態を除外する意図ではない。
また、ブランチノードに含まれる代表ノード番号は、上記の退避処理では退避されているが、退避しなくてもよい。その理由は、復元処理で、元のカップルドノードツリーで使われていた配列309の配列番号とは無関係に、復元後のカップルドノードツリーを格納すべき配列309’上の空きのノード対の代表ノードの配列番号が取得されるためである。つまり、退避される前の元のブランチノードに含まれる代表ノード番号は、復元後にまったく使われないので、退避する必要がない。
ブランチノードの代表ノード番号を退避しない場合は、その分、退避情報のデータ量が少なくなる。つまり、退避情報をファイルとして格納する場合はファイルの大きさが小さくて済み、ネットワークを介して退避情報を送信する場合はネットワークのトラフィックが少なくて済む。また、図13の復元処理には、元の配列309の配列番号と無関係な配列309’の配列番号を使うので、ある環境で退避したカップルドノードツリーを別の環境で復元することが容易だという利点もある。
なお、図10Aには既存のカップルドノードツリーの全体を退避する処理を示したが、部分木のみを退避することも可能である。そのためには、図10AのステップS1001とステップS1003におけるルートノードを、カップルドノードツリー全体のルートノードではなく、退避すべき部分木のルートノードとすればよい。それにより得られたノード退避配列に対して図13の復元処理を実行すれば、退避した部分木が復元される。
また、図13には、ノード退避配列401に退避された全ノードからなるカップルドノードツリーを復元する処理を示したが、そのうちの部分木のみを復元することも、図13の処理の一部を変更することにより可能である。
上記のとおり、ノード退避配列401では、任意の部分木について、その部分木を構成する全ノードが連続する配列番号の配列要素に退避されている。したがって、復元したい部分木のルートノードがノード退避配列401のどの位置にあるかが予め指定されれば、その位置を読み取り開始位置としてノード退避配列401の内容を読み取ることで、退避されたカップルドノードツリーの部分木のみを復元することも可能である。
ただし、そのためには図13のステップS1303とステップS1304の間にステップS1318を追加し、ステップS1315とステップS1316の間にステップS1319を追加する。追加されたステップS1318では、復元したい部分木のルートノードがノード退避配列401のどの位置にあるかを指定して、その位置より前のノード退避配列401の内容をスキップする。また、追加されたステップS1319では、スタックポインタがルートノードの配列番号を指しているか否かを判定する。そして、スタックポインタがルートノードの配列番号を指していれば復元処理を終了し、そうでなければステップS1316に進む。なお、ステップS1303及び追加されるステップS1319におけるルートノードは、退避された元のカップルドノードツリー全体のルートノードではなく、復元対象の部分木のルートノードを意味する。
このように処理の一部を変更することにより、例えば、図14のノード退避配列401の配列番号3のノードを復元すべき部分木のルートノードとして指定し、ノード退避配列401のうち配列番号3から7の部分のみを利用して、ノード211c’をルートノードとする部分木をノード退避配列401から復元することが可能である。
以上のように、本発明によれば、部分木のみを退避したり、ノード退避配列から必要な部分木のみを復元したりすることも、簡単に効率よく行うことが可能である。よって、本発明によれば、カップルドノードツリーの大きさが大きくなったとしても、必要な部分木のみを処理することができ、カップルドノードツリーの取り扱いを容易なものとすることができる。
なお、本発明の退避方法または復元方法を実行する装置が、カップルドノードツリーを格納する記憶手段と、図10A〜図10Bまたは図13に示した処理をコンピュータに実行させるプログラムによりコンピュータ上に構築可能なことは明らかである。したがって、上記プログラム、及びプログラムを記憶したコンピュータ読み取り可能な記憶媒体は、本発明の実施の形態に含まれる。
以上詳細に説明したとおり、本発明によるカップルドノードツリーの退避方法は、退避の対象であるカップルドノードツリーの部分木を構成するノードを、インデックスキーの昇順または降順に対応する深さ優先探索順に退避する方法である。昇順あるいは降順のいずれかが選択されれば、深さ優先探索順は、カップルドノードツリーのツリー構造と一対一に対応する順序である。また、カップルドノードツリーは、各ノードが記憶領域上に具体的にどのように配置されているかは任意である一方、ツリー構造はインデックスキーの集合によって一意に規定されるという特徴がある。
したがって、本発明によれば、記憶領域上のノードの配置のされ方に依存しない標準的な順序、すなわち、インデックスキーの集合から一意に規定されたツリー構造と一対一に対応する順序で、ノード情報(退避情報)が退避される。つまり、ノード情報(退避情報)は、退避されたリーフノードによってインデックスキーの集合を表すとともに、この順序性でカップルドノードツリーのツリー構造を表している。この順序性があるため、復元処理においては、復元すべきカップルドノードツリーのツリー構造を決定するための余計な処理が不要であり、効率的な復元が可能となっている。以上のことから、本発明による退避の順序は、ノード情報の交換形式として好適な順序であると言える。
配列に格納されたカップルドノードツリーの構成例を説明する図である。 カップルドノードツリーのツリー構造を概念的に示す図である。 本発明を実施するためのハードウェア構成例を説明する図である。 本発明の一実施形態における検索処理を示すフローチャートである。 カップルドノードツリーに格納されたインデックスキーの最小値を求める処理を示したフローチャートである。 カップルドノードツリーに格納されたインデックスキーの最大値を求める処理を示したフローチャートである。 カップルドノードツリーに格納されたインデックスキーを昇順に取り出す処理を示したフローチャートである。 カップルドノードツリーに格納されたインデックスキーを降順に取り出す処理を示したフローチャートである。 挿入処理の前段である検索処理の処理フローを示す図である。 挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。 ノード対を挿入する位置を求め、ノード対の各ノードの内容を書き込んで挿入処理を完成させる処理フローを示す図である。 ルートノードの挿入処理を含むインデックスキーを追加する場合のノード挿入処理全体を説明する処理フロー図である。 本発明の一実施形態における退避処理を示すフローチャートである。 本発明の一実施形態におけるノードを退避する処理を示すフローチャートである。 退避処理をカップルドノードツリーにより説明する図である。 退避処理によって変化する探索経路スタックとノード退避配列の状態を説明する図である。 本発明の一実施形態における復元処理を示すフローチャートである。 復元処理をカップルドノードツリーにより説明する図である。 復元処理によって変化する探索経路スタックとノード退避配列の状態を説明する図である。 従来の検索で用いられるパトリシアツリーの一例を示す図である。
符号の説明
10、20、30 配列番号
100 配列
101 ノード
102、114、117、124、126、260a〜260h、261b〜261h
ノード種別
103、115、230a〜230f、231b〜231f 弁別ビット位置
104、116、220、220a〜220f、221b〜221f 代表ノード番号
111、121、201a〜201h ノード対
112、122、210a〜210h ノード[0]、代表ノード
113、123、211b〜211h ノード[1]、代表ノードと対をなす非代表ノード
118、250c〜250h、251d〜251h インデックスキー
301 データ処理装置
302 中央処理装置
303 キャッシュメモリ
304 バス
305 主記憶装置
306 外部記憶装置
307 通信装置
308 データ格納装置
309 配列
310 探索経路スタック
401 ノード退避配列
1730a〜1730h 検査ビット位置
1740a〜1740f 左リンク、左ポインタ
1741a〜1741f 右リンク、右ポインタ
1750a〜1750h ノード

Claims (14)

  1. ビット列検索に用いるツリーの任意の部分木を退避するツリーの退避装置において、
    ツリーの始点であるルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す位置情報を格納する領域を含むが、前記検索対象のビット列からなるインデックスキーを格納する領域を含まないものであり、前記リーフノードは、前記ノード種別に加えて、前記検索対象のビット列からなるインデックスキーを格納する領域を含むが、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す位置情報を格納する領域を含まないものであり、前記ツリーの任意のノードを検索開始ノードとして、前記ブランチノードにおいて該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対の代表ノードかあるいは該代表ノードと対になる非代表ノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索の結果である検索結果キーとするように構成されたカップルドノードツリーと、
    退避しようとする前記部分木のルートノードを、ノードを退避する順序に対応する経路の開始点である巡回開始ノードとして指定する巡回開始ノード指定手段と、
    前記巡回開始ノード指定手段あるいは後記次巡回開始ノード指定手段で指定された巡回開始ノードから、前記ノード対のうち代表ノードのみあるいは非代表ノードのみをリンクしてリーフノードに至るまで巡回しながら、前記巡回開始ノードから前記リーフノードに至る前記経路上の各ノードについて、当該ノードの位置を示す前記位置情報を順次スタックに格納するとともに当該ノードの内容を順次カップルドノードツリーが配置されている記憶領域とは別の記憶領域に退避するノード退避手段と、
    代表ノードあるいは非代表ノードの位置情報が得られるまで前記スタックから順次位置情報を読み出し、該位置情報が読み出された前記代表ノードあるいは前記非代表ノードとノード対をなす非代表ノードあるいは代表ノードを、次の前記巡回開始ノードとして指定する次巡回開始ノード指定手段と、
    を備え、
    前記ノード退避手段によるノードの退避と前記次巡回開始ノード指定手段による次の巡回開始ノードの指定を、前記退避しようとする前記部分木の全てのノードを退避するまで繰り返す、
    ことを特徴とするカップルドノードツリーの退避装置。
  2. コンピュータがビット列検索に用いるツリーの任意の部分木を退避するツリーの退避方法において、
    前記ツリーは、
    該ツリーの始点であるルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す位置情報を格納する領域を含むが、前記検索対象のビット列からなるインデックスキーを格納する領域を含まないものであり、前記リーフノードは、前記ノード種別に加えて、前記検索対象のビット列からなるインデックスキーを格納する領域を含むが、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す位置情報を格納する領域を含まないものであり、前記ツリーの任意のノードを検索開始ノードとして、前記ブランチノードにおいて該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対の代表ノードかあるいは該代表ノードと対になる非代表ノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索の結果である検索結果キーとするように構成されたカップルドノードツリーであって、
    退避しようとする前記部分木のルートノードを、ノードを退避する順序に対応する経路の開始点である巡回開始ノードとして指定する巡回開始ノード指定ステップと、
    前記巡回開始ノード指定ステップあるいは後記次巡回開始ノード指定ステップで指定された巡回開始ノードから、前記ノード対のうち代表ノードのみあるいは非代表ノードのみをリンクしてリーフノードに至るまで巡回しながら、前記巡回開始ノードから前記リーフノードに至る前記経路上の各ノードについて、当該ノードの位置を示す前記位置情報を順次スタックに格納するとともに当該ノードの内容を順次カップルドノードツリーが配置されている記憶領域とは別の記憶領域に退避するノード退避ステップと、
    代表ノードあるいは非代表ノードの位置情報が得られるまで前記スタックから順次位置情報を読み出し、該位置情報が読み出された前記代表ノードあるいは前記非代表ノードとノード対をなす非代表ノードあるいは代表ノードを、次の前記巡回開始ノードとして指定する次巡回開始ノード指定ステップと、
    を備え、
    前記ノード退避ステップによるノードの退避と前記次巡回開始ノード指定ステップによる次の巡回開始ノードの指定を、前記退避しようとする前記部分木の全てのノードを退避するまで繰り返す、
    ことを特徴とするカップルドノードツリーの退避方法。
  3. 前記カップルドノードツリーは配列に記憶され、前記位置情報は、該位置情報に対応する前記ノードが格納された前記配列の配列要素の配列番号である、ことを特徴とする請求項2記載のカップルドノードツリーの退避方法。
  4. 前記別の記憶領域に退避される前記内容には、前記ブランチノードを退避する場合は前記弁別ビット位置が含まれ、前記リーフノードを退避する場合は前記インデックスキーが含まれ、前記ブランチノードと前記リーフノードを区別する種別情報が前記ブランチノードと前記リーフノードの双方に含まれ、前記種別情報も退避され、前記ブランチノードに含まれる前記位置情報は退避されないことを特徴とする請求項2載のカップルドノードツリーの退避方法。
  5. 前記別の記憶領域は配列であることを特徴とする請求項2記載のカップルドノードツリーの退避方法。
  6. 前記ノード退避ステップは、前記ノードの内容を順次カップルドノードツリーが配置されている記憶領域とは別の記憶領域に退避することに替えて、当該ノードの内容を順次伝送媒体を介して外部装置に送信すること、
    を特徴とする請求項2記載のカップルドノードツリーの退避方法。
  7. 請求項2記載のカップルドノードツリーの退避方法により退避されたノードの内容からなる退避情報により、退避された順番で順次ノードを復元することによって前記カップルドノードツリーを復元するカップルドノードツリーの復元装置において、
    復元しようとするカップルドノードツリーのルートノードを格納するノード格納用記憶領域を取得するルートノード格納用記憶領域取得手段と、
    前記退避情報を順次読出し、前記ルートノード格納用記憶領域取得手段あるいは後記ブランチノード復元手段により取得された、もしくは後記ノード格納用記憶領域探索手段により探索されたノード格納用記憶領域に書き込むことでノードを復元するノード復元手段と、
    前記ノード復元手段で復元されたノードの種別を判定するノード種別判定手段と、
    前記ノード種別判定手段で判定されたノードの種別がブランチノードであれば、該ブランチノードの次に退避したノードである子ノードと該子ノードと対をなすノードをそれぞれ格納するノード格納用記憶領域を取得するとともに、該子ノードを含むノード対の代表ノードを格納する前記ノード格納用記憶領域の位置情報を前記ブランチノードの代表ノード番号に書き込むブランチノード復元手段と、
    前記ノード種別判定手段で判定されたノードの種別がリーフノードであれば、復元中の前記カップルドノードツリーのツリー構造をルートノードに向かって遡って、取得済みだがノードの内容がいまだ格納されていないノード格納用記憶領域を探索するノード格納用記憶領域探索手段と、
    を備え、
    前記ノード復元手段、前記ノード種別判定手段、前記ブランチノード復元手段、及び前記ノード格納用記憶領域探索手段による処理を、前記復元しようとするカップルドノードツリーの全ての前記退避されたノードを復元するまで繰り返す、
    ことを特徴とするカップルドノードツリーの復元装置。
  8. コンピュータが、請求項2記載のカップルドノードツリーの退避方法により退避されたノードの内容からなる退避情報により、退避された順番で順次ノードを復元することによって前記カップルドノードツリーを復元するカップルドノードツリーの復元方法において、
    復元しようとするカップルドノードツリーのルートノードを格納するノード格納用記憶領域を取得するルートノード格納用記憶領域取得ステップと、
    前記退避情報を順次読出し、前記ルートノード格納用記憶領域取得ステップあるいは後記ブランチノード復元ステップにより取得された、もしくは後記ノード格納用記憶領域探索ステップにより探索されたノード格納用記憶領域に書き込むことでノードを復元するノード復元ステップと、
    前記ノード復元ステップで復元されたノードの種別を判定するノード種別判定ステップと、
    前記ノード種別判定ステップで判定されたノードの種別がブランチノードであれば、該ブランチノードの次に退避したノードである子ノードと該子ノードと対をなすノードをそれぞれ格納するノード格納用記憶領域を取得するとともに、該子ノードを含むノード対の代表ノードを格納する前記ノード格納用記憶領域の位置情報を前記ブランチノードの代表ノード番号に書き込むブランチノード復元ステップと、
    前記ノード種別判定ステップで判定されたノードの種別がリーフノードであれば、復元中の前記カップルドノードツリーのツリー構造をルートノードに向かって遡って、取得済みだがノードの内容がいまだ格納されていないノード格納用記憶領域を探索するノード格納用記憶領域探索ステップと、
    を備え、
    前記ノード復元ステップ、前記ノード種別判定ステップ、前記ブランチノード復元ステップ、及び前記ノード格納用記憶領域探索ステップの処理を、前記復元しようとするカップルドノードツリーの全ての前記退避されたノードを復元するまで繰り返す、
    ことを特徴とするカップルドノードツリーの復元方法。
  9. 前記カップルドノードツリーは配列に復元され、復元された前記ブランチノードに書き込まれる前記位置情報は、該位置情報に対応する前記代表ノードを格納する配列要素の配列番号である、ことを特徴とする請求項8記載のカップルドノードツリーの復元方法。
  10. 前記復元しようとするカップルドノードツリーは、前記退避情報に退避された元の前記カップルドノードツリーの部分木に相当するものであり、
    前記ノード復元ステップは、該部分木のルートノードよりも前の順番で退避された前記退避情報の読出をスキップし、該部分木の該ルートノードの前記内容から順次、前記退避情報を読み出すものであり、
    前記ノード格納用記憶領域探索ステップにおいて、復元中の前記部分木のルートノードまで遡ると復元を終了する、
    ことを特徴とする請求項8記載のカップルドノードツリーの復元方法。
  11. 前記退避情報は配列に格納されていることを特徴とする請求項8記載のカップルドノードツリーの復元方法。
  12. コンピュータが、請求項6記載のカップルドノードツリーの退避方法により前記外部装置に送信された退避情報を受信し、送信された順番で順次ノードを前記外部装置の記憶領域に復元することによって前記カップルドノードツリーを復元するカップルドノードツリーの復元方法であって、
    復元しようとするカップルドノードツリーのルートノードを格納するノード格納用記憶領域を取得するルートノード格納用記憶領域取得ステップと、
    前記退避情報を順次受信し、前記ルートノード格納用記憶領域取得ステップあるいは後記ブランチノード復元ステップにより取得された、もしくは後記ノード格納用記憶領域探索ステップにより探索されたノード格納用記憶領域に書き込むことでノードを復元するノード復元ステップと、
    前記ノード復元ステップで復元されたノードの種別を判定するノード種別判定ステップと、
    前記ノード種別判定ステップで判定されたノードの種別がブランチノードであれば、該ブランチノードの次に退避したノードである子ノードと該子ノードと対をなすノードをそれぞれ格納するノード格納用記憶領域を取得するとともに、該子ノードを含むノード対の代表ノードを格納する前記ノード格納用記憶領域の位置情報を前記ブランチノードの代表ノード番号に書き込むブランチノード復元ステップと、
    前記ノード種別判定ステップで判定されたノードの種別がリーフノードであれば、復元中の前記カップルドノードツリーのツリー構造をルートノードに向かって遡って、取得済みだがノードの内容がいまだ格納されていないノード格納用記憶領域を探索するノード格納用記憶領域探索ステップと、
    を備え、
    前記ノード復元ステップ、前記ノード種別判定ステップ、前記ブランチノード復元ステップ、及び前記ノード格納用記憶領域探索ステップの処理を、前記復元しようとするカップルドノードツリーの全ての前記退避されたノードを復元するまで繰り返す、
    ことを特徴とするカップルドノードツリーの復元方法。
  13. 請求項2〜6のいずれか1項に記載のカップルドノードツリーの退避方法または請求項8〜12のいずれか1項に記載のカップルドノードツリーの復元方法をコンピュータに実行させるためのプログラム。
  14. 請求項2〜6のいずれか1項に記載のカップルドノードツリーの退避方法または請求項8〜12のいずれか1項に記載のカップルドノードツリーの復元方法をコンピュータに実行させるためのプログラムを記憶したことを特徴とするコンピュータ読み取り可能な記憶媒体。
JP2007110019A 2007-04-19 2007-04-19 カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム Expired - Fee Related JP4514768B2 (ja)

Priority Applications (6)

Application Number Priority Date Filing Date Title
JP2007110019A JP4514768B2 (ja) 2007-04-19 2007-04-19 カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム
EP08738589.4A EP2149845B1 (en) 2007-04-19 2008-04-14 Coupled node tree backup/restore apparatus, backup/restore method, and program
CN2008800122779A CN101657818B (zh) 2007-04-19 2008-04-14 配对节点树保存/复原方法、最长一致/最短一致检索方法、比特序列检索方法以及存储介质
PCT/JP2008/000983 WO2008132806A1 (ja) 2007-04-19 2008-04-14 カップルドノードツリーの退避/復元方法、最長一致/最短一致検索方法、ビット列検索方法及び記憶媒体
TW097114278A TW200846955A (en) 2007-04-19 2008-04-18 Coupled node tree save/restore method, longest consistence/shortest consistence retrieval method, bit retrieval method and memory medium
US12/588,531 US8386526B2 (en) 2007-04-19 2009-10-19 Coupled node tree backup/restore apparatus, backup/restore method, and program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007110019A JP4514768B2 (ja) 2007-04-19 2007-04-19 カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム

Publications (3)

Publication Number Publication Date
JP2008269197A JP2008269197A (ja) 2008-11-06
JP2008269197A5 JP2008269197A5 (ja) 2010-03-11
JP4514768B2 true JP4514768B2 (ja) 2010-07-28

Family

ID=40048627

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007110019A Expired - Fee Related JP4514768B2 (ja) 2007-04-19 2007-04-19 カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム

Country Status (3)

Country Link
US (1) US8386526B2 (ja)
JP (1) JP4514768B2 (ja)
CN (1) CN101657818B (ja)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4502223B2 (ja) 2007-12-05 2010-07-14 株式会社エスグランツ ビット列のマージソート装置、方法及びプログラム
JP4498409B2 (ja) * 2007-12-28 2010-07-07 株式会社エスグランツ データベースのインデックスキー更新方法及びプログラム
WO2010036889A1 (en) 2008-09-25 2010-04-01 Bakbone Software, Inc. Remote backup and restore
EP2515245A1 (en) 2009-11-30 2012-10-24 S. Grants Co., Ltd. Bit stream retrieval device, retrieval method, and program
CN102193941B (zh) * 2010-03-12 2013-09-18 富士通株式会社 数据处理装置和为值串形式索引值建立索引的方法
JP5473893B2 (ja) * 2010-12-28 2014-04-16 株式会社高速屋 コード列検索装置、検索方法及びプログラム
US9026496B1 (en) * 2011-09-30 2015-05-05 Emc Corporation Efficient building of restore list
JP6407946B2 (ja) * 2016-12-12 2018-10-17 ファナック株式会社 機器情報及び位置情報の管理装置及び管理システム
CN107451486B (zh) * 2017-06-30 2021-05-18 华为技术有限公司 一种文件系统的权限设置方法及装置
US11308063B2 (en) * 2019-12-30 2022-04-19 Yahoo Assets Llc Data structure to array conversion
CN113760394B (zh) * 2020-06-03 2022-05-13 阿里巴巴集团控股有限公司 数据处理方法、装置、电子设备及存储介质

Citations (1)

* 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 情報検索方法及び装置

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6675163B1 (en) * 2000-04-06 2004-01-06 International Business Machines Corporation Full match (FM) search algorithm implementation for a network processor
JP4271214B2 (ja) 2006-07-07 2009-06-03 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム
JP4271227B2 (ja) 2006-10-30 2009-06-03 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム

Patent Citations (1)

* 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 情報検索方法及び装置

Also Published As

Publication number Publication date
CN101657818B (zh) 2013-07-10
US20100042598A1 (en) 2010-02-18
JP2008269197A (ja) 2008-11-06
CN101657818A (zh) 2010-02-24
US8386526B2 (en) 2013-02-26

Similar Documents

Publication Publication Date Title
JP4514768B2 (ja) カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム
JP4271227B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4271214B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4527753B2 (ja) ビット列検索装置、検索方法及びプログラム
WO2009084145A1 (ja) データベースのインデックスキー更新方法及びプログラム
JP4502223B2 (ja) ビット列のマージソート装置、方法及びプログラム
JP4402120B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4514771B2 (ja) カップルドノードツリーの最長一致/最短一致検索装置、検索方法及びプログラム
CN102541995B (zh) 对散列序列矩阵的索引和查询
JP5473893B2 (ja) コード列検索装置、検索方法及びプログラム
JP4379894B2 (ja) カップルドノードツリーの分割/結合方法及びプログラム
JP4439013B2 (ja) ビット列検索方法及び検索プログラム
US20110246451A1 (en) Storage device having full-text search function
EP2149845A1 (en) Coupled node tree save/restore method, longest consistence/shortest consistence retrieval method, bit retrieval method and memory medium
JP4417431B2 (ja) カップルドノードツリーの分割/結合方法及びプログラム
JP2009251840A (ja) ビット列検索装置、検索方法及びプログラム
WO2009090697A1 (ja) ビット列検索装置、検索方法及びプログラム
JP4813575B2 (ja) ビット列検索装置
CN117454849A (zh) 一种文字转换方法、装置、电子设备和存储介质
JP2009199577A (ja) ビット列検索装置、検索方法及びプログラム

Legal Events

Date Code Title Description
A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100126

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20100126

A871 Explanation of circumstances concerning accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A871

Effective date: 20100126

A975 Report on accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A971005

Effective date: 20100210

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100223

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100416

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: 20100511

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: 20100511

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: 20130521

Year of fee payment: 3

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

Free format text: PAYMENT UNTIL: 20130521

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: 20130521

Year of fee payment: 3

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees