(57)【特許請求の範囲】
【請求項１】
ツリー型データ構造をもつマスタ側データおよびツリー型データ構造をもつスレイブ側データを格納する記憶装置を含むコンピュータが前記マスタ側データに前記スレイブ側データのノードを挿入するノード挿入方法であって、
前記コンピュータのＣＰＵは、前記マスタ側データ及び前記スレイブ側データのそれぞれにおいて、ルート・ノードを含むノードに、同じ世代のノードよりも子ノードを優先して付与された連続する整数である固有のノード識別子を付与し、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に前記非ルート・ノードの各々の親ノードに付与されたノード識別子を関連付け、前記非ルート・ノードの各々に付与されたノード識別子の順に、このノード識別子に関連付けられた前記親ノードに付与されたノード識別子を配列として前記記憶装置に格納し、この配列によって、ノード間の親子関係を表現し、
当該ノード挿入方法は、
前記ＣＰＵが、前記スレイブ側データの前記親子関係を表現する配列中のスレイブ側特定ノードに付与されたノード識別子に関連付けられた前記親ノードのノード識別子が格納されている位置の次の位置から、前記スレイブ側特定ノードに付与されたノード識別子の値以上の値が格納されている連続領域を抽出することにより、前記スレイブ側特定ノードの全ての子孫ノードを特定するステップと、
前記ＣＰＵが、前記スレイブ側特定ノードに対応した前記マスタ側データ中のマスタ側特定ノードの子孫ノードとして、前記スレイブ側特定ノードの前記子孫ノードを前記マスタ側データに挿入するステップと、
を含むことを特徴とするノード挿入方法。
【請求項２】
前記スレイブ側特定ノードの前記子孫ノードを前記マスタ側データに挿入するステップは、前記ＣＰＵが、前記マスタ側データ中のノードと前記スレイブ側データ中の前記スレイブ側特定ノードの前記子孫ノードに、前記スレイブ側特定ノードの前記子孫ノードが前記マスタ側データ中の前記マスタ側特定ノードの子孫ノードに挿入される順序で、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノード識別子の順に対応する親ノードのノード識別子を関連付けることにより、前記マスタ側データのノード間の親子関係を表現する配列に前記スレイブ側データ中の前記スレイブ側特定ノードの前記子孫ノードの親子関係を表現する配列が挿入された新たな親子関係を表現する配列を生成し、前記記憶装置に格納するステップを含む、
請求項１に記載のノード挿入方法。
【請求項３】
前記新たな親子関係を表現する配列を生成し、前記記憶装置に格納するステップは、
前記ＣＰＵが、前記マスタ側データのノードについて、前記マスタ側特定ノードが現れるまで、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノードの当該ノード識別子に当該ノードの親ノードのノード識別子を関連付けるステップと、
前記ＣＰＵが、前記マスタ側特定ノードにノード識別子を付与し、前記マスタ側特定ノードの子孫ノードとして、前記スレイブ側特定のノードの前記子孫ノードに、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該子孫ノードのそれぞれにその親ノードのノード識別子を関連付けるステップと、
前記ＣＰＵが、前記マスタ側データに未だノード識別子が付与されていない残りのノードが存在する場合、当該残りのノードについて、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該残りのノードの当該ノード識別子に親ノードのノード識別子を関連付けるステップと、
を含む、
請求項２に記載のノード挿入方法。
【請求項４】
ツリー型データ構造をもつマスタ側データ及びツリー型データ構造をもつスレイブ側データを記憶する記憶装置を含み、
ＣＰＵを用いて、前記記憶装置に記憶された前記マスタ側データ及び前記スレイブ側データのそれぞれにおいて、ルート・ノードを含むノードに、同じ世代のノードよりも子ノードを優先して付与された連続する整数である固有のノード識別子を付与し、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に前記非ルート・ノードの各々の親ノードに付与されたノード識別子を関連付け、前記非ルート・ノードの各々に付与されたノード識別子の順に、このノード識別子に関連付けられた前記親ノードに付与されたノード識別子を配列として前記記憶装置に格納し、この配列によって、ノード間の親子関係を表現する情報処理装置であって、
前記ＣＰＵを用いて、前記スレイブ側データの前記親子関係を表現する配列中のスレイブ側特定ノードに付与されたノード識別子に関連付けられた前記親ノードのノード識別子が格納されている位置の次の位置から、前記スレイブ側特定ノードに付与されたノード識別子の値以上の値が格納されている連続領域を抽出することにより、前記スレイブ側特定ノードの全ての子孫ノードを特定する子孫ノード特定手段と、
前記ＣＰＵを用いて、前記スレイブ側特定ノードに対応した前記マスタ側データ中のマスタ側特定ノードの子孫ノードとして、前記スレイブ側特定ノードの前記子孫ノードを前記マスタ側データに挿入し、新たな親子関係を表現する情報を前記記憶装置に格納するノード挿入手段と、
を含む、情報処理装置。
【請求項５】
前記ノード挿入手段は、前記ＣＰＵを用いて、前記マスタ側データ中のノードと前記スレイブ側データ中の前記スレイブ側特定ノードの前記子孫ノードに、前記スレイブ側特定ノードの前記子孫ノードが前記マスタ側データ中の前記マスタ側特定ノードの子孫ノードに挿入される順序で、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノード識別子の順に対応する親ノードのノード識別子を関連付けることにより、前記マスタ側データのノード間の親子関係を表現する配列に前記スレイブ側データ中の前記スレイブ側特定ノードの前記子孫ノードの親子関係を表現する配列が挿入された新たな親子関係を表現する配列を生成する、
請求項４に記載の情報処理装置。
【請求項６】
前記ノード挿入手段は、
前記ＣＰＵを用いて、前記マスタ側データのノードが前記マスタ側特定ノードであるかどうかを判定する手段と、
前記ＣＰＵを用いて、前記マスタ側データのノードが前記マスタ側特定ノードではない場合、当該ノードに同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノードの当該ノード識別子に当該ノードの親ノードのノード識別子を関連付ける手段と、
前記マスタ側データのノードが前記マスタ側特定ノードである場合、前記ＣＰＵを用いて、前記マスタ側特定ノードにノード識別子を付与し、前記マスタ側特定ノードの子孫ノードとして、前記スレイブ側特定のノードの前記子孫ノードに、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該子孫ノードのそれぞれにその親ノードのノード識別子を関連付ける手段と、
を含む、
請求項５に記載の情報処理装置。
【請求項７】
ツリー型データ構造をもつマスタ側データ及びツリー型データ構造をもつスレイブ側データを記憶する記憶装置を含み、前記記憶装置に記憶された前記マスタ側データ及び前記スレイブ側データのそれぞれは、ルート・ノードを含むノードに、同じ世代のノードよりも子ノードを優先して付与された連続する整数である固有のノード識別子が付与され、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に前記非ルート・ノードの各々の親ノードに付与されたノード識別子が関連付けられ、前記非ルート・ノードの各々に付与されたノード識別子の順に、このノード識別子に関連付けられた前記親ノードに付与されたノード識別子が格納された配列によって、ノード間の親子関係が表現されている、コンピュータに、
前記スレイブ側データの前記親子関係を表現する配列中のスレイブ側特定ノードに付与されたノード識別子に関連付けられた前記親ノードのノード識別子が格納されている位置の次の位置から、前記スレイブ側特定ノードに付与されたノード識別子の値以上の値が格納されている連続領域を抽出することにより、前記スレイブ側特定ノードの全ての子孫ノードを特定する機能と、
前記スレイブ側特定ノードに対応した前記マスタ側データ中のマスタ側特定ノードの子孫ノードとして、前記スレイブ側特定ノードの前記子孫ノードを前記マスタ側データに挿入し、新たな親子関係を表現する情報を前記記憶装置に格納する機能と、
を実現させるためのプログラム。
【請求項８】
前記新たな親子関係を表現する情報を前記記憶装置に格納する機能は、前記マスタ側データ中のノードと前記スレイブ側データ中の前記スレイブ側特定ノードの前記子孫ノードに、前記スレイブ側特定ノードの前記子孫ノードが前記マスタ側データ中の前記マスタ側特定ノードの子孫ノードに挿入される順序で、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノード識別子の順に対応する親ノードのノード識別子を関連付けることにより、前記マスタ側データのノード間の親子関係を表現する配列に前記スレイブ側データ中の前記スレイブ側特定ノードの前記子孫ノードの親子関係を表現する配列が挿入された新たな親子関係を表現する配列を生成する機能を含む、
請求項７に記載のプログラム。
【請求項９】
前記新たな親子関係を表現する配列を生成する機能は、
前記マスタ側データのノードが前記マスタ側特定ノードであるかどうかを判定する機能と、
前記マスタ側データのノードが前記マスタ側特定ノードではない場合、当該ノードに同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノードの当該ノード識別子に当該ノードの親ノードのノード識別子を関連付ける機能と、
前記マスタ側データのノードが前記マスタ側特定ノードである場合、前記マスタ側特定ノードにノード識別子を付与し、前記マスタ側特定ノードの子孫ノードとして、前記スレイブ側特定のノードの前記子孫ノードに、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該子孫ノードのそれぞれにその親ノードのノード識別子を関連付ける機能と、
を含む、
請求項８に記載のプログラム。
【請求項１０】
請求項７乃至９のうちいずれか１項に記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はツリー型データ構造を取り扱う方法、特に、ツリー型データ構造にノードを挿入する方法に関する。また、本発明は、係る方法を実施する情報処理装置に関する。更に、本発明は、係る方法を実行するためのプログラム、及び、このプログラムを記録した記録媒体に関する。
【背景技術】
【０００２】
データベースは種々の用途に用いられているが、中規模ないし大規模システムにおいては、論理的な矛盾が排除できるリレーショナルデータベース（ＲＤＢ）の使用が主流となっている。たとえば、ＲＤＢは飛行機の座席予約等のシステムに利用されている。この場合、キー項目を指定することにより、（多くの場合１件の）ターゲットを迅速に検索することもでき、或いは、予約の確定、キャンセル或いは変更などを行うことができる。また、各便の座席数はせいぜい数百であるため、特定の航空便の空席数を求めることも可能である。
【０００３】
このようなＲＤＢは、表形式データの取り扱いに適しているが、ツリー形式データの取り扱いには適していないことが知られている（例えば、非特許文献１を参照。）。
【０００４】
更に、アプリケーションの中には、表形式による表現よりもツリー形式による表現の方が適しているものが存在する。特に、近年、イントラネットやインターネットのアプリケーションのデータ標準として、ツリー型データ構造を採用するＸＭＬが普及している（ＸＭＬの詳細については、例えば、非特許文献２を参照。）。
【０００５】
しかし、ツリー型データ構造の取り扱い、例えば、ツリー形式データの検索は、一般に、大変効率が悪い。この効率の悪さの第１の理由は、データが各所のノードに分散して存在するため、データの存在すべき場所を直ちに特定することが困難である点にある。ＲＤＢでは、例えば、「年齢」というデータは、あるテーブルの「年齢」という項目だけに格納されている。しかし、ツリー型データ構造では、「年齢」というデータを保持するノードが各所に散在しているので、一般的には、ツリー型データ構造の全体を調べなければ、該当するデータを検索することができない。
【０００６】
効率の悪さの第２の理由は、検索の結果を表現するために時間がかかるという点にある。検索にヒットしたノード群を表現しようとすると、屡々、そのノードの子孫にあたるノードも表現しなければならないが、ＲＤＢＭＳとは異なりデータ構造が非定型であるため、子孫ノードを表現するために時間がかかる。
【０００７】
そこで、データベースの主流であるＲＤＢの利点をいかすため、従来、ツリー型データ構造をデータベース化するとき、ツリー形式データをＲＤＢ化する方法（例えば、特許文献１を参照。）が提案されている。ＲＤＢでは、データはテーブル（表）に分解して保持される。そのため、実際のツリー形式データをＲＤＢ化するには、ツリー形式データをテーブルに押し込める必要がある。しかし、様々のツリー型データ構造を取り扱うためには、その構造毎に個別にデータをテーブルに押し込め、システム設計を行わなければならない。したがって、ＲＤＢに基づくシステム構築は非常に手間のかかる作業である。
【０００８】
これに対して、ツリー形式データ、特に、ＸＭＬデータをそのままの形でデータベース化する方法も提案されている。ツリー型データ構造の場合、一つのノードに子孫ノードをぶら下げることができ、多様な表現が可能であるため、システム設計の手間を大幅に削減することができる。したがって、ＸＭＬのようなツリー構造を取り扱える技術を核として、ツリー形式データを処理することへのニーズが高まっている。
【０００９】
ＸＭＬデータをそのままの形でデータベース化する方法の一例のアプローチは、ツリー構造に記入されているデータのコピーを取り出し、例えば、「年齢」という項目であれば、「年齢」の検索用インデックスデータを別途保持する（例えば、特許文献２を参照。）。これにより、データ自身に属性を付加できるというＸＭＬデータのメリットを十分に活用すると共に、タグを用いて表現された各項目の関係構造をそのまま記憶できるようにしている。
【００１０】
また、ＸＭＬ文書をツリー構造でメモリ上に展開するためのＤＯＭと呼ばれるオブジェクトモデルのインタフェースが公開されている（例えば、非特許文献３を参照。）。
【特許文献１】
特開２００３−２４８６１５号公報
【特許文献２】
特開２００１−１９５４０６号公報
【非特許文献１】
株式会社セック、"Karearea White Paper"、[online]、［平成１６年２月１９日検索］、インターネット＜URL:http://www.sec.co.jp/products/karearea/＞
【非特許文献２】
W3C、"Extensible Markup Language (XML) 1.0 (Third Edition)"、[online]、２００４年２月４日、［平成１６年２月１９日検索］、インターネット＜URL:http://www.w3.org/TR/2004/REC-xml-20040204/＞
【非特許文献３】
Ｒ．  アラン  ワイク、ブラッド  ルーペン、サルタン  ルーマン、「プログラミングＸＭＬ」、日経ＤＰソフトプレス、２００２年、p.５９−８４
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかし、上記の検索用インデックスデータを別途保持するようなアプローチでは、少なくともデータは二重に保持され、かつ、インデックスを作成するコスト及びインデックスを格納するためのデータ領域が必要となり、大規模なデータを保持する上で不利である。
【００１２】
このようなメカニズムによって、実際に検索を行い、ノードを特定したとしても、そのノードを表現するためには時間がかかる。また、このメカニズムは、ノード間の関係を問題とする検索（例えば、祖先に「６０歳」という「年齢」を含み、子孫に「１歳」という「年齢」を含むツリーの抽出）には利用できない。
【００１３】
このような従来技術の根本的な問題点は、個々のデータのみに着目し、データを蓄えたノード間をポインタで接続することによりツリー型データ構造が表現されているため、データ間の関係、例えば、親子、祖先、子孫、兄弟（シブリング）、世代などの関係を効率的にトレースすることができないことにある。換言すると、ポインタは、その値が一定しないため、データの格納アドレスを示すという用途にしか使用できず、ノード間の関係を直接的に表現することができない。その結果として、従来技術では、ツリー型データ構造のトポロジーを編集すること、特に、ツリー構造型データのあるノードに子孫ノードを挿入することが困難であった。また、上記のＤＯＭは、ツリー型データ構造のトポロジーを編集する操作のインタフェースを規定するだけであり、操作の具体的手法を規定するものではない。
【００１４】
そこで、本発明は、効率的にツリー型データ構造にノードを挿入することができる方法、情報処理装置、プログラム、および、プログラムを記録した記録媒体の提供を目的とする。
【課題を解決するための手段】
【００１５】
上記目的を達成するため、本発明は、ツリー型データ構造を構成するノード間の親子関係を、親ノードに子ノードを対応付ける「親→子」関係ではなく、子ノードに親ノードを対応付ける「子→親」関係によって表現するという親子関係表現に基づいて、ツリー型データ構造のマスタ側データに、ツリー型データ構造のスレイブ側データからのノードを挿入する。
【００１６】
したがって、本発明によれば、ツリー型データ構造をもつマスタ側データにツリー型データ構造をもつスレイブ側データのノードを挿入するノード挿入方法は、
前記マスタ側データ及び前記スレイブ側データのそれぞれにおいて、ルート・ノードを含むノードに固有のノード識別子が付与され、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に前記非ルート・ノードの各々の親ノードに付与されたノード識別子が関連付けられ、これにより、ノード間の親子関係が表現され、
当該ノード挿入方法は、
前記スレイブ側データ中のスレイブ側特定ノードの子孫ノードを特定するステップと、
前記スレイブ側特定ノードに対応した前記マスタ側データ中のマスタ側特定ノードの子孫ノードとして、前記スレイブ側特定ノードの前記子孫ノードを前記マスタ側データに挿入するステップと、
を含む。
【００１７】
従来から知られている「親→子」関係によって親子関係を表現する場合、一つの親ノードに複数の子ノードが対応する場合があるので、親ノードと子ノードの二つの要素を特定しなければ親子関係を定義できない。即ち、親ノードを特定しても、その親ノードと親子関係にある子ノードを特定することができない。これに対して、本発明のように「子→親」関係によって親子関係を表現する場合、一つの子ノードには必ず唯一の親ノードが対応するので、子ノードを特定することによって、この子ノードに対応する唯一の親ノードを直ちに特定することができる。これにより、マスタ側データのマスタ側特定ノードと、スレイブ側データのスレイブ側特定データとを指定して、マスタ側特定ノードの子孫ノードとして、スレイブ側特定データの子孫ノードを挿入することができる。
［００１８］  本発明の好ましい実施態様では、「子→親」表現による親子関係は、同じ世代のノードよりも子ノードを優先する深さ優先モードで、ノード識別子としてノードに付与された連続する整数の配列によって表現される。このため、好ましい実施態様にかかるノード挿入方法において、前記ノードに付与された固有のノード識別子は、同じ世代のノードよりも子ノードを優先して付与された連続する整数である。
［００１９］  そして、スレイブ側データのスレイブ側特定ノードの子孫ノードを、親子関係を表現する配列の連続領域によって判定し、マスタ側データと、スレイブ側特定ノードの子孫ノードと、について新たな親子関係を表現する配列を生成する。このため、より好ましい実施態様において、ノード挿入方法は、
前記マスタ側データ及び前記スレイブ側データのそれぞれにおいて、前記ノード間の親子関係は、前記非ルート・ノードの各々に付与されたノード識別子の順に、このノード識別子に関連付けられた前記親ノードに付与されたノード識別子が格納された配列によって表現され、
前記スレイブ側データ中のスレイブ側特定ノードの子孫ノードを特定するステップは、前記スレイブ側データの前記親子関係を表現する配列中の前記スレイブ側特定ノードに付与されたノード識別子に関連付けられた前記親ノードのノード識別子が格納されている位置の次の位置から、前記スレイブ側特定ノードに付与されたノード識別子の値以上の値が格納されている連続領域を抽出することにより、前記スレイブ側特定ノードの全ての子孫ノードを特定するステップを含む。
［００２０］  また、別の好ましい実施態様において、ノード挿入方法は、前記スレイブ側特定ノードの前記子孫ノードを前記マスタ側データに挿入するステップは、前記マスタ側データ中のノードと前記スレイブ側データ中の前記スレイブ側特定ノードの前記子孫ノードに、前記スレイブ側特定ノードの前記子孫ノードが前記マスタ側データ中の前記マスタ側特定ノードの子孫ノードに挿入される順序で、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノード識別子の順に対応する親ノードのノード識別子を関連付けることにより、前記マスタ側データのノード間の親子関係を表現する配列に前記スレイブ側データ中の前記スレイブ側特定ノードの前記子孫ノードの親子関係を表現する配列が挿入された新たな親子関係を表現する配列を生成するステップを含む。
【００２１】
このように、ノード識別子を連続する整数で表すことによって、ノード識別子から、そのノードに対応する親ノードのノード識別子が格納されているアドレスを簡単に取得することができるので、子ノードのノード識別子から親ノードのノード識別子を引く処理を高速化することができる。また、深さ優先で連続番号が付与されたノードの親子関係を「子→親」関係に基づいて配列表現すると、あるノードの子孫ノードが連続領域に出現するという優れた性質が得られるので、この性質を利用して、スレイブ側特定ノードの子孫ノードを特定することができる。
【００２２】
さらに、好ましい実施態様においては、上記ノード挿入方法において、
前記新たな親子関係を表現する配列を生成するステップは、
前記マスタ側データのノードについて、前記マスタ側特定ノードが現れるまで、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノードの当該ノード識別子に当該ノードの親ノードのノード識別子を関連付けるステップと、
前記マスタ側特定ノードにノード識別子を付与し、前記マスタ側特定ノードの子孫ノードとして、前記スレイブ側特定のノードの前記子孫ノードに、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該子孫ノードのそれぞれにその親ノードのノード識別子を関連付けるステップと、
前記マスタ側データに未だノード識別子が付与されていない残りのノードが存在する場合、当該残りのノードについて、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該残りのノードの当該ノード識別子に親ノードのノード識別子を関連付けるステップと、
を含む。
【００２３】
これにより、新たな親子関係を表現する配列は、挿入点までの処理と、挿入点における処理と、挿入点の後の処理の３ステップで生成することができる。
［００２４］  また、本発明によれば、上述したようなノード挿入方法を実施する情報処理装置が提供される。
［００２５］  本発明の目的は、ツリー型データ構造をもつマスタ側データ及びツリー型データ構造をもつスレイブ側データを記憶する記憶手段を含み、
前記記憶手段に記憶された前記マスタ側データ及び前記スレイブ側データのそれぞれは、ルート・ノードを含む、ノードに固有のノード識別子が付与され、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に前記非ルート・ノードの各々の親ノードに付与されたノード識別子が関連付けられ、これにより、ノード間の親親子関係が表現されている、
情報処理装置であって、
前記スレイブ側データ中のスレイブ側特定ノードの子孫ノードを特定する子孫ノード特定手段と、
前記スレイブ側特定ノードに対応した前記マスタ側データ中のマスタ側特定ノードの子孫ノードとして、前記スレイブ側特定ノードの前記子孫ノードを前記マスタ側データに挿入し、新たな親子関係を表現する情報を前記記憶手段に格納するノード挿入手段と、
を含む、
情報処理装置によって達成される。
［００２６］  また、好ましい実施態様においては、上記情報処理装置において、前記ノードに付与された固有のノード識別子は、同じ世代のノードよりも子ノードを優先して付与された連続する整数である。
［００２７］  より好ましい実施態様においては、上記情報処理装置において、
前記マスタ側データ及び前記スレイブ側データのそれぞれにおいて、前記ノード間の親子関係は、前記非ルート・ノードの各々に付与されたノード識別子の順に、このノード識別子に関連付けられた前記親ノードに付与されたノード識別子が格納された配列によって表現され、
前記子孫ノード特定手段は、前記スレイブ側データの前記親子関係を表現する配列中の前記スレイブ側特定ノードに付与されたノード識別子に関連付けられた親ノードのノード識別子が格納されている位置の次の位置から、前記スレイブ側特定ノードに付与されたノード識別子の値以上の値が格納されている連続領域を抽出することにより、前記スレイブ側特定ノードの全ての子孫ノードを特定する。
【００２８】
また、好ましい実施態様においては、前記ノード挿入手段は、前記マスタ側データ中のノードと前記スレイブ側データ中の前記スレイブ側特定ノードの前記子孫ノードに、前記スレイブ側特定ノードの前記子孫ノードが前記マスタ側データ中の前記マスタ側特定ノードの子孫ノードに挿入される順序で、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノード識別子の順に対応する親ノードのノード識別子を関連付けることにより、前記マスタ側データのノード間の親子関係を表現する配列に前記スレイブ側データ中の前記スレイブ側特定ノードの前記子孫ノードの親子関係を表現する配列が挿入された新たな親子関係を表現する配列を生成する。
【００２９】
より好ましい実施態様において、
前記ノード挿入手段は、
前記マスタ側データのノードが前記マスタ側特定ノードであるかどうかを判定する手段と、
前記マスタ側データのノードが前記マスタ側特定ノードではない場合、当該ノードに同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノードの当該ノード識別子に当該ノードの親ノードのノード識別子を関連付ける手段と、
前記マスタ側データのノードが前記マスタ側特定ノードである場合、前記マスタ側特定ノードにノード識別子を付与し、前記マスタ側特定ノードの子孫ノードとして、前記スレイブ側特定のノードの前記子孫ノードに、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該子孫ノードのそれぞれにその親ノードのノード識別子を関連付ける手段と、
を含む。
【００３０】
また、本発明によれば、上述したようなノード挿入方法をコンピュータに実行させるためのプログラムが提供される。
【００３１】
更に、本発明によれば、上記プログラムを記録した記録媒体が提供される。
【発明の効果】
【００３２】
本発明によれば、ツリー型データ構造のノード間の親子関係は、「子→親」表現に基づいて記述されるので、一つのノードに対して一つの格納場所を設けることにより親子関係を定義することができる。したがって、ツリー型データ構造を操作する際にアクセスされるメモリの量が低減し、これにより、ノード挿入操作が高速化される。
【００３３】
更に、本発明は、深さ優先モードでノードに番号を付与することにより、スレイブ側特定ノードの子孫ノードのブロックを容易に特定することができるので、ノード挿入操作がさらに高速化される。
【発明を実施するための最良の形態】
【００３４】
以下、添付図面を参照して、本発明の実施の形態につき説明を加える。
【００３５】
［コンピュータシステム構成］
図１は、本発明の実施の形態にかかるツリー型データ構造を取り扱うコンピュータシステムのハードウェア構成を示すブロックダイヤグラムである。図１に示すように、このコンピュータシステム１０は、通常のものと同様の構成であり、プログラムを実行することによりシステム全体および個々の構成部分を制御するＣＰＵ１２、ワークデータなどを記憶するＲＡＭ(Random Access Memory)１４、プログラム等を記憶するＲＯＭ(Read Only Memory)１６、ハードディスク等の固定記憶媒体１８、ＣＤ−ＲＯＭ１９をアクセスするためのＣＤ−ＲＯＭドライバ２０、ＣＤ−ＲＯＭドライバ２０や外部ネットワーク（図示せず）と接続された外部端子との間に設けられたインタフェース（Ｉ／Ｆ）２２、キーボードやマウスからなる入力装置２４、ＣＲＴ表示装置２６を備えている。ＣＰＵ１２、ＲＡＭ１４、ＲＯＭ１６、外部記憶媒体１８、Ｉ／Ｆ２２、入力装置２４および表示装置２６は、バス２８を介して相互に接続されている。
【００３６】
本実施の形態にかかる、ツリー型データ構造を記憶装置上に構築するプログラム、及び、ツリー型データ構造を記憶装置上で変換するプログラムは、ＣＤ−ＲＯＭ１９に収容され、ＣＤ−ＲＯＭドライバ２０に読取られても良いし、ＲＯＭ１６に予め記憶されていても良い。また、いったんＣＤ−ＲＯＭ１９から読み出したものを、外部記憶媒体１８の所定の領域に記憶しておいても良い。或いは、上記プログラムは、ネットワーク（図示せず）、外部端子およびＩ／Ｆ２２を経て外部から供給されるものであっても良い。
【００３７】
また、本発明の実施の形態にかかる情報処理装置は、コンピュータシステム１０にツリー型データ構造を記憶装置上に構築するプログラム、及び、ツリー型データ構造を記憶装置上で変換するプログラムを実行させることにより実現される。
【００３８】
［ツリー型データ構造］
図２Ａ、Ｂは、ツリー形式データの一例であるＰＯＳデータの説明図である。図２Ａは、このツリー形式データのデータ構造（即ち、トポロジー）及びデータ値を視覚的に表現した一例であり、図２Ｂは、同じツリー形式データをＸＭＬ形式で表現した一例である。図２Ａ、Ｂに示されるようにツリー型データ構造は、ルート・ノード（本例では、ＰＯＳデータ）から始めて、各ノードで枝分かれしてリーフ・ノード（端点）に至るノードとアークの組み合わせによって表現される。各ノードの実体的な値、例えば、店名ノードの値＝"フランス店"の格納場所は、店名ノードに関連したポインタで指定される。
【００３９】
本発明は、ツリー型データ構造のトポロジーを対象とするため、以下の説明では、主として、ツリー型データ構造のトポロジーに関して説明する。
【００４０】
従来、このようなツリー型データ構造は、データを蓄えたノード間をポインタで接続することによって表現されている。しかし、ポインタ表現は、ポインタ値に必然性がないという欠点がある。即ち、ある場合には特定のノードＡがある番地（例えば、１００番地）に格納され、別の場合には同じノードＡが別の番地（例えば、２００番地）に格納されるので、ポインタ値が一定ではなく、ポインタ値は、本質的にノードの格納アドレスを表現するに過ぎない。そのため、例えば、ノードが深さ優先の規則に従ってポインタで接続されている場合、これらのノードを幅優先の規則に従ってポインタで再接続することは困難である。
【００４１】
これに対して、本発明者は、ツリー型データ構造のトポロジーがアークリストによって記述可能であることに着目した。アークリストとは、ノード間の親子関係を表すアークのリストである。図３Ａ〜Ｃは、アークリストを用いたツリー型データ構造の表現形式の一例の説明図である。図３Ａ〜Ｃの例では、０、１０、２０、３０、４０、５０、６０、７０、８０、９０、１００及び１１０のノード識別子（ＩＤ）が付与された１２個のノードからなるツリー型データ構造が示されている。図３Ａはツリー型データ構造の全体を示している。図３Ａにおいて、（ノードのタイプを表している）丸形、ハート形などの図形の中央に記載された数字は、ノードＩＤを表し、矢印と矢印の側に記載された＜０，１０＞などの数字の対は、アークを表している。尚、ノードＩＤは、文字列には限られず、数値、特に、整数でもよい。図３Ｂは、親ノード（Ｆｒｏｍ−ＩＤ）から子ノード（Ｔｏ−ＩＤ）へのアークリストを示し、図３Ｃは、ノードＩＤとノードＴｙｐｅの対のリストからなるノードリストを示す。尚、ツリー型データ構造を表現するだけの目的のためにはノードリストが無くても構わない。原理的には、このようなアークリストを用いることによって、ノード間の関係をポインタによらずに直接的に記述することが可能である。
【００４２】
［「子→親」関係に基づく表現］
図３Ａ〜Ｃの例では、アークリストは、親ノードに子ノードを対応付ける「親→子」関係に基づいて記述されている。そのため、一つの親ノード、例えば、ルート・ノード０には、３個の子ノード１０、６０及び８０が存在するため、アークリストのＦｒｏｍ−ＩＤには、同じノードＩＤの０が３回出現している。つまり、親ノードを特定しても子ノードを特定することができないので、アークリストは、要素Ｆｒｏｍ−ＩＤの配列と要素Ｔｏ−ＩＤの配列により構成される。アークリストを使用する場合、あるノードは、Ｆｒｏｍ−ＩＤの配列と、Ｔｏ−ＩＤの配列の両方の配列に出現する。
【００４３】
これに対して、親子関係は、「子→親」関係によっても表現することが可能である。この場合、ノード間の親子関係は、ルート・ノード以外のノードである非ルート・ノードの各々と、関連付けられた親ノードと、の組の配列によって表現される。この「子→親」関係によって親子関係を表現する場合、「親→子」関係の場合には得られなかった重要な性質がある。即ち、一つの子ノードには必ず唯一の親ノードが対応するので、子ノードを特定することによって、この子ノードに対応する唯一の親ノードを直ちに特定することができる。つまり、アークリストは、実際には、要素Ｔｏ−ＩＤの配列だけを準備すればよい。この結果として、アークリストを格納するための記憶容量が削減される。この記憶容量の削減は、メモリへのアクセス回数が低減するという効果があるので、結果的に、処理の高速化が実現できる。
【００４４】
図４Ａ〜Ｃは、本発明の一実施例による「子→親」関係に基づくツリー型データ構造の表現方法の説明図である。図４Ａはツリー全体の説明図であり、図４Ｂは「子→親」関係に基づくアークリストである。図４Ｂのアークリストは、ルート・ノードに対する親ノードの格納領域を含んでいるので、ルート・ノードの親ノードとして、便宜的に"−"が設定されている。但し、ルート・ノードに対応する親ノードは存在しないので、図４Ｃに示されるように、「子→親」関係に基づくアークリストからルート・ノードに対する親ノードの格納領域を除いても構わない。このように本発明の一実施例では、ルート・ノード以外のノードである非ルート・ノードの各々に対して、非ルート・ノードの親ノードを関連付けることによりノード間の親子関係を表現する。そして、「子→親」表現された子のノードから親のノードのリストを辿ることでツリーのトポロジーを表現することができる。
【００４５】
このような「子→親」関係に基づくツリー型データ構造は、本発明の一実施例によれば、図５に示されるように、図１に示されたコンピュータシステム１０に、ルート・ノードを含むノードに固有のノード識別子を付与するノード定義ステップ５０１と、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を関連付ける親子関係定義ステップ５０２と、を実行させることによってＲＡＭ１４上に構築される。このように、最初に、文字列、浮動小数、整数などの任意の識別情報によってノードにノード識別子を付与し、次に、「子→親」表現に基づいて親子関係を定義することによって、子ノードのノード識別子から親ノードのノード識別子を引く（ルックアップする）ことでツリーのトポロジーを表現することができる。
【００４６】
［ノード識別子］
好ましい一実施例によれば、ノード定義ステップはノード識別子として数値を使用し、より好ましくは、連続する整数を使用し、更に好ましくは、０又は１からの整数連番を使用する。これにより、ノード識別子から、そのノードに対応する親ノードのノード識別子が格納されているアドレスを簡単に取得することができるので、子ノードのノード識別子から親ノードのノード識別子を引く処理を高速化することができる。
【００４７】
ツリー型データ構造のノードにノード識別子として順序付きの番号を付与してノード間の親子関係を表現する場合、番号の付与順序に規則を定めることによって、その後のツリー型データ構造の取り扱いが容易になるという利点がある。本発明によれば、この番号の付与順序の規則として、同じ世代のノードよりも子ノードを優先する深さ優先モードと、子ノードよりも同じ世代のノードを優先する幅優先モードが利用される。
【００４８】
図６Ａ〜Ｃは、本発明の一実施例によりＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。図６Ａには、各ノードにＩＤ番号が付与されたツリー構造型データが示され、図６Ｂには、変換規則が示され、図６Ｃには、各ノードに整数連番が付与されたツリー構造型データが示されている。本例の変換規則は、深さ優先で連続番号を付与する規則であり、具体的には、複数の子ノードが存在する場合、長子（一番上の兄）ノードに最小番号を付与し、末子（一番下の弟）ノードに大きい番号を付与し、かつ、兄弟ノードよりも子ノードを優先して番号を付与する。本例では、昇順に番号付けをしているが、降順に番号付けをしてもよい。
【００４９】
また、図７Ａ〜Ｃは、本発明の他の一実施例によりＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。図７Ａには、各ノードにＩＤ番号が付与されたツリー構造型データが示され、図７Ｂには、変換規則が示され、図７Ｃには、各ノードに整数連番が付与されたツリー構造型データが示されている。本例の変換規則は、幅優先で連続番号を付与する規則であり、具体的には、複数の子ノードが存在する場合、長子（一番上の兄）ノードに最小番号を付与し、末子（一番下の弟）ノードに大きい番号を付与し、かつ、子ノードよりも兄弟ノードを優先して番号を付与する。本例では、昇順に番号付けをしているが、降順に番号付けをしてもよい。
【００５０】
このようにノード識別子として番号を使用すると、ノード番号から直ちに、即ち、Ｏ（１）のオーダーで、そのノードに関する格納値が格納されているアドレスを引くことができる。また、親子関係を「子→親」表現することによって、子ノードから親ノードを直ちに、即ち、Ｏ（１）のオーダーで引くことができる。
【００５１】
［深さ優先モード］
本発明の一実施例によれば、図６Ａ〜Ｃに示されるような深さ優先に基づくツリー型データ構造は、図１に示されたコンピュータシステム１０に、
同じ世代のノードよりも子ノードを優先して、ルート・ノードを含むノードに固有の連続する整数を付与するノード定義ステップと、
ルート・ノード以外のノードである非ルート・ノードの各々に付与された整数の順に、非ルート・ノードの各々の親ノードに付与された整数を並べることにより形成される配列を前記記憶装置に格納する親子関係定義ステップと、
を実行させることによって、記憶装置上に構築される。これにより、ノードは深さ優先で連続整数が付与され、ノード間の親子関係は「子→親」関係の配列によって表現される。
【００５２】
図８は、本発明の一実施例による深さ優先に基づくノード定義処理のフローチャートである。このノード定義処理は、コンピュータシステム１０に
最初にルート・ノードに番号を付与するステップ８０１と、
既に番号が付与されたあるノードに唯一の子ノードが存在する場合には、当該子ノードに当該あるノードに付与された前記番号の次の番号を付与するステップ８０２と、
既に番号が付与されたあるノードに複数の子ノードが存在する場合には、当該複数の子ノードの間の兄弟関係に従って、弟ノードは直上の兄ノードの全ての子孫ノードに番号が付与された後に次の番号が付与されるように、一番上の兄ノードから一番下の弟ノードまで番号を付与するステップ８０３と、
を実行させる。これにより、深さ優先モードで同一の親ノードから派生した複数の子ノードの間に兄弟関係が定義される。
【００５３】
図９は、本発明の一実施例により図６Ａ〜Ｃに示された深さ優先のツリー型データ構造から作成された「子→親」表現に基づく親子関係の配列の説明図である。同図にサブツリー１又はサブツリー２として示されているように、深さ優先で連続番号が付与されたノードの親子関係を「子→親」関係に基づいて配列表現すると、あるノードの子孫ノードが連続領域に出現するという優れた性質が得られる。
【００５４】
本発明の一実施例では、深さ優先モードの優れた性質を利用することにより、前記配列から、あるノードに付与された整数以上の値が格納されている連続領域を抽出することにより、前記あるノードの全ての子孫ノードを特定する。これにより、あるノードの子孫ノードを表すノード群が前記配列内の連続ブロックとして獲得できる。例えば、連続ブロックのサイズをｍとすると、あるノードの全ての子孫ノードを特定するための処理速度は、Ｏ（ｍ）のオーダーになる。
【００５５】
既に説明したように、ノード間の親子関係は、「子→親」関係の配列の他に、「親→子」関係の配列によっても表現できる。図１０は、図６Ａ〜Ｃに示された深さ優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。一つの親ノードに対して複数の子ノードが存在し得るので、親子関係の配列は、各ノードに対する子ノードの番号が格納されている領域を示すための配列Ａｇｇｒと、子ノードの番号が格納されている配列Ｐ→Ｃの二つの配列により構成される。例えば、配列Ａｇｇｒの先頭から２番目の要素Ａｇｇｒ［１］の値は”３”であり、これは、ノード［１］に対する子ノードの番号は、配列Ｐ→Ｃの要素Ｐ→Ｃ［３］以降に格納されていることを表している。これにより、ノード［０］、即ち、ルート・ノードに対する子ノードは、配列Ｐ→Ｃの先頭から３個の要素、Ｐ→Ｃ［０］の１、Ｐ→Ｃ［１］の６、及びＰ→Ｃ［２］の８であることがわかる。
【００５６】
この「親→子」表現に基づく親子関係の配列の求め方を説明する。
（１）ノードの番号が配列Ｐ→Ｃの最大の添字（＝１１）と一致する場合、このノードに属する子ノードは存在しない。したがって、処理は継続されない。
（２）同図に太字で表された親ノードの番号からＡｇｇｒ値を求める。このＡｇｇｒ値は、配列Ｐ→Ｃの開始点を表す。
（３）太字で表された親ノード番号＋１に対応するＡｇｇｒ値を求める。このＡｇｇｒ値−１が配列Ｐ→Ｃの終了点である。
【００５７】
例えば、ノード０の子ノードの開始点は、Ａｇｇｒ［０］、即ち、０であり、終了点は、Ａｇｇｒ［１］−１、即ち、３−１＝２である。したがって、ノード０の子ノードは、配列Ｐ→Ｃの０〜２番目の要素、即ち、１、６及び８である。
【００５８】
或いは、「親→子」表現に基づく親子関係は、より単純に、親ノード番号の配列と、対応する子ノード番号の配列と、の二つの配列により表現することも可能である。しかし、この配列を利用して親子関係を見つけるためには、親ノードの番号を検索しなければならないので、即ち、ｌｏｇ（ｎ）のアクセス時間を要するので効率が悪い。
【００５９】
［幅優先モード］
本発明の一実施例によれば、図７Ａ〜Ｃに示されるような幅優先に基づくツリー型データ構造は、図１に示されたコンピュータシステム１０に、
子ノードよりも同じ世代のノードを優先して、ルート・ノードを含むノードに固有の連続する整数を付与するノード定義ステップと、
前記ルート・ノード以外のノードである非ルート・ノードの各々に付与された整数の順に、前記非ルート・ノードの各々の親ノードに付与された整数を並べることにより形成される配列を前記記憶装置に格納する親子関係定義ステップと、
を実行させることによって、記憶装置上に構築される。これにより、ノードは幅優先モードで連続整数が付与され、ノード間の親子関係は「子→親」関係の配列によって表現される。
【００６０】
図１１は、本発明の一実施例による幅優先に基づくノード定義処理のフローチャートである。このノード定義処理は、コンピュータシステム１０に、
各ノードが前記ルート・ノードから何世代目のノードであるか、及び、各世代に含まれるノード数を算出するステップ１１０１と、
最初に前記ルート・ノードに番号を付与するステップ１１０２と、
ある世代に含まれる全てのノードに番号が付与されたならば、当該ある世代の次の世代にノードが存在しなくなるまで、当該次の世代に含まれる全てのノードに対して、親ノードが異なる場合には、当該親ノードに番号が付与された順番に当該ノードに番号を付与し、当該親ノードが同一である場合には、当該親ノードから派生した複数の子ノードの間に兄弟関係を定義し、一番上の兄ノードから一番下の弟ノードまで直前に付与された番号の次の番号から連続的に変化する固有の整数を順に付与するステップ１０１３と、
を実行させる。これにより、幅優先モードで同一の親ノードから派生した複数の子ノードの間に兄弟関係が定義される。
【００６１】
図１２は、本発明の一実施例により図７Ａ〜Ｃに示された幅優先のツリー型データ構造から作成された「子→親」表現に基づく親子関係の配列の説明図である。同図に示されているように、幅優先で連続番号が付与されたノードの親子関係を「子→親」関係に基づいて配列表現すると、あるノードの子ノードは連続領域に出現するという優れた性質が得られる。これは、幅優先モードで連続番号が付与されたノードの親子関係を「子→親」関係に基づいて配列表現すると、親ノードに付与された番号が前記配列中に順序付き（昇順又は降順）で出現することによる。
【００６２】
したがって、本発明の一実施例では、幅優先モードの優れた性質を利用することにより、前記配列から、あるノードに付与された整数と同じ値が格納されている連続領域を抽出することにより、前記あるノードの全ての子ノードを特定する。これにより、あるノードの子ノードを、例えば、二分探索などの手法を用いて検索することが可能であり、即ち、Ｏ（ｌｏｇ（ｎ））のオーダーで検索することが可能になる。
【００６３】
既に説明したように、ノード間の親子関係は、「子→親」関係の配列の他に、「親→子」関係の配列によっても表現できる。図１３は、図７Ａ〜Ｃに示された幅優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。図１３一つの親ノードに対して複数の子ノードが存在し得るので、親子関係の配列は、各ノードに対する子ノードの番号が格納されている領域を示すための配列Ａｇｇｒと、子ノードの番号が格納されている配列Ｐ→Ｃの二つの配列により構成される。例えば、配列Ａｇｇｒの先頭から２番目の要素Ａｇｇｒ［１］の値は”３”であり、これは、ノード［１］に対する子ノードの番号は、配列Ｐ→Ｃの要素Ｐ→Ｃ［３］以降に格納されていることを表している。これにより、ノード［０］、即ち、ルート・ノードに対する子ノードは、配列Ｐ→Ｃの先頭から３個の要素、Ｐ→Ｃ［０］の１、Ｐ→Ｃ［１］の２、及び、Ｐ→Ｃ［２］の３であることがわかる。
【００６４】
この「親→子」表現に基づく親子関係の配列の求め方を説明する。
（１）ノードの番号が配列Ｐ→Ｃの最大の添字（＝１１）と一致する場合、このノードに属する子ノードは存在しない。したがって、処理は継続されない。
（２）同図に太字で表された親ノードの番号からＡｇｇｒ値を求める。このＡｇｇｒ値は、配列Ｐ→Ｃの開始点を表す。
（３）太字で表された親ノード番号＋１に対応するＡｇｇｒ値を求める。このＡｇｇｒ値−１が配列Ｐ→Ｃの終了点である。
【００６５】
例えば、ノード０の子ノードの開始点は、Ａｇｇｒ［０］、即ち、０であり、終了点は、Ａｇｇｒ［１］−１、即ち、３−１＝２である。したがって、ノード０の子ノードは、配列Ｐ→Ｃの０〜２番目の要素、即ち、１、２及び３である。
【００６６】
［ツリー型データ構造の表現形式の相互変換］
上述のように、ノードに連続番号を付与するための深さ優先モード及び幅優先モードは、それぞれ、固有の優れた性質を備えている。本発明の一実施例によるコンピュータシステムは、深さ優先に基づく「子→親」表現形式と、幅優先に基づく「子→親」表現形式と、「親→子」表現形式と、の間で相互に表現形式を変換することができる。図１４は、本発明の一実施例による三つの表現形式の相互変換の関係を示す図である。
【００６７】
図１５は、本発明の一実施例によりコンピュータシステムによって実現されるツリー型データ構造の構築方法のフローチャートである。同図に示されるように、コンピュータシステム１０は、ルート・ノードから始めて全てのノードに連続的に変化する整数を一意に割り当てるステップ１５１０と、ノード間に親子関係を定義するステップ１５２０と、を実行することにより、ツリー型データ構造を記憶装置上に構築する。
【００６８】
好ましくは、前記全てのノードに整数を一意に割り当てるステップ１５１０は、
同じ世代のノードよりも子ノードを優先して番号を付与する深さ優先モードと、子ノードよりも同じ世代のノードを優先して番号を付与する幅優先モードのどちらのモードでノードに番号を付与するかを選択するステップ１５１１と、
前記深さ優先モードが選択された場合に、深さ優先でノードを検索し、検索された順にノードに番号を付与するステップ１５１２と、
前記幅優先モードが選択された場合に、幅優先でノードを検索し、検索された順にノードに番号を付与するステップ１５１３と、
を含む。これにより、深さ優先モードによるノード番号付与と幅優先モードによるノード番号付与を一つのシステムに併存させることができるので、状況に応じて適切な表現形式を利用することが可能である。
【００６９】
また、好ましくは、前記ノード間に親子関係を定義するステップ１５２０は、
子ノードから親ノードへの関係を定義する子親表現モードと、親ノードから子ノードへの関係を定義する親子表現モードのどちらのモードで親子関係を定義するかを選択するステップ１５２１と、
前記子親表現モードが選択された場合に、子ノードに付与された番号の順に、当該子ノードに対応する親ノードに付与された番号を前記記憶装置に格納するステップ１５２２と、
前記親子表現モードが選択された場合に、親ノードに付与された番号の順に、当該親ノードに対応する子ノードに付与された番号の配列を前記記憶装置に格納するステップ１５２３と、
を含む。これにより、「子→親」関係で表現されているノード間の親子関係を、状況に応じて、「親→子」関係で表現することが可能になる。「親→子」関係に基づく表現は、例えば、外部との情報交換の際に有利である。
【００７０】
このように、本発明の一実施例によれば、ツリー型データ構造の表現形式として、親子関係を表現するための「子→親」表現及び「親→子」表現、並びに、ノードに番号を付与するため深さ優先モード及び幅優先モードを選択的に利用可能である。以下では、異なる表現形式の相互変換の方法を簡単に説明する。
【００７１】
［深さ優先「子→親」表現から幅優先「子→親」表現への変換］
図１６Ａ、Ｂは、本発明の一実施例による、深さ優先「子→親」表現（図１６Ａ）から、幅優先「子→親」表現（図１６Ｂ）への変換の説明図である。図１７は、この本発明の一実施例による深さ優先「子→親」表現から幅優先「子→親」表現への変換方法のフローチャートである。親子関係は、子ノードに付与された番号の順に、当該子ノードに対応する親ノードに付与された番号をコンピュータシステム１０の記憶装置、例えば、ＲＡＭ１４に格納することにより定義されている。図１７に示されるように、コンピュータシステム１０は、
同じ世代のノードよりも子ノードを優先してノードに番号を付与する深さ優先モードで表現されたツリー型データ構造の各ノードの世代を判定し、世代毎に属しているノードの個数を計数するステップ１７０１と、
前記世代毎に属しているノードの個数に基づいて、子ノードよりも同じ世代のノードを優先してノードに番号を付与する幅優先モードで番号を付与する際に各世代において付与される番号を決定するステップ１７０２と、
前記判定されたノードの世代及び前記決定された各世代において付与される番号に基づいて、前記各ノードの番号を前記幅優先モードで付与される番号に変換する変換配列を作成するステップ１７０３と、
前記各ノードの前記親子関係を、前記変換配列を使用して前記幅優先モードで付与される番号で表現された親子関係に変換するステップ１７０４と、
を実行する。これにより、深さ優先モードに基づく「子→親」表現形式から幅優先モードに基づく「子→親」表現形式への変換が可能になる。
【００７２】
以上の処理により、図１６Ａ、Ｂに示されるような深さ優先「子→親」表現から幅優先「子→親」表現への変換が行われる。
【００７３】
［幅優先「子→親」表現から深さ優先「子→親」表現への高速変換］
図１８Ａ、Ｂは、本発明の一実施例による、幅優先「子→親」表現（図１８Ａ）から、深さ優先「子→親」表現（図１８Ｂ）への変換の説明図である。図１９は、この本発明の一実施例による幅優先「子→親」表現から深さ優先「子→親」表現への変換方法のフローチャートである。親子関係は、子ノードに付与された番号の順に、当該子ノードに対応する親ノードに付与された番号をコンピュータシステム１０の記憶装置、例えば、ＲＡＭ１４に格納することにより定義されている。図１９に示されるように、コンピュータシステム１０は、
子ノードよりも同じ世代のノードを優先してノードに番号を付与する幅優先モードで表現されたツリー型データ構造の各ノードの子孫の数を計数するステップ１９０１と、
親ノードに付与されるべき番号に、当該ノードと同一の親ノードから派生した兄弟ノードのうち当該ノードよりも前に番号が付与されている兄ノードの数及び当該兄ノードの子孫の数を加算することにより、前記幅優先モードで付与された番号を、同じ世代のノードよりも子ノードを優先してノードの番号を付与する深さ優先モードで付与される番号に変換する変換配列を作成するステップ１９０２と、
前記各ノードの前記親子関係を、前記変換配列を使用して前記深さ優先モードで付与される番号で表現された親子関係に変換するステップ１９０３と、
を実行する。これにより、図１８Ａ、Ｂに示されるような幅優先モードに基づく「子→親」表現形式から深さ優先モードに基づく「子→親」表現形式への高速変換が可能になる。
【００７４】
［幅優先「子→親」表現から深さ優先「子→親」表現への変換］
本発明の他の一実施例によれば、幅優先「子→親」表現から深さ優先「子→親」表現への変換は、図１９に関して説明した高速変換方法の他に、検索を利用した変換方法によっても実現できる。以下では、この検索を利用した変換方法を説明する。
【００７５】
幅優先「子→親」表現による親子関係は、子ノードに付与された番号の順に、当該子ノードに対応する親ノードに付与された番号をコンピュータシステム１０の記憶装置、例えば、ＲＡＭ１４に格納することにより定義されている。コンピュータシステム１０は、
子ノードよりも同じ世代のノードを優先してノードに番号を付与する幅優先モードで表現されたツリー型データ構造の各ノードを深さ優先で検索し、前記幅優先モードで付与された番号を、同じ世代のノードよりも子ノードを優先してノードの番号を付与する深さ優先モードで付与される番号に変換する変換配列を作成するステップと、
前記各ノードの前記親子関係を、前記変換配列を使用して前記深さ優先モードで付与される番号で表現された親子関係に変換するステップと、
を実行する。
【００７６】
この検索に基づく変換方法によって作成された変換配列は、先の高速変換方法の例で作成される変換配列と同じである。
【００７７】
［「子→親」表現から「親→子」表現への変換］
次に、本発明の一実施例による子ノードに親ノードを対応付ける「子→親」関係から親ノードに子ノードを対応付ける「親→子」関係への変換方法を説明する。
【００７８】
図２０は、本発明の一実施例による「子→親」表現から「親→子」表現への変換方法のフローチャートである。親子関係は、子ノードに付与された番号の順に、当該子ノードに対応する親ノードに付与された番号を第１の配列の要素としてコンピュータシステム１０の記憶装置、例えば、ＲＡＭ１４に格納することにより定義されている。コンピュータシステム１０は、
各ノードに関して、当該ノードに付与された番号が前記第１の配列の要素として出現する回数を計数するステップ２００１と、
前記各ノードに関して当該ノードに対応する子ノードに付与された番号を格納するため、前記計数された回数に応じた個数の連続領域を前記記憶領域に第２の配列として確保するステップ２００２と、
前記第１の配列の要素を順次に読み出し、当該要素と値が一致する番号が付与されたノードのために確保された前記第２の配列の要素として、前記第１の配列の要素に対する子ノードの番号を順次に格納するステップ２００３と、
を実行する。これにより、親子関係は、「子→親」表現形式から「親→子」表現形式に変換される。即ち、変換後の親子関係は、親ノードに付与された番号の順に、当該親ノードに対応する子ノードに付与された番号を前記第２の配列の要素として前記記憶装置に格納することにより定義される。
【００７９】
この変換方法では、深さ優先又は幅優先の性質はそのまま保存されるので、深さ優先モードに基づく「子→親」表現は、深さ優先モードに基づく「親→子」表現に変換され、幅優先モードに基づく「子→親」表現は、幅優先モードに基づく「親→子」表現に変換される。
【００８０】
［「親→子」表現から「子→親」表現への変換］
次に、本発明の一実施例による親ノードに子ノードを対応付ける「親→子」関係から子ノードに親ノードを対応付ける「子→親」関係への変換方法を説明する。
【００８１】
図２１は、本発明の一実施例による幅優先「子→親」表現から深さ優先「子→親」表現への変換方法のフローチャートである。親子関係は、親ノードに付与された番号の順に、当該親ノードに対応する子ノードに付与された番号を第１の配列の要素としてコンピュータシステム１０の記憶装置、例えば、ＲＡＭ１４に格納することにより定義されている。コンピュータシステム１０は、
子ノードに付与された番号の順に、当該子ノードに対応する親ノードに付与された番号を格納するため、前記記憶装置に第２の配列を確保するステップ２１０１と、
前記第１の配列の要素を順次に読み出し、当該要素と値が一致する番号が付与されたノードのために確保された前記第２の配列の要素として、前記第１の配列の要素に対する親ノードの番号を順次に格納するステップ２１０２と、
を実行する。これにより、親子関係は、「親→子」表現形式から「子→親」表現形式に変換される。即ち、変換後の親子関係は、子ノードに付与された番号の順に、当該子ノードに対応する親ノードに付与された番号を前記第２の配列の要素として前記記憶装置に格納することにより定義される。
【００８２】
この変換方法では、深さ優先又は幅優先の性質はそのまま保存されるので、深さ優先モードに基づく「親→子」表現は、深さ優先モードに基づく「子→親」表現に変換され、幅優先モードに基づく「親→子」表現は、幅優先モードに基づく「子→親」表現に変換される。
【００８３】
［ノード挿入］
次に、ツリー型データ構造のトポロジーを編集する操作である「ノード挿入」について説明する。本発明の「ノード挿入」は、ツリー型データ構造をもつマスタ側データのある特定ノード（＝マスタ側特定ノード）の子孫ノードとして、ツリー型データ構造をもつスレイブ側データのある特定ノード（＝スレイブ側特定ノード）の子孫ノードを追加することを意味する。
【００８４】
図２２Ａ〜Ｃは、本発明の一実施例によるツリー型データ構造におけるノード挿入の説明図である。図２２Ａは、深さ優先でノードに番号が付与された深さ優先モードのマスタ側データを示し、図２２Ｂは、深さ優先モードのスレイブ側データを示し、図２２Ｃは、スレイブ側データの一部のノードをマスタ側データに挿入した結果を深さ優先モードで表現している。より詳細には、マスタ側データのノード５の子孫ノードとして、スレイブ側データのノード１の子孫ノード（ノード２、ノード３及びノード４）が挿入され、マスタ側データのノード９の子孫として、スレイブ側データのノード５の子孫ノード（ノード６及びノード７）が挿入され、全てのノードには深さ優先で番号が再付与されている。マスタ側データのノード５に子孫ノードが挿入され、挿入された子孫ノードにノード６、ノード７及びノード８の番号が付与されるので、マスタ側データのノード６の番号は、ノード９に付け直される。同様に、マスタ側データのノード６、ノード７、ノード８及びノード９は、それぞれ、ノード９、ノード１０、ノード１１及びノード１２のように番号が再付与される。さらに、マスタ側データの現在のノード１２（番号再付与前のノード９）には、スレイブ側データのノード６及びノード７が挿入され、それぞれ、ノード１３及びノード１４として番号が再付与される。これにより、元のマスタ側データのノード１０及びノード１１は、それぞれ、ノード１５及びノード１６のように番号が再付与される。
【００８５】
同図の例では、スレイブ側データのノード５の子ノード６及び子ノード７は、マスタ側データのノード９の子ノード１０及び子ノード１１よりも前に挿入されているが、子ノード１０と子ノード１１の間に挿入するように構成することが可能であり、或いは、子ノード１０及び子ノード１１の後に挿入するように構成することも可能である。
【００８６】
図２３は、本発明の一実施例によるノード挿入方法のフローチャートである。この方法は、ツリー型データ構造をもつマスタ側データに、ツリー型データ構造をもつスレイブ側データのノードを挿入する。
【００８７】
マスタ側データ及びスレイブ側データのそれぞれにおいて、ルート・ノードを含むノードに固有のノード識別子が付与されている。ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子には、非ルート・ノードの各々の親ノードに付与されたノード識別子が関連付けられ、これにより、ノード間の親子関係が表現されている。
【００８８】
本実施例のノード挿入方法は、
スレイブ側データ中のスレイブ側特定ノードの子孫ノードを特定するステップ２３０１と、
スレイブ側データ中のスレイブ側特定ノードに対応したマスタ側データ中の別の特定ノードの子孫ノードとして、スレイブ側データ中のスレイブ側特定ノードの子孫ノードをマスタ側データに挿入するステップ２３０２と、
を含む。
【００８９】
このように本発明の一実施例によるノード挿入方法は、「子→親」表現のツリー型データ構造を採用して、スレイブ側データのスレイブ側特定ノードの子孫ノードを、マスタ側データのマスタ側特定ノードの子孫ノードとして、マスタ側データに挿入する。
【００９０】
本発明の好ましい一実施例によれば、上記ノード間の親子関係は、深さ優先モードに基づく「子→親」表現形式で表され、ノード識別子は、連続する整数である。このとき、例えば、図２２Ａ〜Ｃに示されたツリー型データ構造は、図２４Ａ〜Ｃに示されるような深さ優先モードに基づく「子→親」表現形式で記述することができる。図２４Ａ、Ｂ及びＣは、それぞれ、図２２Ａ、Ｂ及びＣのデータ構造に対応した深さ優先モードに基づく「子→親」表現形式の説明図である。
【００９１】
図２４Ａ〜Ｃに示されるように、マスタ側データ及びスレイブ側データのノードに付与された固有のノード識別子は、同じ世代のノードよりも子ノードを優先して付与された連続する整数である。また、マスタ側データ及びスレイブ側データのそれぞれにおいて、ノード間の親子関係は、非ルート・ノードの各々に付与されたノード識別子の順に関連付けられた、非ルート・ノードの各々の親ノードに付与されたノード識別子からなる配列によって表現されている。即ち、ノード間の親子関係は、深さ優先モードに基づく「子→親」表現形式で表されている。
【００９２】
このとき、スレイブ側データ中のスレイブ側特定ノードの子孫ノードを特定するステップ２３０１は、スレイブ側データの親子関係を表現する配列中のスレイブ側特定ノードに付与されたノード識別子が格納されている位置の次の位置から、スレイブ側特定ノードに付与されたノード識別子の値以上の値が格納されている連続領域を抽出することにより、スレイブ側特定ノードの全ての子孫ノードを特定する。この子孫ノードの特定は、図９を参照して説明したように、深さ優先で連続番号が付与されたノードの親子関係を「子→親」関係に基づいて配列表現すると、あるノードの子孫ノードが連続領域に出現するという、深さ優先モードの優れた性質に基づいている。
【００９３】
また、図２４Ｃに示されるように、スレイブ側特定ノードの子孫ノードをマスタ側データに挿入するステップ２３０２は、マスタ側データ中のノードとスレイブ側データ中のスレイブ側特定ノードの子孫ノードに、スレイブ側特定ノードの子孫ノードがマスタ側データ中のマスタ側特定ノードの子孫ノードに挿入される順序で、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノード識別子の順に対応する親ノードのノード識別子を関連付けることにより、マスタ側データのノード間の親子関係を表現する配列にスレイブ側データ中のスレイブ側ノードの子孫ノードの親子関係を表現する配列が挿入された新たな親子関係を表現する配列を生成するステップを含む。
【００９４】
このように、本発明の好ましい一実施例によれば、親子関係は深さ優先であること、ならびに、ノード識別子は連続する整数であること、を利用して、スレイブ側データ中の子孫ノードを連続領域によって判定し、マスタ側データとスレイブ側データ中の子孫ノードについて新たな親子関係を表現する配列を生成する。
【００９５】
さらに、上記の新たな親子関係を表現する配列を生成するステップは、子孫ノードの挿入点までの処理と、子孫ノードの挿入点における処理と、子孫ノードの挿入点の後の処理の３ステップで実現することができる。図２５は、本発明の一実施例による新たな親子関係を表現する配列を生成する処理のフローチャートである。
【００９６】
図２５に示されるように、新たな親子関係を表現する配列を生成するステップは、子孫ノード挿入点までの処理ステップ２５０１と、子孫ノードの挿入点における処理ステップ２５０２と、子孫ノードの挿入点後の処理ステップ２５０３と、を含む。
【００９７】
ステップ２５０１：マスタ側データのノードについて、マスタ側特定ノードが現れるまで、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノードの当該ノード識別子に当該ノードの親ノードのノード識別子を関連付ける。
【００９８】
ステップ２５０２：マスタ側特定ノードにノード識別子を付与し、続いて、マスタ側特定ノードの子孫ノードとして、スレイブ側特定のノードの子孫ノードに、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該子孫ノードのそれぞれにその親ノードのノード識別子を関連付ける。
【００９９】
ステップ２５０３：マスタ側データに未だノード識別子が付与されていない残りのノードが存在する場合、当該残りのノードについて、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該残りのノードの当該ノード識別子に親ノードのノード識別子を関連付ける。
【０１００】
また、図２４Ａ〜Ｃに示された例のように、スレイブ側特定ノード１及びスレイブ側特定ノード２の二つ以上のノードの子孫ノードを同時にマスタ側データに挿入する場合には、スレイブ側特定ノードに対応したマスタ側特定ノードが無くなるまで、上記のステップ２５０１とステップ２５０２を繰り返し実行した後、ステップ２５０３を実行すればよい。
【０１０１】
［ノードの実体的な値の取り扱い方］
以上の説明のように、ツリー型データ構造のトポロジーを操作するノード挿入は、ノードに付与されたノード識別子（例えば、ノード番号）を付け直す操作であることがわかる。一方、ノードには、そのノードの実体的な値として、そのノードのタイプを表すノードタイプと、値を表すノード値と、が関連付けられている。これらのノードタイプ及びノード値は、図２Ａ、Ｂに関して説明したように、ノードタイプ及びノード値を記述する情報が格納されたノード情報格納領域へのポインタを、ノード識別子に随伴させることによって特定することができる。
【０１０２】
図２６には、本発明の一実施例によるノード挿入処理におけるノードの実体的な値の取り扱い方の一例が示されている。例えば、図２４Ａ〜Ｃに示された例では、スレイブ側のノード２は、マスタ側のノード５の子孫ノードとして挿入することにより、挿入処理後のノード６になる。一方、スレイブ側のノード２の実体的な値は、図２６に示されるように、アドレスａａａａのノード情報格納領域に格納されている。このスレイブ側のノード２をマスタ側データに挿入するとき、挿入によって生成されたノード６のポインタに、アドレスａａａａをコピーする。これにより、挿入後のノードに、対応したノード情報格納領域を指定するポインタを随伴させることができる。
【０１０３】
［ノード挿入処理の例］
次に、図２２Ａ〜Ｃに示した例を用いて、本発明の一実施例によるノード挿入処理をさらに詳しく説明する。図２７は、本発明の一実施例によるノード挿入処理の全体的な説明図である。本例では、マスタ側のノード５（マスタ側特定ノード１）の子孫ノードとして、スレイブ側のノード１（スレイブ側特定ノード１）の子孫ノード（ノード２、ノード３及びノード４）を挿入し、マスタ側のノード９（マスタ側特定ノード２）の子孫ノードとして、スレイブ側のノード５（スレイブ側特定ノード２）の子孫ノード（ノード６及びノード７）を挿入する。
【０１０４】
ノード挿入処理に使用されるスレイブ側特定ノードとマスタ側特定ノードは、マッチングしているノードである。以下の例では、スレイブ側特定ノードのノードタイプ及びノード値がマスタ側特定ノードのノードタイプ及びノード値と、それぞれ、一致している場合に、スレイブ側特定ノードとマスタ側特定ノードはマッチングしている、と判定する。図２７の例では、スレイブ側のノード１とマスタ側のノード５は、共にハート形で描かれていて、ノードタイプが一致している。また、図示されていないが、ノードの保持するノード値も一致している。同様に、スレイブ側のノード５とマスタ側のノード３は、同じノードタイプを有し、保持するノード値も一致している。これらのスレイブ側特定ノード及びマスタ側特定ノードは、予めユーザが指定してもよく、或いは、ユーザが設定した条件に従って自動的に判定してもよい。
【０１０５】
図２７には、マスタ側、スレイブ側及びノード挿入操作後のそれぞれについて、ツリー型データ構造と、深さ優先モードに基づく「子→親」表現形式の親子関を表す配列と、が示されている。また、ノード挿入処理後のツリー型データ構造及び親子関係を表す配列では、ノード識別子であるノード番号の変化する様子も示されている。
【０１０６】
本発明の一実施例によるノード挿入処理は、マスタ側のノードとスレイブ側のノードのマッチングを行って、ノード挿入処理の対象となるノード、即ち、特定ノード及び別の特定ノードを決定した後、ノードリスト、即ち、深さ優先モードに基づく「子→親」表現形式の親子関を表す配列を合成する。
【０１０７】
以下、図２８Ａ乃至図３５を参照してノードリスト合成処理を説明する。ノードリスト合成処理は、子孫ノードを特定する処理と、最初の挿入点までの処理と、挿入処理と、次の挿入点までの処理と、２回目の挿入処理と、挿入点以降の処理と、を含む。
【０１０８】
図２８Ａ〜Ｆは、本発明の一実施例による子孫ノードを特定する処理の説明図である。ノード挿入処理を行うためには、上述のように、各スレイブ側特定ノードの子孫ノード（即ち、サブツリー）の範囲を特定する必要がある。深さ優先モードに基づく「子→親」表現形式では、特定ノード、即ち、頂点ノードに対する子孫ノードは、頂点ノード以降の連続した範囲に存在している。そこで、子孫ノードを特定する処理では、この頂点ノード以降の連続した範囲を見つける。図２８Ａ〜Ｆにおいて、太線の矢印は、スレイブ側特定ノード１及びマスタ側特定ノード１についての処理を説明するための矢印であり、白抜きの矢印は、スレイブ側特定ノード２及びマスタ側特定ノード２についての処理を説明するための矢印である。
【０１０９】
手順１では、頂点ノード（＝スレイブ側特定ノード１）であるノード１の次のノード２からチェックを開始する。｛２｝の内容（＝ノード２に関連付けられた親ノード番号）をチェックすると１であり、頂点ノード１以上の値であるので、ノード２は頂点ノード［１］に属することがわかる。
【０１１０】
手順２では、｛３｝の内容をチェックすると２であり、頂点ノード１以上の値であるので、ノード３は頂点ノード［１］に属することがわかる。
【０１１１】
手順３では、｛４｝の内容をチェックすると１であり、頂点ノード１以上の値であるので、ノード４は頂点ノード［１］に属することがわかる。
【０１１２】
手順４では、｛５｝の内容をチェックすると０であり、頂点ノード１よりも小さい値であるので、ノード５（及びそれ以降のノード）は頂点ノード［１］に属さないことがわかる。
【０１１３】
頂点ノード１に対するチェックはここで終了し、頂点ノード［１］に属するノードのノード番号の末尾は｛４｝であることがわかる。
【０１１４】
手順５及び６では、同様に、頂点ノード［５］に属するノードをチェックすると、頂点ノード［５］に属するノードのノード番号の末尾は｛７｝であることがわかる。
【０１１５】
子孫ノードが特定されると、次に、ノードリストの合成結果配列を生成する。そのため、最初に、マスタ側のノード番号がどのように変化するかを記録する変換配列と、合成結果配列を準備する。変換配列のサイズは、元のマスタ側のＣ→Ｐ配列と同じサイズであり、合成結果配列のサイズは、元のマスタ側のＣ→Ｐ配列のサイズに、挿入されるスレイブ側の子孫ノードの個数（＝サブツリーのサイズの合計）を加算することによって計算できる。図２９は、本発明の一実施例による挿入処理の初期状態の説明図である。
【０１１６】
次に、最初の挿入点までの処理が行われる。図３０Ａ〜Ｃは、本発明の一実施例による最初の挿入点までの処理の説明図である。
【０１１７】
手順１：（１）マスタ側のノード０についての処理を行う（図３０Ａ）。変換配列［０］（変換配列のアドレス０）には、（マスタ側のＣ→Ｐ配列のアドレス番号）＋ｎＩｎｓ＝０＋０を格納する。ここで、ｎＩｎｓは、スレイブ側から挿入されたノードの個数を表している。変換配列に格納される値は、ノード挿入操作によって、マスタ側のノード番号がどのように付け直されたかを示している。（２）マスタ側のＣ→Ｐ配列［０］（Ｃ→Ｐ配列のアドレス０）の内容が−１であるので、この値をそのまま合成結果配列［０］（合成結果配列のアドレス０）に格納する。変換配列挿入ポインタ及び合成結果配列挿入ポインタは、初期状態では先頭（即ち、アドレス０）にセットされ、変換配列及び合成結果配列に値が格納されると、それぞれ、次のアドレスへ進められる。
【０１１８】
手順２：（１）マスタ側のノード１についての処理を行う（図３０Ｂ）。変換配列［１］には、（マスタ側のＣ→Ｐ配列のアドレス番号）＋ｎＩｎｓ＝１＋０を格納する。（２）マスタ側のＣ→Ｐ配列［１］の内容が０（０以上）であるので、この値０をアドレスとして変換配列を参照し、変換配列［０］の内容を、合成結果配列［１］に格納する。
【０１１９】
手順３：手順２と同様の操作を挿入点、即ち、マスタ側のノード５まで続ける（図３０Ｃ）。
【０１２０】
図３１は、本発明の一実施例による最初の挿入点における挿入処理の説明図である。同図に示された手順４では、ｎＩｎｓの値を、挿入されるノードの個数分、即ち、３だけ増加させる。次に、スレイブ側の特定ノード１の３個の子孫ノードのノード番号（２、３及び４）に、以下の式によって決まるオフセットを加えて、対応する合成結果配列［６］、合成結果配列［７］及び合成結果配列［８］に順次格納する。ここで、
オフセット＝（合成結果配列の挿入ポインタアドレス（本例では、６）−１）−スレイブ側挿入開始点アドレス（本例では、１）＝４
である。尚、オフセットの計算時に、合成結果配列の挿入ポインタアドレスは６に固定されている。また、スレイブ側挿入開始点アドレスは、スレイブ側特定ノード１のノード番号１である。したがって、合成結果配列［６］＝１＋４＝５、合成結果配列［７］＝２＋４＝６、及び、合成結果配列［７］＝１＋４＝５のようになる。
【０１２１】
図３２は、本発明の一実施例による次の挿入点までの処理の説明図である。手順５では、次の挿入点まで、手順２と同様の操作を繰り返す。具体的には、マスタ側のノード６、ノード７、ノード８及びノード９について、変換配列［ｉ］に（マスタ側のＣ→Ｐ配列のアドレス番号）＋ｎＩｎｓ＝ｉ＋３を格納する。ここで、ｉはマスタ側のノード番号を表す。次に、マスタ側のＣ→Ｐ配列［ｉ］の内容ｊをアドレスとして変換配列［ｊ］を参照し、変換配列［ｊ］の内容を、合成結果配列［変換配列［ｉ］］に格納する。例えば、ｉ＝７のとき、変換配列［７］に、７＋３＝１０を格納し、次に、Ｃ→Ｐ配列［７］の内容である６をアドレスとして、変換配列［６］を参照し、この変換配列［６］の内容である９を、合成結果配列［変換配列［７］］＝合成結果配列［１０］に格納する。
【０１２２】
図３３は、本発明の一実施例による２回目の挿入点における挿入処理の説明図である。同図に示された手順６では、現在のｎＩｎｓの値３を、挿入されるノードの個数分、即ち、２だけ増加させ、ｎＩｎｓ＝５とする。次に、スレイブ側の特定ノード２の２個の子孫ノードのノード番号（６及び７）に、以下の式によって決まるオフセットを加えて、対応する合成結果配列［１３］及び合成結果配列［１４］に順次格納する。ここで、
オフセット＝（合成結果配列の挿入ポインタアドレス（本例では、１３）−１）−スレイブ側挿入開始点アドレス（本例では、５））＝７
である。尚、オフセットの計算時に、合成結果配列の挿入ポインタアドレスは１３に固定されている。また、スレイブ側挿入開始点アドレスは、スレイブ側特定ノード２のノード番号である。したがって、合成結果配列［１３］＝５＋７＝１２、及び、合成結果配列［１４］＝５＋７＝１２のようになる。
【０１２３】
図３４は、本発明の一実施例による挿入点以降の処理の説明図である。同図に示された手順７では、手順２及び手順５と同様の操作を繰り返す。具体的には、マスタ側のノード１０及びノード１１について、変換配列［ｉ］に（マスタ側のＣ→Ｐ配列のアドレス番号）＋ｎＩｎｓ＝ｉ＋５を格納する。ここで、ｉはマスタ側のノード番号を表す。次に、マスタ側のＣ→Ｐ配列［ｉ］の内容ｊをアドレスとして変換配列［ｊ］を参照し、変換配列［ｊ］の内容を、合成結果配列［変換配列［ｉ］］に格納する。例えば、ｉ＝１０のとき、変換配列［１０］に、１０＋５＝１５を格納し、次に、Ｃ→Ｐ配列［１０］の内容である９をアドレスとして、変換配列［９］を参照し、この変換配列［９］の内容である１２を、合成結果配列［変換配列［１０］］＝合成結果配列［１５］に格納する。ｉ＝１１の場合も同様である。
【０１２４】
以上の処理によって、合成結果配列、即ち、マスタ側データにスレイブ側データの特定ノードの子孫ノードを挿入することにより生成された新たなデータ構造の深さ優先モードに基づく「子→親」表現形式の親子関係が得られる。図３５は、本発明の一実施例によるノード挿入処理の結果の説明図である。同図には、深さ優先モードに基づくノード番号によるツリー構造と、対応する深さ優先の「子→親」表現による親子関係と、が示されている。
【０１２５】
尚、ノード挿入処理によって得られた深さ優先モードの記述は、必要に応じて、図１６Ａ、Ｂ及び図１７を参照して説明した［深さ優先「子→親」表現から幅優先「子→親」表現への変換］を用いることにより、Ｏ（ｎ）の操作で幅優先モードの記述に変換することができる。
【０１２６】
［情報処理装置］
図３６は、本発明の一実施例によるツリー型データ構造を構築する情報処理装置３６００のブロック図である。情報処理装置３６００は、ツリー型データ構造を表現するデータを記憶する記憶部３６０１と、スレイブ側データ中のスレイブ側特定ノードの子孫ノードを特定する子孫ノード特定部３６０２と、スレイブ側特定ノードに対応したマスタ側データ中のマスタ側特定ノードの子孫ノードとして、スレイブ側特定ノードの子孫ノードをマスタ側データに挿入し、新たな親子関係を表現する情報を記憶部３６０１に格納するノード挿入部３６０３と、を含む。
【０１２７】
好ましい一実施例によれば、ノードに付与された固有のノード識別子は、同じ世代のノードよりも子ノードを優先して付与された連続する整数である。また、マスタ側データ及びスレイブ側データのそれぞれにおいて、ノード間の親子関係は、非ルート・ノードの各々に付与されたノード識別子の順に関連付けられた非ルート・ノードの各々の親ノードに付与されたノード識別子からなる配列によって表現される。
【０１２８】
子孫ノード特定部３６０２は、スレイブ側データの親子関係を表現する配列中のスレイブ側特定ノードに付与されたノード識別子が格納されている位置の次の位置から、スレイブ側特定ノードに付与されたノード識別子の値以上の値が格納されている連続領域を抽出することにより、スレイブ側特定ノードの全ての子孫ノードを特定する。
【０１２９】
また、ノード挿入部３６０３は、マスタ側データ中のノードとスレイブ側データ中のスレイブ側特定ノードの子孫ノードに、スレイブ側特定ノードの子孫ノードがマスタ側データ中のマスタ側特定ノードの子孫ノードに挿入される順序で、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノード識別子の順に対応する親ノードのノード識別子を関連付けることにより、マスタ側データのノード間の親子関係を表現する配列にスレイブ側データ中のスレイブ側特定ノードの子孫ノードの親子関係を表現する配列が挿入された新たな親子関係を表現する配列を生成する。
【０１３０】
さらに、好ましい一実施例によれば、情報処理装置３６００において、ノード挿入部３６０３は、マスタ側データのノードがマスタ側特定ノードであるかどうかを判定するノード判定部３６３１と、マスタ側データのノードがマスタ側特定ノードではない場合、当該ノードに同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該ノードの当該ノード識別子に当該ノードの親ノードのノード識別子を関連付ける非特定ノード操作部３６３２と、マスタ側データのノードがマスタ側特定ノードである場合、マスタ側特定ノードにノード識別子を付与し、続いて、マスタ側特定ノードの子孫ノードとして、スレイブ側特定のノードの子孫ノードに、同じ世代のノードよりも子ノードを優先してノード識別子を付与し、当該子孫ノードのそれぞれにその親ノードのノード識別子を関連付ける特定ノード操作部３６３３と、を含む。
【０１３１】
本発明は、以上の実施の形態に限定されることなく、特許請求の範囲に記載された発明の範囲内で、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
【図面の簡単な説明】
【０１３２】
【図１】図１は、本発明の実施の形態にかかるツリー型データ構造を取り扱うコンピュータシステムのブロックダイヤグラムである。
【図２】図２Ａ、Ｂは、ツリー形式データの一例であるＰＯＳデータの説明図であり、図２Ａは、このツリー形式データのデータ構造（即ち、トポロジー）及びデータ値を視覚的に表現した例、図２Ｂは、同じツリー形式データをＸＭＬ形式で表現した例を示す。
【図３】図３Ａ〜Ｃは、アークリストを用いたツリー型データ構造の表現形式の一例の説明図である。
【図４】図４Ａ〜Ｃは、本発明の一実施例による「子→親」関係に基づくツリー型データ構造の表現方法の説明図である。
【図５】図５は、本発明の一実施例によるツリー型データ構造を記憶装置上に構築する方法のフローチャートである。
【図６】図６Ａ〜Ｃは、本発明の一実施例によりＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。
【図７】図７Ａ〜Ｃは、本発明の他の一実施例によりＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。
【図８】図８は、本発明の一実施例による深さ優先に基づくノード定義処理のフローチャートである。
【図９】図９は、本発明の一実施例により作成された「子→親」表現に基づく親子関係の配列の説明図である。
【図１０】図１０は、図６Ａ〜Ｃに示された深さ優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。
【図１１】図１１は、本発明の一実施例による幅優先に基づくノード定義処理のフローチャートである。
【図１２】図１２は、本発明の一実施例により作成された「子→親」表現に基づく親子関係の配列の説明図である。
【図１３】図１３は、図７Ａ〜Ｃに示された深さ優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。
【図１４】図１４は、本発明の一実施例による三つの表現形式の相互変換の関係を示す図である。
【図１５】図１５は、本発明の一実施例によるコンピュータシステムによって実現されるツリー型データ構造の構築方法のフローチャートである。
【図１６】図１６Ａ、Ｂは、本発明の一実施例による深さ優先「子→親」表現から幅優先「子→親」表現への変換の説明図である。
【図１７】図１７は、本発明の一実施例による深さ優先「子→親」表現から幅優先「子→親」表現への変換方法のフローチャートである。
【図１８】図１８Ａ、Ｂは、本発明の一実施例による幅優先「子→親」表現から深さ優先「子→親」表現への変換の説明図である。
【図１９】図１９は、本発明の一実施例による幅優先に基づくノードの親子関係を深さ優先に基づくノードの親子関係に変換する処理の説明図である。
【図２０】図２０は、本発明の一実施例による「子→親」表現から「親→子」表現への変換方法のフローチャートである。
【図２１】図２１は、本発明の一実施例による「親→子」表現から「子→親」表現への変換方法のフローチャートである。
【図２２】図２２Ａ〜Ｃは、本発明の一実施例によるツリー型データ構造におけるノード挿入の説明図である。
【図２３】図２３は、本発明の一実施例によるノード挿入方法のフローチャートである。
【図２４】図２４Ａ〜Ｃは、それぞれ、図２２Ａ〜Ｃに対応した深さ優先「子→親」表現形式の説明図である。
【図２５】図２５は、本発明の一実施例による新たな親子関係を表現する配列を生成する処理のフローチャートである。
【図２６】図２６は、本発明の一実施例によるノード挿入処理におけるノードの実体的な値の取り扱い方の一例の説明図である。
【図２７】図２７は、本発明の一実施例によるノード挿入処理の全体的な説明図である。
【図２８】図２８Ａ〜Ｆは、本発明の一実施例による子孫ノードを特定する処理の説明図である。
【図２９】図２９は、本発明の一実施例による挿入処理の初期状態の説明図である。
【図３０】図３０Ａ〜Ｃは、本発明の一実施例による最初の挿入点までの処理の説明図である。
【図３１】図３１は、本発明の一実施例による最初の挿入点における挿入処理の説明図である。
【図３２】図３２は、本発明の一実施例による次の挿入点までの処理の説明図である。
【図３３】図３３は、本発明の一実施例による２回目の挿入点における挿入処理の説明図である。
【図３４】図３４は、本発明の一実施例による挿入点以降の処理の説明図である。
【図３５】図３５は、本発明の一実施例によるノード挿入処理の結果の説明図である。
【図３６】図３６は、本発明の一実施例によるノード挿入操作を行う情報処理装置のブロック図である。
【符号の説明】
【０１３３】
１０        コンピュータシステム
１２        ＣＰＵ
１４        ＲＡＭ
１６        ＲＯＭ
１８        固定記憶装置
２０        ＣＤ−ＲＯＭドライバ
２２        Ｉ／Ｆ
２４        入力装置
２６        表示装置
３６００    情報処理装置
３６０１    記憶部
３６０２    子孫ノード特定部
３６０３    ノード挿入部
３６３１    ノード判定部
３６３２    非特定ノード操作部
３６３３    特定ノード操作部
【図１】
0004681555.tif 000002
【図２】
0004681555.tif 000003
【図３】
0004681555.tif 000004
【図４】
0004681555.tif 000005
【図５】
0004681555.tif 000006
【図６】
0004681555.tif 000007
【図７】
0004681555.tif 000008
【図８】
0004681555.tif 000009
【図９】
0004681555.tif 000010
【図１０】
0004681555.tif 000011
【図１１】
0004681555.tif 000012
【図１２】
0004681555.tif 000013
【図１３】
0004681555.tif 000014
【図１４】
0004681555.tif 000015
【図１５】
0004681555.tif 000016
【図１６】
0004681555.tif 000017
【図１７】
0004681555.tif 000018
【図１８】
0004681555.tif 000019
【図１９】
0004681555.tif 000020
【図２０】
0004681555.tif 000021
【図２１】
0004681555.tif 000022
【図２２】
0004681555.tif 000023
【図２３】
0004681555.tif 000024
【図２４】
0004681555.tif 000025
【図２５】
0004681555.tif 000026
【図２６】
0004681555.tif 000027
【図２７】
0004681555.tif 000028
【図２８】
0004681555.tif 000029
【図２９】
0004681555.tif 000030
【図３０】
0004681555.tif 000031
【図３１】
0004681555.tif 000032
【図３２】
0004681555.tif 000033
【図３３】
0004681555.tif 000034
【図３４】
0004681555.tif 000035
【図３５】
0004681555.tif 000036
【図３６】
0004681555.tif 000037