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