(57)【特許請求の範囲】
【請求項１】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、ルート・ノード以外のノードである非ルート・ノードの各々に関連付けられた親ノードに付与されたノード識別子を、非ルート・ノードの各々に付与されたノード識別子によって示される位置に格納する第１の配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
それぞれが特定のノードおよびその子孫ノードを含む１以上のノード群である部分ツリーを表わすために、当該特定のノードを頂点ノードとして、その頂点ノードに付与されたノード識別子を格納する頂点ノードリストを、記憶装置中に生成するステップと、
前記頂点ノードリストに格納されたノード識別子に対応する頂点ノードにより特定される部分ツリーを表す、前記第１の配列中の部分を特定するステップと、
前記第１の配列中の部分について、前記部分に含まれるノード間の親子関係が前記部分ツリーの頂点ノードをルート・ノードとして用いて表現されるように、頂点ノード以外のノードである非頂点ノードの各々に関連付けられた親ノードに付与されたノード識別子を、非頂点ノードの各々に付与されたノード識別子によって示される位置に格納する第２の配列を前記記憶装置中に生成するステップと、を備えたことを特徴とする配列の生成方法。
【請求項２】
前記第１の配列中の部分を特定するステップが、頂点ノードのノード識別子が示す前記第１の配列中の位置から、ノード識別子が増大する方向に、前記頂点ノード識別子が示す前記第１の配列中の位置に格納された値より大きい値が格納されている前記第１の配列中の連続領域を特定するステップを含むことを特徴とする請求項１に記載の方法。
【請求項３】
前記第２の配列を生成するステップが、前記第１の配列の部分と同一サイズの配列の領域を前記記憶装置中に確保するステップと、
前記第１の配列の部分に格納された値から頂点ノードのノード識別子を減じた値を、それぞれ、前記第１の配列の部分に格納された値が前記第１の配列中に格納されている順番で前記領域に格納するステップと、を含むことを特徴とする請求項１または２に記載の方法。
【請求項４】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、ルート・ノード以外のノードである非ルート・ノードの各々に関連付けられた親ノードに付与されたノード識別子を、非ルート・ノードの各々に付与されたノード識別子によって示された位置に格納する親子関係配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
検索の対象である第１の親子関係配列により特定されるツリー中、検索キーとなるツリーと同一のトポロジーを有する部分ツリーを検索する方法であって、
検索キーとなるツリーを表現する検索キー配列として第２の親子関係配列を記憶装置中に生成するステップと、
前記検索キー配列中のノード識別子にオフセット値を加え、前記オフセット値が加えられたノード識別子と、前記第１の親子関係配列の中で前記オフセット値に応じてオフセットした範囲に存在する前記第１の親子関係配列中の部分に含まれるノード識別子とを比較するステップと、
前記比較により全てが一致した前記第１の親子関係配列中の部分のノード識別子を表す検索結果を前記記憶装置中に生成するステップと、を備えたことを特徴とする検索方法。
【請求項５】
前記検索結果を前記記憶装置中に生成するステップが、
前記ノード識別子の全てが一致した場合に、当該第１の親子関係配列中の部分の末尾の次のノード識別子を参照して、当該末尾の次のノード識別子に対応するノードが前記第１の親子関係配列中の部分のノード識別子を含む部分ツリーに属するか否かを判断するステップと、
当該末尾の次のノード識別子に対応するノードが前記部分ツリーに属しない場合に、前記比較により全てが一致した前記第１の親子関係配列中の部分のノード識別子を含む部分ツリーを表す頂点ノードのリストを検索結果として前記記憶装置に生成するステップと、を備えたことを特徴とする請求項４に記載の検索方法。
【請求項６】
前記ノードが、データを表わす少なくとも一つの実体情報が関連付けられ、
さらに、前記比較により全てが一致した部分のノード識別子により特定されるノードに関連付けられた実体情報と、検索キー配列のノード識別子により特定されたノードに関連付けられた実体情報とを、それぞれ比較するステップと、
前記第１の親子関係配列中の部分の全てのノード識別子により特定されたノードに関連付けられた実体情報が前記検索キー配列のノード識別子により特定されたノードに関連付けられた実体情報と一致する場合、前記第１の親子関係配列中の部分のノード識別子を含む部分ツリーを表す頂点ノードのリストを、前記記憶装置中に生成するステップと、を備えたことを特徴とする請求項４または５に記載の検索方法。
【請求項７】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、ルート・ノード以外のノードである非ルート・ノードの各々に関連付けられた親ノードに付与されたノード識別子を非ルート・ノードの各々に付与されたノード識別子によって示される位置に格納する親子関係配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
第１の親子関係配列により特定されるツリーを構成する部分ツリーを集計する方法であって、
前記部分ツリーの頂点ノードを格納した頂点ノードリストを前記記憶装置中に生成するステップと、
前記第１の親子関係配列から、前記頂点ノードリストに格納されたノード識別子に対応する頂点ノードのそれぞれにより特定される部分ツリーを表す前記第１の親子関係配列中の部分を特定するステップと、
前記第１の親子関係配列中の部分のそれぞれについて、前記部分ツリーの頂点ノードをルート・ノードとして、ノード間の親子関係を表現する第２の親子関係配列を前記記憶装置中に生成するステップと、
前記生成された第２の親子関係配列を参照して、第２の親子関係配列の種別ごとに、生成された親子関係配列の個数をカウントし、前記個数を前記第２の親子関係配列の種別と関連付けて前記記憶装置中に記憶するステップと、を備えたことを特徴とする集計方法。
【請求項８】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、ルート・ノード以外のノードである非ルート・ノードの各々に関連付けられた親ノードに付与されたノード識別子を非ルート・ノードの各々に付与されたノード識別子によって示される位置に格納する親子関係配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
第１の親子関係配列により特定されるツリーの部分ツリーの順序をソートする方法であって、
前記部分ツリーの頂点ノードを格納した頂点ノードリストを前記記憶装置中に生成するステップと、
前記第１の親子関係配列から、前記頂点ノードリストに格納されたノード識別子に対応する頂点ノードのそれぞれにより特定される部分ツリーを表す前記第１の親子関係配列中の部分を特定するステップと、
前記第１の親子関係配列中の部分のそれぞれについて、前記部分ツリーの頂点ノードをルート・ノードとして、ノード間の親子関係を表現する第２の親子関係配列を前記記憶装置中に生成するステップと、
前記生成された第２の親子関係配列を参照して、設定された評価基準にしたがって、前記頂点ノードリスト中の前記頂点ノードのノード識別子の順序を入れ替えるステップと、を備えたことを特徴とするソート方法。
【請求項９】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、子ノードをもつノードについて、それぞれのノード識別子と、当該子ノードをもつノードを親ノードとする子ノードの出現数との組を前記ノード識別子の順に格納する集計配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
前記集計配列に基づき、ルート・ノード以外のノードである非ルート・ノードの各々に関連付けられた親ノードに付与されたノード識別子を、非ルート・ノードの各々に付与されたノード識別子によって示される位置に格納する親子関係配列を生成する方法であって、
前記集計配列中の出現数に基づき、ノード識別子を格納位置番号とする前記親子関係配列のための領域を記憶装置中に確保するステップと、
前記集計配列および前記親子関係配列のそれぞれにおいて、第１のポインタおよび第２のポインタを初期位置に配置するステップと、
前記集計配列中、前記第１のポインタが示すノード識別子と前記第２のポインタが示す格納位置番号から「１」を減じた値とが一致する場合に、前記第１のポインタが示すノード識別子を、前記親子関係配列において、前記第２のポインタが示す格納位置番号に対応する値として格納するとともに、前記集計配列中、前記第１のポインタが示す出現数を「１」だけ減じ、かつ、第１のポインタおよび第２のポインタを、その格納位置番号が増大するように移動させるステップと、
前記集計配列中、前記第１のポインタが示すノード識別子と前記第２のポインタが示す格納位置番号から「１」を減じた値とが一致しない場合に、前記集計配列において、前記第１のポインタに初期的に配置される第３のポインタを、その格納位置番号を減じるように移動させて、前記集計配列において、その出現数が「０」とならない位置を特定して、当該第３のポインタが示すノード識別子を、前記親子関係配列において、前記第２のポインタが示す格納位置番号に対応する値として格納するとともに、前記集計配列中、前記第３のポインタが示す出現数を「１」だけ減じ、かつ、第２のポインタを、その格納位置番号が増大するように移動させるステップと、を備えたことを特徴とする配列の生成方法。
【請求項１０】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、子ノードをもつノードについて、それぞれのノード識別子と、当該子ノードをもつノードを親ノードとする子ノードの出現数との組を前記ノード識別子の順に格納する集計配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
前記集計配列から、頂点ノードおよびその子孫ノードを含む部分ツリーを表わす部分配列を生成する方法であって、
前記集計配列において、前記頂点ノードのノード識別子と、当該ノード識別子に関連付けられた出現数とに基づき、少なくとも子孫ノードとなるノードのノード識別子を初期的に算出するステップと、
前記集計配列において、格納位置番号が増大するように、ノード識別子を参照し、前記ノード識別子に対応するノードが、前記頂点ノードの子孫ノードとなるか否かを判断するとともに、当該集計配列のノード識別子に関連付けられた出現数を参照して、前記子孫ノードのノード識別子を更新するステップと、
前記頂点ノードの子孫ノードとなると判断されたノードのノード識別子と前記関連付けられた出現数との組を、部分配列として記憶装置中に生成するステップと、を備えたことを特徴とする配列の生成方法。
【請求項１１】
さらに、前記部分配列において、そのノード識別子から、先頭のノード識別子を減じて、標準形式の部分配列を、記憶装置中に生成するステップを備えたことを特徴とする請求項１０に記載の配列の生成方法。
【請求項１２】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、子ノードをもつノードについて、それぞれのノード識別子と、当該子ノードをもつノードを親ノードとする子ノードの出現数との組を前記ノード識別子の順に格納する集計配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
検索の対象である第１の集計配列により特定されるツリー中、検索キーとなるツリーと同一のトポロジーを有する部分ツリーを検索する方法であって、
前記検索キーとなるツリーを表現する検索キー配列として、第２の集計配列を記憶装置中に生成するステップと、
前記検索キー配列中のノード識別子にオフセット値を加え、前記オフセット値が加えられたノード識別子と、前記第１の集計配列中で前記オフセット値に応じてオフセットした範囲に存在する前記第１の集計配列中の部分に含まれるノード識別子とを比較するステップと、
前記比較により全てが一致した前記第１の集計配列中の部分のノード識別子とその出現数とを含む集計配列を検索結果として前記記憶装置中に格納するステップと、を備えたことを特徴とする検索方法。
【請求項１３】
前記ノードが、データを表わす少なくとも一つの実体情報が関連付けられ、
さらに、前記比較により全てが一致した部分のノード識別子により特定されるノードに関連付けられた実体情報と、検索キー配列中のノード識別子により特定されたノードに関連付けられた実体情報とを、それぞれ比較するステップと、
前記第１の集計配列中の部分に含まれる全てのノード識別子により特定されたノードに関連付けられた実体情報が前記検索キー配列中のノード識別子により特定されたノードに関連付けられた実体情報と一致する場合、前記第１の集計配列中の部分に含まれるノード識別子とその出現数とを含む集計配列を検索結果として前記記憶装置中に生成するステップと、を備えたことを特徴とする請求項１２に記載の検索方法。
【請求項１４】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、子ノードをもつノードについて、それぞれのノード識別子と、当該子ノードをもつノードを親ノードとする子ノードの出現数との組を前記ノード識別子の順に格納する集計配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
前記集計配列に基づき、当該集計配列により特定されるツリーを構成する部分ツリーを集計する方法であって、
前記部分ツリーの頂点ノードを格納した頂点ノードリストを前記記憶装置中に生成するステップと、
前記集計配列において、前記頂点ノードのノード識別子と、当該ノード識別子に関連付けられた出現数とに基づき、少なくとも子孫ノードとなるノードのノード識別子を初期的に算出するステップと、
前記集計配列において、格納位置番号が増大するように、ノード識別子を参照し、前記ノード識別子に対応するノードが、前記頂点ノードの子孫ノードとなるか否かを判断するとともに、当該集計配列中のノード識別子に関連付けられた出現数を参照して、前記子孫ノードのノード識別子を更新するステップと、
前記頂点ノードの子孫ノードとなると判断されたノードのノード識別子とこのノード識別子に関連付けられた出現数との組を、部分配列として記憶装置中に生成するステップと、
前記部分配列において、各ノード識別子から前記部分配列中の先頭のノード識別子を減じることにより形成された標準形式の部分配列を記憶装置中に生成するステップと、
前記生成された標準形式の部分配列を参照して、前記標準形式の部分配列の種別ごとに、生成された前記標準形式の部分配列の個数をカウントし、前記個数を前記種別と関連付けて前記記憶装置中に記憶するステップと、を備えたことを特徴とする集計方法。
【請求項１５】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、ルート・ノード以外のノードである非ルート・ノードの各々に関連付けられた親ノードに付与されたノード識別子を、非ルート・ノードの各々に付与されたノード識別子によって示される位置に格納する第１の配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、部分ツリーを表わす配列を生成するために、前記コンピュータにより読み出し可能なコンピュータプログラムであって、
前記コンピュータに、
それぞれが特定のノードおよびその子孫ノードを含む１以上のノード群である部分ツリーを表わすために、当該特定のノードを頂点ノードとして、その頂点ノードに付与されたノード識別子を格納する頂点ノードリストを、記憶装置中に生成するステップと、
前記頂点ノードリストに格納されたノード識別子に対応する頂点ノードにより特定される部分ツリーを表す、前記第１の配列中の部分を特定するステップと、
前記第１の配列中の部分について、前記部分に含まれるノード間の親子関係が前記部分ツリーの頂点ノードをルート・ノードとして用いて表現されるように、頂点ノード以外のノードである非頂点ノードの各々に関連付けられた親ノードに付与されたノード識別子を、非頂点ノードの各々に付与されたノード識別子によって示される位置に格納する第２の配列を前記記憶装置中に生成するステップと、を実行させることを特徴とするコンピュータプログラム。
【請求項１６】
前記第１の配列中の部分を特定するステップにおいて、
頂点ノードのノード識別子が示す前記第１の配列中の位置から、ノード識別子が増大する方向に、前記頂点ノード識別子が示す前記第１の配列中の位置に格納された値より大きい値が格納されている前記第１の配列中の連続領域を特定するステップを、前記コンピュータに実行させることを特徴とする請求項１５に記載のコンピュータプログラム。
【請求項１７】
前記第２の配列を生成するステップにおいて、
前記第１の配列の部分と同一サイズの配列の領域を前記記憶装置中に確保するステップと、
前記第１の配列の部分に格納された値から頂点ノードのノード識別子を減じた値を、それぞれ、前記第１の配列の部分に格納された値が前記第１の配列中に格納されている順番で前記領域に格納するステップと、を前記コンピュータに実行させることを特徴とする請求項１５または１６に記載のコンピュータプログラム。
【請求項１８】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、ルート・ノード以外のノードである非ルート・ノードの各々に関連付けられた親ノードに付与されたノード識別子を、非ルート・ノードの各々に付与されたノード識別子によって示される位置に格納する親子関係配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
検索の対象である第１の親子関係配列により特定されるツリー中、検索キーとなるツリーと同一のトポロジーを有する部分ツリーを検索するために、前記コンピュータにより読み出し可能なコンピュータプログラムであって、
前記コンピュータに、
検索キーとなるツリーを表現する検索キー配列として、第２の親子関係配列を記憶装置中に生成するステップと、
前記検索キー配列中のノード識別子にオフセット値を加え、前記オフセット値が加えられたノード識別子と、前記第１の親子関係配列の中で前記オフセット値に応じてオフセットした範囲に存在する前記第１の親子関係配列中の部分に含まれるノード識別子とを比較するステップと、
前記比較により全てが一致した前記第１の親子関係配列中の部分のノード識別子を表す検索結果を前記記憶装置中に生成するステップと、を実行させることを特徴とするコンピュータプログラム。
【請求項１９】
前記コンピュータに、
前記ノード識別子の全てが一致した場合に、当該第１の親子関係配列中の部分の末尾の次のノード識別子を参照して、当該末尾の次のノード識別子に対応するノードが前記第１の親子関係配列中の部分のノード識別子を含む部分ツリーに属するか否かを判断するステップと、
当該末尾の次のノード識別子に対応するノードが前記部分ツリーに属しない場合に、前記比較により全てが一致した前記第１の親子関係配列中の部分のノード識別子を含む部分ツリーを表す頂点ノードのリストを検索結果として前記記憶装置に生成するステップと、を実行させることを特徴とする請求項１８に記載のコンピュータプログラム。
【請求項２０】
前記ノードが、データを表わす少なくとも一つの実体情報が関連付けられ、
さらに、前記コンピュータに、
前記比較により全てが一致した部分のノード識別子により特定されるノードに関連付けられた実体情報と、検索キー配列のノード識別子により特定されたノードに関連付けられた実体情報とを、それぞれ比較するステップと、
前記第１の親子関係配列中の部分の全てのノード識別子により特定されたノードに全ての関連付けられた実体情報が、前記検索キー配列中のノード識別子により特定されたノードに関連付けられた実体情報と一致する場合、前記第１の親子関係配列中の部分のノード識別子を含む部分ツリーを表す頂点ノードリストを、前記記憶装置に生成するステップと、を実行させることを特徴とする請求項１８または１９に記載のコンピュータプログラム。
【請求項２１】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、ルート・ノード以外のノードである非ルート・ノードの各々に関連付けられた親ノードに付与されたノード識別子を、非ルート・ノードの各々に付与されたノード識別子によって示される位置に格納する親子関係配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
第１の親子関係配列により特定されるツリーを構成する部分ツリーを集計するために、コンピュータにより読み出し可能なコンピュータプログラムであって、
前記コンピュータに、
前記部分ツリーの頂点ノードを格納した頂点ノードリストを前記記憶装置中に生成するステップと、
前記第１の親子関係配列から、前記頂点ノードリストに格納されたノード識別子に対応する頂点ノードのそれぞれにより特定される部分ツリーを表す前記第１の親子関係配列中の部分を特定するステップと、
前記第１の親子関係配列中の部分のそれぞれについて、前記部分ツリーの頂点ノードをルート・ノードとして、ノード間の親子関係を表現する第２の親子関係配列を前記記憶装置中に生成するステップと、
前記生成された第２の親子関係配列を参照して、第２の親子関係配列の種別ごとに、生成された親子関係配列の個数をカウントし、前記個数を前記第２の親子関係配列の種別と関連付けて前記記憶装置中に記憶するステップと、実行させることを特徴とするコンピュータプログラム。
【請求項２２】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、ルート・ノード以外のノードである非ルート・ノードの各々に関連付けられた親ノードに付与されたノード識別子を、非ルート・ノードの各々に付与されたノード識別子によって示される位置に格納する親子関係配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
第１の親子関係配列により特定されるツリーの部分ツリーの順序をソートするために、前記コンピュータにより読み出し可能なコンピュータプログラムであって、
前記コンピュータに、
前記部分ツリーの頂点ノードを格納した頂点ノードリストを前記記憶装置中に生成するステップと、
前記第１の親子関係配列から、前記頂点ノードリストに格納されたノード識別子に対応する頂点ノードのそれぞれにより特定される部分ツリーを表す前記第１の親子関係配列中の部分を特定するステップと、
前記第１の親子関係配列中の部分のそれぞれについて、前記部分ツリーの頂点ノードをルート・ノードとして、ノード間の親子関係を表現する第２の親子関係配列を前記記憶装置中に生成するステップと、
前記生成された第２の親子関係配列を参照して、設定された評価基準にしたがって、前記頂点ノードリスト中の前記頂点ノードのノード識別子の順序を入れ替えるステップと、を実行させることを特徴とするコンピュータプログラム。
【請求項２３】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、子ノードをもつノードについて、それぞれのノード識別子と、当該子ノードをもつノードを親ノードとする子ノードの出現数との組を前記ノード識別子の順に格納する集計配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
前記集計配列に基づき、ルート・ノード以外のノードである非ルート・ノードの各々に関連付けられた親ノードに付与されたノード識別子を、非ルート・ノードの各々に付与されたノード識別子によって示される位置に格納する親子関係配列を生成するために、前記コンピュータにより読み出し可能なコンピュータプログラムであって、
前記コンピュータに、
前記集計配列中の出現数に基づき、ノード識別子を格納位置番号とする前記親子関係配列のための領域を記憶装置中に確保するステップと、
前記集計配列および前記親子関係配列のそれぞれにおいて、第１のポインタおよび第２のポインタを初期位置に配置するステップと、
前記集計配列中、前記第１のポインタが示すノード識別子と前記第２のポインタが示す格納位置番号から「１」を減じた値とが一致する場合に、前記第１のポインタが示すノード識別子を、前記親子関係配列において、前記第２のポインタが示す格納位置番号に対応する値として格納するとともに、前記集計配列中、前記第１のポインタが示す出現数を「１」だけ減じ、かつ、第１のポインタおよび第２のポインタを、その格納位置番号が増大するように移動させるステップと、
前記集計配列中、前記第１のポインタが示すノード識別子と前記第２のポインタが示す格納位置番号から「１」を減じた値とが一致しない場合に、前記集計配列において、前記第１のポインタに初期的に配置される第３のポインタを、その格納位置番号を減じるように移動させて、前記集計配列において、その出現数が「０」とならない位置を特定して、当該第３のポインタが示すノード識別子を、前記親子関係配列において、前記第２のポインタが示す格納位置番号に対応する値として格納するとともに、前記集計配列中、前記第３のポインタが示す出現数を「１」だけ減じ、かつ、第２のポインタを、その格納位置番号が増大するように移動させるステップと、を実行させることを特徴とするコンピュータプログラム。
【請求項２４】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、子ノードをもつノードについて、それぞれのノード識別子と、当該子ノードをもつノードを親ノードとする子ノードの出現数との組を前記ノード識別子の順に格納する集計配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
前記集計配列から、頂点ノードおよびその子孫ノードを含む部分ツリーを表わす部分配列を生成するために、前記コンピュータにより読み出し可能なコンピュータプログラムであって、
前記コンピュータに、
前記集計配列において、前記頂点ノードのノード識別子と、当該ノード識別子に関連付けられた出現数とに基づき、少なくとも子孫ノードとなるノードのノード識別子を初期的に算出するステップと、
前記集計配列において、格納位置番号が増大するように、ノード識別子を参照し、前記ノード識別子に対応するノードが、前記頂点ノードの子孫ノードとなるか否かを判断するとともに、当該集計配列のノード識別子に関連付けられた出現数を参照して、前記子孫ノードのノード識別子を更新するステップと、
前記頂点ノードの子孫ノードとなると判断されたノードのノード識別子と前記関連付けられた出現数との組を、部分配列として記憶装置中に生成するステップと、を実行させることを特徴とするコンピュータプログラム。
【請求項２５】
さらに、前記コンピュータに、
前記部分配列において、そのノード識別子から、先頭のノード識別子を減じて、標準形式の部分配列を、記憶装置中に生成するステップを実行させることを特徴とする請求項２４に記載のコンピュータプログラム。
【請求項２６】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、子ノードをもつノードについて、それぞれのノード識別子と、当該子ノードをもつノードを親ノードとする子ノードの出現数との組を前記ノード識別子の順に格納する集計配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
検索の対象である第１の集計配列により特定されるツリー中、検索キーとなるツリーと同一のトポロジーを有する部分ツリーを検索するために、コンピュータにより読み出し可能なコンピュータプログラムであって、
前記コンピュータに、
前記検索キーとなるツリーを表現する検索キー配列として、第２の集計配列を記憶装置中に生成するステップと、
前記検索キー配列中のノード識別子にオフセット値を加え、前記オフセット値が加えられたノード識別子と、前記第１の集計配列の中で前記オフセット値に応じてオフセットした範囲に存在する前記第１の集計配列中の部分に含まれるノード識別子とを比較するステップと、
前記比較により全てが一致した前記第１の集計配列中の部分のノード識別子とその出現数とを含む集計配列を検索結果として前記記憶装置中に生成するステップと、を実行させることを特徴とするコンピュータプログラム。
【請求項２７】
前記ノードが、データを表わす少なくとも一つの実体情報が関連付けられ、
さらに、前記コンピュータに、
前記比較により全てが一致した部分のノード識別子により特定されるノードに関連付けられた実体情報と、検索キー配列中のノード識別子により特定されたノードに関連付けられた実体情報とを、それぞれ比較するステップと、
前記第１の集計配列中の部分の全てのノード識別子により特定されたノードに関連付けられた実体情報が前記検索キー配列中のノード識別子により特定されたノードに関連付けられた実体情報と一致する場合、前記第１の集計配列中の部分のノード識別子とその出現数とを含む集計配列を検索結果として前記記憶装置に生成するステップと、を実行させることを特徴とする請求項２６に記載のコンピュータプログラム。
【請求項２８】
同じ世代のノードよりも子ノードを優先して、固有の連続する整数がノード識別子として、ルート・ノードを含むノードに付与され、
ノード間の親子関係が、子ノードをもつノードについて、それぞれのノード識別子と、当該子ノードをもつノードを親ノードとする子ノードの出現数との組を前記ノード識別子の順に格納する集計配列によって表現された、ツリー型データ構造のデータを備えたコンピュータにおいて、
前記集計配列に基づき、当該集計配列により特定されるツリーを構成する部分ツリーを集計するために、前記コンピュータにより読み出し可能なコンピュータプログラムであって、
前記コンピュータに、
前記部分ツリーの頂点ノードを格納した頂点ノードリストを、前記記憶装置中に生成するステップと、
前記集計配列において、前記頂点ノードのノード識別子と、当該ノード識別子に関連付けられた出現数とに基づき、少なくとも子孫ノードとなるノードのノード識別子を初期的に算出するステップと、
前記集計配列において、格納位置番号が増大するように、ノード識別子を参照し、前記ノード識別子に対応するノードが、前記頂点ノードの子孫ノードとなるか否かを判断するとともに、当該集計配列中のノード識別子に関連付けられた出現数を参照して、前記子孫ノードのノード識別子を更新するステップと、
前記頂点ノードの子孫ノードとなると判断されたノードのノード識別子とこのノード識別子に関連付けられた出現数との組を、部分配列として記憶装置中に生成するステップと、
前記部分配列において、各ノード識別子から前記部分配列中の先頭のノード識別子を減じることにより形成された標準形式の部分配列を記憶装置中に生成するステップと、
前記生成された標準形式の部分配列を参照して、前記標準形式の部分配列の種別ごとに、生成された前記標準形式の部分配列の個数をカウントし、前記個数を前記種別と関連付けて前記記憶装置中に記憶するステップと、を実行させることを特徴とするコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、記憶装置上に構築された、ツリー型データ構造を表現する配列から、ツリーを検索、集計、ソートする方法、当該方法を実現する情報処理装置、および、ツリーを検索、集計、ソートするためのプログラムに関する。
【背景技術】
【０００２】
データベースは種々の用途に用いられているが、中規模ないし大規模システムにおいては、論理的な矛盾が排除できるリレーショナルデータベース（ＲＤＢ）の使用が主流となっている。たとえば、ＲＤＢは飛行機の座席予約等のシステムに利用されている。この場合、キー項目を指定することにより、（多くの場合１件の）ターゲットを迅速に検索することもでき、或いは、予約の確定、キャンセル或いは変更などを行うことができる。また、各便の座席数はせいぜい数百であるため、特定の航空便の空席数を求めることも可能である。
【０００３】
このようなＲＤＢは、表形式データの取り扱いに適しているが、ツリー形式データの取り扱いには適していないことが知られている（例えば、非特許文献１を参照。）。
【０００４】
更に、アプリケーションの中には、表形式による表現よりもツリー形式による表現の方が適しているものが存在する。特に、近年、イントラネットやインターネットのアプリケーションのデータ標準として、ツリー型データ構造を採用するＸＭＬが普及している（ＸＭＬの詳細については、例えば、非特許文献２を参照。）。
【０００５】
しかし、ツリー型データ構造の取り扱い、例えば、ツリー形式データの検索は、一般に、大変効率が悪い。この効率の悪さの第１の理由は、データが各所のノードに分散して存在するため、データの存在すべき場所を直ちに特定することが困難である点にある。ＲＤＢでは、例えば、「年齢」というデータは、あるテーブルの「年齢」という項目だけに格納されている。しかし、ツリー型データ構造では、「年齢」というデータを保持するノードが各所に散在しているので、一般的には、ツリー型データ構造の全体を調べなければ、該当するデータを検索することができない。
【０００６】
効率の悪さの第２の理由は、検索の結果を表現するために時間がかかるという点にある。検索にヒットしたノード群を表現しようとすると、屡々、そのノードの子孫にあたるノードも表現しなければならないが、ＲＤＢＭＳとは異なりデータ構造が非定型であるため、子孫ノードを表現するために時間がかかる。
【０００７】
そこで、データベースの主流であるＲＤＢの利点をいかすため、従来、ツリー型データ構造をデータベース化するとき、ツリー形式データをＲＤＢ化する方法（例えば、特許文献１を参照。）が提案されている。ＲＤＢでは、データはテーブル（表）に分解して保持される。そのため、実際のツリー形式データをＲＤＢ化するには、ツリー形式データをテーブルに押し込める必要がある。しかし、様々のツリー型データ構造を取り扱うためには、その構造毎に個別にデータをテーブルに押し込め、システム設計を行わなければならない。したがって、ＲＤＢに基づくシステム構築は非常に手間のかかる作業である。
【０００８】
これに対して、ツリー形式データ、特に、ＸＭＬデータをそのままの形でデータベース化する方法も提案されている。ツリー型データ構造の場合、一つのノードに子孫ノードをぶら下げることができ、多様な表現が可能であるため、システム設計の手間を大幅に削減することができる。したがって、ＸＭＬのようなツリー構造を取り扱える技術を核として、ツリー構造データを処理することへのニーズが高まっている。
【０００９】
ＸＭＬデータをそのままの形でデータベース化する方法の一例のアプローチは、ツリー構造に記入されているデータのコピーを取り出し、例えば、「年齢」という項目であれば、「年齢」の検索用インデックスデータを別途保持する（例えば、特許文献２を参照。）。これにより、データ自身に属性を付加できるというＸＭＬデータのメリットを十分に活用すると共に、タグを用いて表現された各項目の関係構造をそのまま記憶できるようにしている。
【特許文献１】
特開２００３−２４８６１５号公報
【特許文献２】
特開２００１−１９５４０６号公報
【非特許文献１】
株式会社セック、"Karearea WhitePaper"、[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)１６、ハードディスク等の固定記憶媒体１８、ＣＤ−ＲＯＭ１９をアクセスするためのＣＤ−ＲＯＭドライバ２０、ＣＤ−ＲＯＭドライバ２０や外部ネットワーク（図示せず）と接続された外部端子との間に設けられたインタフェース（Ｉ／Ｆ）２２、キーボードやマウスからなる入力装置２４、ＣＲＴ表示装置２６を備えている。ＣＰＵ１２、ＲＡＭ１４、ＲＯＭ１６、外部記憶媒体１８、Ｉ／Ｆ２２、入力装置２４および表示装置２６は、バス２８を介して相互に接続されている。
【００４９】
本実施の形態にかかる、ツリー型データ構造を記憶装置上に構築するプログラム、及び、ツリー型データ構造を記憶装置上で変換するプログラムは、ＣＤ−ＲＯＭ１９に収容され、ＣＤ−ＲＯＭドライバ２０に読取られても良いし、ＲＯＭ１６に予め記憶されていても良い。また、いったんＣＤ−ＲＯＭ１９から読み出したものを、外部記憶媒体１８の所定の領域に記憶しておいても良い。或いは、上記プログラムは、ネットワーク（図示せず）、外部端子およびＩ／Ｆ２２を経て外部から供給されるものであっても良い。
【００５０】
また、本発明の実施の形態にかかる情報処理装置は、コンピュータシステム１０にツリー型データ構造を記憶装置上に構築するプログラム、及び、ツリー型データ構造を記憶装置上で変換するプログラムを実行させることにより実現される。
【００５１】
［ツリー型データ構造］
図２Ａは、ツリー形式データの一例であるＰＯＳデータの説明図であり、図２Ａは、このツリー形式データのデータ構造（即ち、トポロジー）及びデータ値を視覚的に表現した一例であり、図２Ｂは、同じツリー形式データをＸＭＬ形式で表現した一例である。図２に示されるようにツリー型データ構造は、ルート・ノード（本例では、ＰＯＳデータ）から始めて、各ノードで枝分かれしてリーフ・ノード（端点）に至るノードとアークの組み合わせによって表現される。各ノードには、項目名情報、すなわち、ノードのタイプと、項目値情報、すなわち、ノードの値が関連付けられ、図２Ａ、Ｂの例では、ＸＭＬ形式の
<shopName>フランス店</shopName>
に対応したノードは、「shopName（＝店名）」というノードタイプと「フランス店」というノード値が関連付けられている。この関連付けは、例えば、ノードタイプ及びノード値を記述する情報が格納されたノード情報格納領域へのポインタを、ノード識別子に随伴させることによって実現することができる。しかし、本発明は、ツリー型データ構造の実体的な値の取り扱い方によって限定されないことに注意する必要がある。
【００５２】
これに対して、ツリー型データ構造のデータの検索、集計、ソートを効率的に実行するためには、ツリー型データ構造のトポロジーを表現する手法、すなわち、記憶装置に展開する手法が非常に重要な役割を果たす。そこで、以下では、主として、ツリー型データ構造のトポロジーに関して説明する。
【００５３】
従来、このようなツリー型データ構造は、データを蓄えたノード間をポインタで接続することによって表現されている。しかし、ポインタ表現は、ポインタ値に必然性がないという欠点がある。即ち、ある場合には特定のノードＡがある番地（例えば、１００番地）に格納され、別の場合には同じノードＡが別の番地（例えば、２００番地）に格納されるので、ポインタ値が一定ではなく、ポインタ値は、本質的にノードの格納アドレスを表現するに過ぎない。そのため、例えば、ノードが深さ優先の規則に従ってポインタで接続されている場合、これらのノードを幅優先の規則に従ってポインタで再接続することは困難である。
【００５４】
これに対して、本発明者は、ツリー型データ構造のトポロジーがアークリストによって記述可能であることに着目した。アークリストとは、ノード間の親子関係を表すアークのリストである。図３Ａ〜Ｃは、アークリストを用いたツリー型データ構造の表現形式の一例の説明図である。図３Ａの例では、０、１０、２０、３０、４０、５０、６０、７０、８０、９０、１００及び１１０のノード識別子（ＩＤ）が付与された１２個のノードからなるツリー型データ構造が示されている。図３Ａはツリー型データ構造の全体を示している。図３Ａにおいて、丸形、ハート形などの図形の中央に記載された数字は、ノードＩＤを表し、矢印と矢印の側に記載された＜０，１０＞などの数字の対は、アークを表している。尚、ノードＩＤは、文字列には限られず、数値、特に、整数でもよい。図３Ｂは、親ノード（Ｆｒｏｍ−ＩＤ）から子ノード（Ｔｏ−ＩＤ）へのアークリストを示し、図３Ｃは、ノードＩＤとノードＴｙｐｅの対のリストからなるノードリストを示す。尚、ツリー型データ構造を表現するだけの目的のためにはノードリストが無くても構わない。原理的には、このようなアークリストを用いることによって、ノード間の関係をポインタによらずに直接的に記述することが可能である。
【００５５】
［「子→親」関係に基づく表現］
図３Ａ〜Ｃの例では、アークリストは、親ノードに子ノードを対応付ける「親→子」関係に基づいて記述されている。そのため、一つの親ノード、例えば、ルート・ノード０には、３個の子ノード１０、６０及び８０が存在するため、アークリストのＦｒｏｍ−ＩＤには、同じノードＩＤの０が３回出現している。つまり、親ノードを特定しても子ノードを特定することができないので、アークリストは、要素Ｆｒｏｍ−ＩＤの配列と要素Ｔｏ−ＩＤの配列により構成される。アークリストを使用する場合、あるノードは、Ｆｒｏｍ−ＩＤの配列と、Ｔｏ−ＩＤの配列の両方の配列に出現する。
【００５６】
これに対して、親子関係は、「子→親」関係によっても表現することが可能である。この場合、ノード間の親子関係は、ルート・ノード以外のノードである非ルート・ノードの各々と、関連付けられた親ノードと、の組の配列によって表現される。この「子→親」関係によって親子関係を表現する場合、「親→子」関係の場合には得られなかった重要な性質がある。即ち、一つの子ノードには必ず唯一の親ノードが対応するので、子ノードを特定することによって、この子ノードに対応する唯一の親ノードを直ちに特定することができる。つまり、アークリストは、実際には、要素Ｔｏ−ＩＤの配列だけを準備すればよい。この結果として、アークリストを格納するための記憶容量が削減される。この記憶容量の削減は、メモリへのアクセス回数が低減するという効果があるので、結果的に、処理の高速化が実現できる。
【００５７】
図４Ａ〜Ｃは、本発明の一実施例による「子→親」関係に基づくツリー型データ構造の表現方法の説明図である。図４Ａはツリー全体の説明図であり、図４Ｂは「子→親」関係に基づくアークリストである。図４Ｂのアークリストは、ルート・ノードに対する親ノードの格納領域を含んでいるので、ルート・ノードの親ノードとして、便宜的に"−"が設定されている。但し、ルート・ノードに対応する親ノードは存在しないので、図４Ｃに示されるように、「子→親」関係に基づくアークリストからルート・ノードに対する親ノードの格納領域を除いても構わない。このように本発明の一実施例では、ルート・ノード以外のノードである非ルート・ノードの各々に対して、非ルート・ノードの親ノードを関連付けることによりノード間の親子関係を表現する。そして、「子→親」表現された子のノードから親のノードのリストを辿ることでツリーのトポロジーを表現することができる。
【００５８】
このような「子→親」関係に基づくツリー型データ構造は、本発明の一実施例によれば、図５に示されるように、図１に示されたコンピュータシステム１０に、ルート・ノードを含むノードに固有のノード識別子を付与するノード定義ステップ５０１と、ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に、非ルート・ノードの各々の親ノードに付与されたノード識別子を関連付ける親子関係定義ステップ５０２と、を実行させることによってＲＡＭ１４上に構築される。このように、最初に、文字列、浮動小数、整数などの任意の識別情報によってノードにノード識別子を付与し、次に、「子→親」表現に基づいて親子関係を定義することによって、子ノードのノード識別子から親ノードのノード識別子を引く（ルックアップする）ことでツリーのトポロジーを表現することができる。
【００５９】
［ノード識別子］
好ましい一実施例によれば、ノード定義ステップはノード識別子として数値を使用し、より好ましくは、連続する整数を使用し、更に好ましくは、０又は１からの整数連番を使用する。これにより、ノード識別子から、そのノードに対応する親ノードのノード識別子が格納されているアドレスを簡単に取得することができるので、子ノードのノード識別子から親ノードのノード識別子を引く処理を高速化することができる。
【００６０】
ツリー型データ構造のノードにノード識別子として順序付きの番号を付与してノード間の親子関係を表現する場合、番号の付与順序に規則を定めることによって、その後のツリー型データ構造の取り扱いが容易になるという利点がある。本発明によれば、この番号の付与順序の規則として、同じ世代のノードよりも子ノードを優先する深さ優先モードと、子ノードよりも同じ世代のノードを優先する幅優先モードが利用される。
【００６１】
図６Ａ〜Ｃは、本発明の一実施例によりＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。図６Ａには、各ノードにＩＤ番号が付与されたツリー構造型データが示され、図６Ｂには、変換規則が示され、図６Ｃには、各ノードに整数連番が付与されたツリー構造型データが示されている。本例の変換規則は、深さ優先で連続番号を付与する規則であり、具体的には、複数の子ノードが存在する場合、長子（一番上の兄）ノードに最小番号を付与し、末子（一番下の弟）ノードに大きい番号を付与し、かつ、兄弟ノードよりも子ノードを優先して番号を付与する。本例では、昇順に番号付けをしているが、降順に番号付けをしてもよい。
【００６２】
また、図７Ａ〜Ｃは、本発明の他の一実施例によりＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。図７Ａには、各ノードにＩＤ番号が付与されたツリー構造型データが示され、図７Ｂには、変換規則が示され、図７Ｃには、各ノードに整数連番が付与されたツリー構造型データが示されている。本例の変換規則は、幅優先で連続番号を付与する規則であり、具体的には、複数の子ノードが存在する場合、長子（一番上の兄）ノードに最小番号を付与し、末子（一番下の弟）ノードに大きい番号を付与し、かつ、子ノードよりも兄弟ノードを優先して番号を付与する。本例では、昇順に番号付けをしているが、降順に番号付けをしてもよい。
【００６３】
このようにノード識別子として番号を使用すると、ノード番号から直ちに、即ち、Ｏ（１）のオーダーで、そのノードに関する格納値が格納されているアドレスを引くことができる。また、親子関係を「子→親」表現することによって、子ノードから親ノードを直ちに、即ち、Ｏ（１）のオーダーで引くことができる。
【００６４】
［深さ優先モード］
本発明の一実施例によれば、図６Ｃに示されるような深さ優先に基づくツリー型データ構造は、図１に示されたコンピュータシステム１０に、
同じ世代のノードよりも子ノードを優先して、ルート・ノードを含むノードに固有の連続する整数を付与するノード定義ステップと、
ルート・ノード以外のノードである非ルート・ノードの各々に付与された整数の順に、非ルート・ノードの各々の親ノードに付与された整数を並べることにより形成される配列を記憶装置に格納する親子関係定義ステップと、
を実行させることによって、記憶装置上に構築される。これにより、ノードは深さ優先で連続整数が付与され、ノード間の親子関係は「子→親」関係の配列によって表現される。
【００６５】
図８は、本発明の一実施例による深さ優先に基づくノード定義処理のフローチャートである。このノード定義処理は、コンピュータシステム１０に
最初にルート・ノードに番号を付与するステップ８０１と、
既に番号が付与されたあるノードに唯一の子ノードが存在する場合には、当該子ノードに当該あるノードに付与された番号の次の番号を付与するステップ８０２と、
既に番号が付与されたあるノードに複数の子ノードが存在する場合には、当該複数の子ノードの間の兄弟関係に従って、弟ノードは直上の兄ノードの全ての子孫ノードに番号が付与された後に次の番号が付与されるように、一番上の兄ノードから一番下の弟ノードまで番号を付与するステップ８０３と、
を実行させる。これにより、深さ優先モードで同一の親ノードから派生した複数の子ノードの間に兄弟関係が定義される。
【００６６】
図９は、本発明の一実施例により図６Ｃに示された深さ優先のツリー型データ構造から作成された「子→親」表現に基づく親子関係の配列の説明図である。同図にサブツリー１又はサブツリー２として示されているように、深さ優先で連続番号が付与されたノードの親子関係を「子→親」関係に基づいて配列表現すると、あるノードの子孫ノードが連続領域に出現するという優れた性質が得られる。
【００６７】
本発明の一実施例では、深さ優先モードの優れた性質を利用することにより、配列から、あるノードに付与された整数以上の値が格納されている連続領域を抽出することにより、あるノードの全ての子孫ノードを特定する。これにより、あるノードの子孫ノードを表すノード群が配列内の連続ブロックとして獲得できる。例えば、連続ブロックのサイズを「ｍ」とすると、あるノードの全ての子孫ノードを特定するための処理速度は、Ｏ（ｍ）のオーダーになる。
【００６８】
既に説明したように、ノード間の親子関係は、「子→親」関係の配列の他に、「親→子」関係の配列によっても表現できる。図１０は、図６Ｃに示された深さ優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。一つの親ノードに対して複数の子ノードが存在し得るので、親子関係の配列は、各ノードに対する子ノードの番号が格納されている領域を示すための配列Ａｇｇｒと、子ノードの番号が格納されている配列Ｐ→Ｃの二つの配列により構成される。例えば、配列Ａｇｇｒの先頭から２番目の要素Ａｇｇｒ［１］の値は”３”であり、これは、ノード［１］に対する子ノードの番号は、配列Ｐ→Ｃの要素Ｐ→Ｃ［３］以降に格納されていることを表している。これにより、ノード［０］、即ち、ルート・ノードに対する子ノードは、配列Ｐ→Ｃの先頭から３個の要素、Ｐ→Ｃ［０］の１、Ｐ→Ｃ［１］の６、及びＰ→Ｃ［２］の８であることがわかる。
【００６９】
この「親→子」表現に基づく親子関係の配列の求め方を説明する。
（１）ノードの番号が配列Ｐ→Ｃの最大の添字（＝１１）と一致する場合、このノードに属する子ノードは存在しない。したがって、処理は継続されない。
（２）同図に太字で表された親ノードの番号からＡｇｇｒ値を求める。このＡｇｇｒ値は、配列Ｐ→Ｃの開始点を表す。
（３）太字で表された親ノード番号＋１に対応するＡｇｇｒ値を求める。このＡｇｇｒ値−１が配列Ｐ→Ｃの終了点である。
【００７０】
例えば、ノード０の子ノードの開始点は、Ａｇｇｒ［０］、即ち、０であり、終了点は、Ａｇｇｒ［１］−１、即ち、３−１＝２である。したがって、ノード０の子ノードは、配列Ｐ→Ｃの０〜２番目の要素、即ち、１、６及び８である。
【００７１】
或いは、「親→子」表現に基づく親子関係は、より単純に、親ノード番号の配列と、対応する子ノード番号の配列と、の二つの配列により表現することも可能である。しかし、この配列を利用して親子関係を見つけるためには、親ノードの番号を検索しなければならないので、即ち、ｌｏｇ（ｎ）のアクセス時間を要するので効率が悪い。
【００７２】
［幅優先モード］
本発明の一実施例によれば、図７Ｃに示されるような幅優先に基づくツリー型データ構造は、図１に示されたコンピュータシステム１０に、
子ノードよりも同じ世代のノードを優先して、ルート・ノードを含むノードに固有の連続する整数を付与するノード定義ステップと、
ルート・ノード以外のノードである非ルート・ノードの各々に付与された整数の順に、非ルート・ノードの各々の親ノードに付与された整数を並べることにより形成される配列を記憶装置に格納する親子関係定義ステップと、
を実行させることによって、記憶装置上に構築される。これにより、ノードは幅優先モードで連続整数が付与され、ノード間の親子関係は「子→親」関係の配列によって表現される。
【００７３】
図１１は、本発明の一実施例による幅優先に基づくノード定義処理のフローチャートである。このノード定義処理は、コンピュータシステム１０に、
各ノードがルート・ノードから何世代目のノードであるか、及び、各世代に含まれるノード数を算出するステップ１１０１と、
最初にルート・ノードに番号を付与するステップ１１０２と、
ある世代に含まれる全てのノードに番号が付与されたならば、当該ある世代の次の世代にノードが存在しなくなるまで、当該次の世代に含まれる全てのノードに対して、親ノードが異なる場合には、当該親ノードに番号が付与された順番に当該ノードに番号を付与し、当該親ノードが同一である場合には、当該親ノードから派生した複数の子ノードの間に兄弟関係を定義し、一番上の兄ノードから一番下の弟ノードまで直前に付与された番号の次の番号から連続的に変化する固有の整数を順に付与するステップ１０１３と、
を実行させる。これにより、幅優先モードで同一の親ノードから派生した複数の子ノードの間に兄弟関係が定義される。
【００７４】
図１２は、本発明の一実施例により図７Ｃに示された幅優先のツリー型データ構造から作成された「子→親」表現に基づく親子関係の配列の説明図である。同図に示されているように、幅優先で連続番号が付与されたノードの親子関係を「子→親」関係に基づいて配列表現すると、あるノードの子ノードは連続領域に出現するという優れた性質が得られる。これは、幅優先モードで連続番号が付与されたノードの親子関係を「子→親」関係に基づいて配列表現すると、親ノードに付与された番号が配列中に順序付き（昇順又は降順）で出現することによる。
【００７５】
したがって、本発明の一実施例では、幅優先モードの優れた性質を利用することにより、配列から、あるノードに付与された整数と同じ値が格納されている連続領域を抽出することにより、あるノードの全ての子ノードを特定する。これにより、あるノードの子ノードを、例えば、二分探索などの手法を用いて検索することが可能であり、即ち、Ｏ（ｌｏｇ（ｎ））のオーダーで検索することが可能になる。
【００７６】
既に説明したように、ノード間の親子関係は、「子→親」関係の配列の他に、「親→子」関係の配列によっても表現できる。図１３は、図７Ｃに示された幅優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。図１３に示すように、一つの親ノードに対して複数の子ノードが存在し得るので、親子関係の配列は、各ノードに対する子ノードの番号が格納されている領域を示すための配列Ａｇｇｒと、子ノードの番号が格納されている配列Ｐ→Ｃの二つの配列により構成される。例えば、配列Ａｇｇｒの先頭から２番目の要素Ａｇｇｒ［１］の値は”３”であり、これは、ノード［１］に対する子ノードの番号は、配列Ｐ→Ｃの要素Ｐ→Ｃ［３］以降に格納されていることを表している。これにより、ノード［０］、即ち、ルート・ノードに対する子ノードは、配列Ｐ→Ｃの先頭から３個の要素、Ｐ→Ｃ［０］の１、Ｐ→Ｃ［１］の２、及び、Ｐ→Ｃ［２］の３であることがわかる。
【００７７】
この「親→子」表現に基づく親子関係の配列の求め方を説明する。
（１）ノードの番号が配列Ｐ→Ｃの最大の添字（＝１１）と一致する場合、このノードに属する子ノードは存在しない。したがって、処理は継続されない。
（２）同図に太字で表された親ノードの番号からＡｇｇｒ値を求める。このＡｇｇｒ値は、配列Ｐ→Ｃの開始点を表す。
（３）太字で表された親ノード番号＋１に対応するＡｇｇｒ値を求める。このＡｇｇｒ値−１が配列Ｐ→Ｃの終了点である。
【００７８】
例えば、ノード０の子ノードの開始点は、Ａｇｇｒ［０］、即ち、０であり、終了点は、Ａｇｇｒ［１］−１、即ち、３−１＝２である。したがって、ノード０の子ノードは、配列Ｐ→Ｃの０〜２番目の要素、即ち、１、２及び３である。
【００７９】
［頂点ノードおよび部分ツリー群］
ツリー型データ構造のデータを検索、集計、ソートする際に、ツリーデータの全体の中で特定の部分を処理の対象、例えば、検索の対象範囲とする場合がある。本発明者は、複数のノードを含む特定の部分を代表する一つのノードを導入することにより、種々の処理を効率化する手法を提案した。次に、この手法について詳述する。
【００８０】
ツリー型データ構造をもつツリーデータにおいて、ルート・ノードに最も近いノードの値で、当該ノードおよびそのノードから枝分かれしてリーフ・ノード（端点）に至るまでの全てのノードを表現することを考える。ここで、あるノードおよびそのノードから枝分かれしてリーフ・ノードに至るまでのノード群を、部分ツリーと称する。また、上記ノード（ルート・ノード）に最も近いノードを頂点ノードと称する。
【００８１】
図１４Ａは、前述した幅優先モードに基づくツリー型データ構造、図１４Ｂは、当該ツリー型データ構造を、「子→親」表現に基づく親子関係の配列を示す図である。たとえば、頂点ノード［４］は、ノード識別子｛４，８，９｝を含み、頂点ノード［６］は、ノード識別子｛６｝を含み、また、頂点ノード［３］は、ノード識別子｛３，７，１０，１１｝を含む。このような、複数の頂点ノードからなる配列を、頂点ノードリストと称する。頂点ノードリストにより複数の部分ツリーを指定でき、指定された複数の部分ツリーを部分ツリー群と称する。
【００８２】
以下、頂点ノードリストを、［ａ，ｂ，・・・］と表す。ここに、「ａ」、「ｂ」、・・・は、頂点ノードに対応するノード識別子である。頂点ノードリストを構成する頂点ノードの各々を展開して、当該頂点ノードを頂点とする部分ツリーに含まれるすべてのノードのノード識別子を求めることを考える。求められたノード識別子のリストにおいて、あるノード識別子は１つしか存在しない場合、すなわち、ノード識別子が重複して出現しない場合、このような部分ツリー群を、「正規部分ツリー群」と称する。そうでないような部分ツリー群を、「非正規部分ツリー群」と称する。
【００８３】
正規部分ツリー群であっても、非正規部分ツリー群であっても、頂点ノードリストによって、頂点ノードおよびその子孫ノードからなる部分ツリー群を特定することができる。たとえば、図１５Ａに示すように、頂点ノードリスト［４，６，３］により、図１５Ｂに示すような部分ツリー群（部分ツリー｛４，８，９｝、｛６｝、｛３，７，１０，１１｝）が特定される。
【００８４】
頂点ノードリストにより特定される部分ツリー群は、検索、集計、ソート、集合演算の対象とすることができる。
【００８５】
たとえば、図１５Ａ、Ｂの例で、「ハート形」のノードを含む部分ツリーを検索すると、図１６Ｂに示すような部分ツリー群が得られる。図１６Ａは、この部分ツリー群を表わす頂点ノードリストである。
【００８６】
また、各部分ツリーに属するノード数を集計すると、図１７Ｂに示すようになる。図１７Ａにおいて、配列１７０１は頂点ノードリスト、配列１７０２は、各頂点ノードにより特定される部分ツリーに属するノード数を示す配列である。
【００８７】
たとえば、ソートとして、各部分ツリーに属するノード数によるソートを考えることができる。図１８Ａ中、配列１８０１は、ソートされた頂点ノードリスト、配列１８０２は、頂点ノードリストにより特定される部分ツリーに属するノード数を示す配列である。また、図１８Ｂは、部分ツリーがノード数にしたがってソートされた状態を示す。
【００８８】
さらに、複数の部分ツリー群の間の集合演算として、論理積について説明する。図１４Ａ、Ｂに示すツリーにおいて、図１９Ｂに示す部分ツリー群（対応する頂点ノードリストを図１９Ａに示す）と、図１９Ｄに示す部分ツリー群（対応する頂点ノードリストを図１９Ｃに示す）との論理積を考える。
【００８９】
図１９Ｂにおける、ノード識別子「４」の頂点ノードにて特定される部分ツリー１９０１と、図１９Ｄにおける、ノード識別子「１」の頂点ノード識別子にて特定される部分ツリー１９１１とを比較すると、部分ツリー１９０１は、部分ツリー１９０２に包含される。図１９Ｂにおける部分ツリー１９０２と包含関係をもつような部分ツリーは、図１９Ｄに示す部分ツリー群には存在しない。また、図１９Ｂにおけるノード識別子「３」の頂点ノードにて特定される部分ツリー１９０３と、図１９Ｄにおける、ノード識別子「７」にて特定される部分ツリー１９１３とを比較すると、部分ツリー１９１３は、部分ツリー１９０３に包含される。その結果、論理積演算の結果を示す頂点ノードリストは、図２０Ａに示すように、［４，７］となる。図２０Ｂは、論理積演算の結果に対応する部分ツリー群である。
【００９０】
図１６Ａ〜図２０Ｂにより理解できるように、頂点ノードリスト（集計においては、これに加えて、頂点ノードリストと同一サイズの、集計結果（ノード数）を格納する配列）によって、それぞれの処理や演算の結果を表わすことができる。
【００９１】
［標準形式］
あるノードおよびそのノードから枝分かれしてリーフ・ノードに至る部分ツリー群における、ノードおよびその間の接続関係を、本明細書において「トポロジー」と称する。たとえば、図２１に示すツリーがあり、このツリー２１００の構造は、深さ優先モードの「子→親」表現に基づく親子関係の配列（符号２１０１参照：図面においては、「Ｃ−＞Ｐ」と表記するが、明細書においては、以下、「Ｃ−Ｐ配列」と称する。）により表わされると考える。
【００９２】
頂点ノードリスト２１０２により特定される部分ツリーを考える。図２２において、部分ツリーＡ〜Ｃ（符号２２０１〜２２０３）が、ぞれぞれ、図２１の頂点ノードリスト２１０２により特定される部分ツリーに相当する。これら部分ツリー群において、部分ツリーＡ（符号２２０１参照）および部分ツリーＢ（符号２２０２参照）は、そのノードおよびノード間の接続関係において同一、つまり、トポロジーが同一であるということができる。また、頂点ノード２１０２で表わされる部分ツリー群には、２種類のトポロジーが含まれるということができる。
【００９３】
このようにトポロジーを比較し、トポロジーの同一性を判断するためには、上記部分ツリーのトポロジーを標準化して表現するのが望ましい。以下、部分ツリーのトポロジーの標準化について説明する。ここに、標準化されたトポロジーの表現を、本明細書において「標準形式」と称する。
【００９４】
図２３Ａに示すように、部分ツリーＡ（符号２２０１参照）と部分ツリーＢ（符号２２０２参照）とは、明らかに同一のトポロジーを有している。しかしながら、Ｃ−Ｐ配列２１０３を参照すると、部分ツリーＡを表現する部分の要素は、［１，２，２］であり、その一方、部分ツリーＢを表現する部分の要素は、［７，８，８］であり、これらは一致しない。そこで、部分ツリーを、その頂点ノードを、ルート・ノードとして、深さ優先モードの「子→親」表現に基づく親子関係の配列として表現すれば（図２３Ｂの符号２３０１、２３０２参照）、配列の要素を比較することで、双方のトポロジーが同一であると判断することができる。このように、部分ツリーを、その頂点ノードを、ルート・ノードとして、深さ優先モードの「子→親」表現に基づく親子関係の配列として表現することを標準化と称する。
【００９５】
以下、標準化の際に実行される処理について説明する。標準化は、概略的には、
それぞれが特定のノードおよびその子孫ノードを含む１以上のノード群である部分ツリーを表わすために、当該特定のノードを頂点ノードとして、そのノード識別子を格納した頂点ノードリストを、記憶装置中に生成するステップと、
頂点ノードリストに格納されたノード識別子に対応する頂点ノードのそれぞれにより特定される部分ツリーを表す、第１の配列中の部分を特定するステップと、
第１の配列中の部分のそれぞれについて、部分ツリーの頂点ノードが、ルート・ノードとなるように、ノード間の親子関係が、頂点ノード以外のノードである非頂点ノードの各々に付与されたノード識別子に対応する、非頂点ノードの各々に関連付けられた親ノードのノード識別子により表現された、標準形式の第２の配列を、記憶装置中に生成するステップと、を備える。ここで、第１の配列とは、Ｃ−Ｐ配列をいう。
【００９６】
より詳細には、図２４に示すように、ＣＰＵ１２は、ＲＡＭ１４などのメモリに格納されたＣ−Ｐ配列を参照して、当該Ｃ−Ｐ配列中、処理対象となる部分ツリーに相当する部分配列を特定する（ステップ２４０１）。より具体的には、Ｃ−Ｐ配列において、部分ツリーの頂点ノードが示す位置を初期位置としたポインタを一つずつ下方（ノード識別子が増大する方向）に移動し、ポインタが示すＣ−Ｐ配列の値が、頂点ノードに対応するＣ−Ｐ配列の値よりも大きければ、そのポインタが示すノード識別子に対応するノードは、部分ツリーに含まれる（図２５の符号２５０１参照）。
【００９７】
次いで、ＣＰＵ１２は、部分配列において、頂点ノードの親のノード識別子を示す、先頭の要素を、「−１」に変換する（ステップ２４０２）。
【００９８】
次いで、ＣＰＵ１２は、２番目以降の要素の値から、それぞれ、頂点ノードのノード識別子の値をオフセットとして差し引いた値を算出し、これを、当該要素の値として、部分配列に格納する（ステップ２４０３）。ステップ２４０３の処理は、部分配列において２番目以降の全ての要素に対して実行される（ステップ２４０４、２４０５参照）。これにより、図２５の例では、［７，８，８］という要素を持っていた部分配列が、標準化により［−１，０，０］という部分配列に変換される（符号２５１０参照）。ＣＰＵ１２は、標準化された部分配列を、ＲＡＭ１４などのメモリに格納する。
【００９９】
なお、図２４の処理において、ステップ２４０２を省略し、ステップ２４０３において、部分配列の先頭の要素から、順次、その値に頂点ノードのノード識別子を減算しても良い。
【０１００】
［昇順形式］
また、それぞれの親ノードが、何個の子ノードを持つかを示す配列を考えることができる。この配列を昇順形式の配列と称する。昇順形式の配列には、以下のような利点がある。
（１）昇順形式の配列においては、親ノードの番号順に昇順で並べられているため、ルート・ノードに近い側から親ノードのノード識別子が出現し、昇順形式相互の比較では、よりルート・ノードに近い側から比較される。
２つの昇順形式の配列を先頭から比較すると、よりルートに近い側から比較されることになる。
（２）比較が効率的に行える。
【０１０１】
第１に、１つの親ノードに２つ以上の子ノードが付属することが多い場合に、配列のサイズを小さくすることができるからである。
【０１０２】
第２に、昇順の配列は比較しやすいことによる。
【０１０３】
このため、昇順形式は、後述するトポロジーのソートを行うのに適する。特に、トポロジーのソートに適する最大の理由は、昇順形式はルート・ノードに近い側から記述されるため、より重要であるルート・ノードに近い側の特長が優先されて、トポロジーの大小が決定されるからである。
【０１０４】
上述した昇順形式の配列を、記憶装置中に構築するためには、
同じ世代よりも子ノードを優先して、ルート・ノードを含むノードに、ノード識別子として、固有の連続する整数を付与するステップと、
子ノードをもつノードについて、それぞれのノード識別子と、当該子ノードをもつノードを親ノードとする子ノードの出現数との組を、ノード識別子の順に配置した昇順形式の集計配列を、記憶装置中に生成するステップと、を備えることで実現できる。
【０１０５】
また、Ｃ−Ｐ配列（第１の配列）から昇順形式の配列を生成するためには、第１の配列中のノード識別子と、第１の配列においてノード識別子が出現する数を示す出現数との組を、第１の配列中のノード識別子の順に配置した昇順形式の集計配列を、記憶装置中に生成するステップを備えることで実現することができる。
【０１０６】
図２６は、昇順形式の配列を説明するための図である。図２６において、標準化された部分ツリー（図２２における部分ツリーＣに相当）２６０１の「子→親」表現を表わす親子関係の配列（標準化されたＣ−Ｐ配列）は、符号２６０２に示すようなものとなる。ＣＰＵ１２は、Ｃ−Ｐ配列の要素を参照して、出現値（ノード識別子）と出現回数との組からなる集計配列を作成する（ステップ２６１１）。ここで、集計配列において、出現値は昇順に格納される。これにより、集計配列２６０３ができる。「出現値＝−１」については、常に、その出現数は「１」であるため、ＣＰＵ１２は、「出現値＝−１」と「出現数＝１」との組を配列から削除する（ステップ２６２２）。このような処理の結果、集計配列２６０４を得ることができる。ＣＰＵ１２は、得られた集計配列２６０４を、ＲＡＭ１４などのメモリに格納する。
【０１０７】
標準化されたＣ−Ｐ配列と、昇順形式の集計配列とは１対１に対応し、相互に変換することができる。標準化されたＣ−Ｐ配列から集計配列への変換（集計配列の生成）は上述した通りである。集計配列から標準化されたＣ−Ｐ配列への変換（集計配列に基づくＣ−Ｐ配列の生成）について、以下に述べる。
【０１０８】
図２７において、ツリー２７０１は、出現値と出現回数の組からなる昇順形式の集計配列２７０２を用いて表現され得る。また、これは、Ｃ−Ｐ配列２７０３を用いても表現され得る。集計配列からＣ−Ｐ配列への変換処理においては、「主流」という概念を導入する。「主流」とは、Ｃ−Ｐ配列において、先頭の要素（ノード識別子に相当する格納位置番号＝０の要素）を除き、自己の格納位置番号より「１」だけ少ない格納値を持つような、連続したブロックをいう。たとえば、Ｃ−Ｐ配列において、符号２７１１、２７１２にて示すブロックが、主流となる。ツリー２７０１において、上記符号２７１１、２７１２で示すブロックを構成するノードを連結するアークを破線で示している。また、自己の格納位置番号より「１」だけ少ない格納値をもつノードでない場合は、主流の先頭ノードであると考えることができる。
【０１０９】
集計配列からＣ−Ｐ配列（第１の配列）への変換は、概略的には、
集計配列中の出現数に基づき、ノード識別子を格納位置番号とする第１の配列のための領域を、記憶装置中に確保するステップと、
集計配列および第１の配列のそれぞれにおいて、第１のポインタおよび第２のポインタを初期位置に配置するステップと、
集計配列中、第１のポインタが示すノード識別子と、第２のポインタが示す格納位置番号から「１」を減じた値とが一致する場合に、第１のポインタが示すノード識別子を、第１の配列において、第２のポインタが示す格納位置番号に対応する値として格納するとともに、集計配列中、第１のポインタが示す出現数を「１」だけ減じ、かつ、第１のポインタおよび第２のポインタを、その格納位置番号が増大するように移動させるステップと、
集計配列中、第１のポインタが示すノード識別子と、第２のポインタが示す格納位置番号から「１」を減じた値とが一致しない場合に、集計配列において、第１のポインタに初期的に配置される第３のポインタを、その格納位置番号を減じるように移動させて、最初に、集計配列において、その出現数が「０」とならない位置を特定して、当該第３のポインタが示すノード識別子を、第１の配列において、第２のポインタが示す格納位置番号に対応する値として格納するとともに、集計配列中、第３のポインタが示す出現数を「１」だけ減じ、かつ、第２のポインタを、その格納位置番号が増大するように移動させるステップと、を備えている。
【０１１０】
図２８は、集計配列からＣ−Ｐ配列への変換処理を示すフローチャートである。図２８に示すように、ＣＰＵ１２は、ＲＡＭ１４などのメモリ上に、Ｃ−Ｐ配列のための領域を確保し、Ｃ−Ｐ配列の先頭の要素として「−１」を格納する（ステップ２８０１）。次いで、ＣＰＵ１２は、昇順形式の集計配列の先頭に第１のポインタをセットするとともに、Ｃ−Ｐ配列の２番目の格納位置（格納位置番号＝１）に第２のポインタをセットする（ステップ２８０２）。図２９Ａは、ステップ２８０１およびステップ２８０２の処理が終了した状態を示す図である。図２９Ａおよび以後説明に引用する図面において、第１のポインタは「矢印１」と表記され、また、第２のポインタは「矢印２」と表記される。また、後述する第３のポインタは、「矢印３」と表記される。また、Ｃ−Ｐ配列の先頭の要素として「−１」が格納される。
【０１１１】
ＣＰＵ１２は、Ｃ−Ｐ配列において、第２のポインタが示す格納位置番号（ノード識別子）に「１」を減じた値が、第１のポインタが示す集計配列中の出現値と等しいか否かを判断する（ステップ２８０３）。ステップ２８０３でイエス(Yes)と判断された場合には、ＣＰＵ１２は、第１のポインタが示す集計配列中の出現値を、Ｃ−Ｐ配列中、第２のポインタが示す位置に格納する（ステップ２８０４）。次いで、ＣＰＵ１２は、第１のポインタが示す集計配列中の出現回数を「１」だけ減じるとともに（ステップ２８０５）、第１のポインタおよび第２のポインタを、１つだけ下方に移動する（つまり、ポインタが示す格納位置番号が「１」だけ増大するように移動する）（ステップ２８０６）。第２のポインタの位置が、Ｃ−Ｐ配列の末尾を超えていなければ（ステップ２８０７でノー(No)）、ステップ２８０３に戻る。
【０１１２】
図２９Ｂに示すように、第２のポインタ（矢印２）が示すＣ−Ｐ配列の格納位置番号は「１」であり、その値に「１」を減じると、第１のポインタが示す集計配列中の出現値「０」と等しい。したがって、ステップ２８０３でイエス(Yes)と判断されて、第１のポインタが示す集計配列中の出現値「０」が、Ｃ−Ｐ配列中、第２のポインタが示す位置に格納され、かつ、集計配列中、第１のポインタが示す出現回数が「１」だけ減じられる。その後、第１のポインタおよび第２のポインタが、それぞれ、格納位置番号が「１」だけ増大するように下方に移動される。
【０１１３】
図３０Ａ、Ｂは、図２９Ｂに示すＣ−Ｐ配列への値の格納に引き続く処理の状況を示す。これらの場合においても、ステップ２８０４〜２８０６の処理が実行される。
【０１１４】
図３１Ａの場合には、第２のポインタが示すＣ−Ｐ配列の格納位置番号は「４」であり、その値に「１」を減じると「３」となる。その一方、第１のポインタが示す集計配列中の出現値は「７」であるため、これらは一致しない（ステップ２８０３でノー(No)）。
【０１１５】
この場合には、ＣＰＵ１２は、集計配列の位置を特定する第３のポインタを生成し、そのポインタを、第１のポインタの位置から、遡らせて（つまり、格納位置番号を減じる方向に移動させ）、最初に、「出現回数≠０」となるような位置を特定する（ステップ２８０８）。図３１Ａの例では、第３のポインタを、第１のポインタの位置から、１つだけ格納位置番号を減じる方向に移動させると、当該第３のポインタが示す出現回数は、「２」となるため、第３のポインタは、この位置で停止する。
【０１１６】
次いで、ＣＰＵ１２は、第３のポインタが示す集計配列中の出現値を、Ｃ−Ｐ配列中、第２のポインタが示す位置に格納する（ステップ２８０９）。ＣＰＵ１２は、第３のポインタが示す集計配列中の出現回数を「１」だけ減じるとともに（ステップ２８１０）、第２のポインタを、１つだけ下方に移動する（つまり、ポインタが示す格納位置番号が「１」だけ増大するように移動する）（ステップ２８１１）。
【０１１７】
図３１Ｂ、図３２Ａ、Ｂに示す場合には、ステップ２８０３でノー(No)と判断され、ステップ２８０８〜２８１１が実行され、Ｃ−Ｐ配列中、第２のポインタが示す位置に、第３のポインタが示す集計配列中の出現値が格納される。
【０１１８】
引き続く図３３Ａ、Ｂに示す場合には、ステップ２８０３でイエス(Yes)と判断され、ステップ２８０４〜２８０６が実行され、Ｃ−Ｐ配列中、第２のポインタが示す位置に、第１のポインタが示す集積配列中の出現値が格納される。さらに引き続く図３４Ａ、Ｂに示す場合には、ステップ２８０３でノー(No)と判断され、ステップ２８０８〜２８１１が実行され、Ｃ−Ｐ配列中、第２のポインタが示す位置に、第３のポインタが示す集計配列中の出現値が格納される。たとえば、図３４Ｂに関して、ステップ２８０８〜２８１１の処理の後、第２のポインタは、Ｃ−Ｐ配列の末尾を超えた位置に移動する。このため、この時点で処理は終了する。
【０１１９】
このようにして、昇順形式の集計配列に基づいて、標準化されたＣ−Ｐ配列を生成することが可能となる。また、昇順形式の集計配列と、標準化されたＣ−Ｐ配列とは、表現形態が異なるだけで、同じ情報（ツリーの構造の情報）を含むことがわかる。したがって、以下に説明する検索、集計、ソート処理において、使い易い方を採用して、処理を進めることが可能となる。
【０１２０】
［昇順形式の部分ツリー］
上述した昇順形式の集計配列においては、末端のノード（リーフ・ノード）のノード識別子は、出現値として出現しない。たとえば、図４８Ａに示すツリーは、昇順形式の集計配列を利用して、図４８Ｂのように表わされる（符号４８００参照）。図４８Ａから理解できるように、このツリーにおいて、リーフ・ノードのノード識別子は、「３」、「５」、「６」、「１０」および「１１」となる。図４８Ｂに示す部分配列の出現値の項目を参照すると、上記ノード識別子「３」、「５」、「６」、「１０」および「１１」は出現していない。また、図４８Ｂに示す部分配列を参照すれば理解できるように、出現回数の総和は、「全てのノード数−１」に等しい。
【０１２１】
以下、昇順形式の部分ツリーの範囲の特定、および、昇順形式の部分ツリーの標準形式について説明する。
【０１２２】
昇順形式の配列において部分ツリーを特定する方法は、概略的に、
集計配列において、頂点ノードのノード識別子と、当該ノード識別子に関連付けられた出現数とに基づき、少なくとも子孫ノードとなるノードのノード識別子を初期的に算出するステップと、
集計配列において、格納位置番号が増大するように、ノード識別子を参照し、ノード識別子に対応するノードが、頂点ノードの子孫ノードとなるか否かを判断するとともに、当該集計配列のノード識別子に関連付けられた出現数を参照して、子孫ノードのノード識別子を更新するステップと、
頂点ノードの子孫ノードとなると判断されたノードのノード識別子と関連付けられた出現数との組を、部分配列として記憶装置中に生成するステップと、を備える。
【０１２３】
図４９は、昇順形式の集計配列に基づいて、ある頂点ノードの部分ツリーを特定する処理を示すフローチャートである。図４９に示すように、ＣＰＵ１２は、ＲＡＭ１４などメモリに記憶された頂点ノードリストから、頂点ノードを取り出す（ステップ４９０１）。次いで、ＣＰＵ１２は、集計配列において、取り出した頂点ノードが示す出現値および出現回数を参照して、初期的な算出値「出現値＋出現回数＋１」を算出する（ステップ４９０２）。この算出値は、以下のような意味を有する。
【０１２４】
昇順形式の集計配列において、出現値は、ノード識別子に相当し、かつ、出現回数は、Ｃ−Ｐ配列において、そのノード識別子が幾つ出現したかを示す。したがって、少なくとも、頂点ノードリストにおいて、次の頂点ノードのノード識別子は（言い換えれば次の部分ツリーの頂点ノードのノード識別子は）、少なくとも算出値以上であることがわかる。
【０１２５】
なお、後述するステップ４９０８で明らかになるように、集計配列において、該出現値の次の行の出現値（ノード識別子）が、この算出値以上の番号を持たない場合、さらに次行の出現回数を加算することで該行での算出値を補正することが出来る。このように次行の出現値が算出値に満たない場合、算出値に次行の出現回数を加算し、さらにその次の行の出現値と比較することを繰り返すうちに、算出値以上の出現値を発見することで、部分ツリーを特定することが出来る。
【０１２６】
図５０Ａ〜Ｃは、図４８Ａに示すツリーにおいて、ある頂点ノード（ノード識別子＝２）の部分ツリーを特定する処理の具体例を説明する図である。図５０Ａは、集計配列において、頂点ノードに対応する格納位置番号を、ポインタがさしている状態を示す。図５０Ａ〜Ｃにおいて、黒い矢印は頂点ノードに対応する格納位置番号を指している。また、白抜きの矢印は、後述する移動ポインタを示す。
【０１２７】
この状態において、上述した算出値は、「２＋２＋１＝５」となる。したがって、次の部分ツリーの頂点ノードのノード識別子は、「５」以上であることがわかる。
【０１２８】
次いで、ＣＰＵ１２は、移動ポインタを、頂点ノードが示す格納位置番号に配置する（ステップ４９０３）。この位置が移動ポインタの初期位置となる。ＣＰＵ１２は、移動ポインタを、次の格納位置番号に移動し（ステップ４９０４）、集計配列において、移動ポインタが示す出現値を参照する（ステップ４９０５）。ＣＰＵ１２は、ステップ４９０２で算出した算出値と、ステップ４９０３で参照した出現値とを比較し、「算出値＞出現値」であれば（ステップ４９０６でイエス(Yes)）、移動ポインタが示す格納位置番号の出現値に関するノードが頂点ノードに属すること、を示す情報を生成し、メモリ中に記憶する（ステップ４９０７）。たとえば、上記情報を格納するために、上記出現値を格納した配列をメモリ中に生成しても良いし、或いは、集計配列において、上記情報として、格納位置番号に関連付けてフラグをセットしても良い。
【０１２９】
その後、ＣＰＵ１２は、算出値を、「もとの算出値＋ポインタが示す出現回数」に更新する（ステップ４９０８）。
【０１３０】
図５０Ｂに示すように、移動ポインタが格納位置番号「３」を示す状態では、その出現値は「４」となる。算出値「５」と出現値「４」とを比較すると、「算出値５＞出現値４」であるため、ステップ４９０４でイエス(Yes)と判断され、出現値「４」、つまり、ノード識別子が「４」であるノードは、ノード識別子が「２」である頂点ノードに属し、その情報が、メモリ中に記憶される。また、算出値は、「５（もとの算出値）＋１（ポインタが示す出現回数）＝６」に更新される。
【０１３１】
ステップ４９０６でノード判断された場合には、当該頂点ノードに関する部分ツリーの特定処理は終了する。図５０Ｃに示すように、移動ポインタが格納位置番号「４」を示す状態では、その出現値は「７」となる。更新された算出値「６」と出現値「７」とを比較すると、「算出値６＜出現値７」であるため、ステップ４９０６でノー(No)と判断される。よって、頂点ノード「２」の部分ツリーは、符号５００１で示される範囲と特定される。
【０１３２】
次に、昇順形式の集計配列によって表わされるツリーや部分ツリーの標準形式について説明する。これは、集計配列において、全ての出現値から、先頭の格納位置番号の出現値を減じればよい。図５１は、図５０Ａ〜Ｃに示す処理で特定された、部分ツリーの昇順形式の集計配列を示す図である。ここでは、昇順形式の集計配列（符号５１０１参照）の出現値の各々から、先頭の格納位置番号の出現値「２」を減じる（符号５１０２参照）。これにより、標準化された昇順形式の集計配列を得ることができる（符号５１０３参照）。
【０１３３】
末端ノードにおける昇順形式の集計配列を考える。図４８Ａに示す例において、末端ノードのノード識別子は、「３」、「５」、「６」、「１０」および「１１」となる。したがって、末端ノードのそれぞれを昇順形式の集計配列で表わすと、図５１の符号５２０１のようになる。たとえば、最初の集計配列は、出現値「３」については（末端ノードであるため）、その出現回数が「０（ゼロ）」であることが示される。ここでも、標準化においては、それぞれの配列において、出現値に出現値を減じる、つまり、出現値を「０（ゼロ）」とすれば良い（符号５２０２参照）。
【０１３４】
［トポロジー検索］
ツリー全体において、或いは、ある頂点ノードにより特定される部分ツリーにおいて、ツリー或いは部分ツリーと同じ接続態様、つまり、同一のトポロジーを有する部分ツリーを見出すことを考える。たとえば、図３５Ｂに示すツリーにおいて、図３５Ａに示すツリーと同一のトポロジーを有する部分ツリーを探すと、図３５Ｂにおいて点線で示す部分ツリーを特定することができる。これを、トポロジー検索と称する。トポロジー検索において、その検索結果は、検索により特定された部分ツリーの頂点ノードのノード識別子を含む配列（頂点ノードリスト）で表わすことができる。図３５Ａ、Ｂの例では、検索結果は、［７］となる。
【０１３５】
ツリー全体から、検索キーとなるツリーと同一トポロジーの部分ツリーを見出す場合も、頂点ノードリストにより特定される部分ツリー群から、検索キーとなるツリーと同一トポロジーの部分ツリーを見出す場合も、アルゴリズムとしては同一であるため、以下の説明では区別することなく扱う。
【０１３６】
なお、以下の説明において、検索キーとなるツリーを、検索トポロジーとも称する。トポロジーの検索は、概略的には、
検索キーとなるツリーを表現する検索キー配列として、ノード間の親子関係を表現するための、ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に対応する、非ルート・ノードの各々に関連付けられた親ノードのノード識別子を有する配列を、記憶装置中に生成するステップと、
検索キー配列中のノード識別子にオフセットを与え、オフセットが与えられたノード識別子と、オフセットにしたがった第１の配列中の部分に含まれる、対応するノード識別子とを比較するステップと、
比較により全てが一致した第１の配列中の部分のノード識別子を含む、検索結果を示す頂点ノードリストを、記憶装置中に生成するステップと、を備える。
［０１３７］
図３６は、本実施の形態にかかるトポロジー検索処理を示すフローチャートである。図３６に示すように、ＣＰＵ１２は、ＲＡＭ１４などのメモリに格納された検索トポロジーを表わすＣ−Ｐ配列を参照して、先頭の要素を削除した、検索キー配列を生成する（ステップ３６０１）。次いで、ＣＰＵ１２は、検索キー配列の値に加算するオフセット値を「０（ゼロ）」に初期化し（ステップ３６０２）、かつ、検索キー配列と、検索対象となるＣ−Ｐ配列との間の比較をすべき位置を示すポインタを初期位置に配置する（ステップ３６０３）。ステップ３６０３においては、ポインタは、Ｃ−Ｐ配列中、オフセット値に「１」を加えた位置に、初期的に位置する。たとえば、図３７Ａに示すように、初期的には、比較位置を示すポインタは、Ｃ−Ｐ配列中、「オフセット値（０）＋１＝１」を示す。このため、後述するように、検索キー配列の先頭の要素が、ポインタの示すＣ−Ｐ配列の格納位置番号「１」の要素と比較されることになる。
［０１３８］
ＣＰＵ１２は、検索キー配列の要素のそれぞれにオフセット値を加算し、かつ、オフセット値が加算された検索キー配列の要素と、ポインタに示されるＣ−Ｐ配列の部分中、当該検索キー配列の要素に対応する要素とを比較し（ステップ３６０４）、それぞれの要素が一致するか否かを判断する（ステップ３６０５）。ステップ３６０５でイエス（Ｙｅｓ）と判断された場合には、ＣＰＵ１２は、比較対象となったＣ−Ｐ配列の部分の末尾のさらに次、つまり、末尾の格納位置番号に「１」を加えた格納位置番号の要素を参照し、当該要素が、比較対象となったＣ−Ｐ配列の部分により特定されるツリーと同一ブロックに属するか否かを判断する（ステップ３６０６）。具体的には、ＣＰＵ１２は、比較対象となったＣ−Ｐ配列の部分の末尾のさらに次の要素が、オフセット値以上であるか否かを調べ、オフセット値以上であれば、同一ブロックに属すると判断する。
［０１３９］
ステップ３６０６でノー（Ｎｏ）と判断された場合には、オフセット値を、検索結果を格納するためのメモリ上に生成した頂点ノードリストに格納する（ステップ３６０７）。その後、ＣＰＵ１２は、ポインタを１つだけ下側、つまり、格納位置番号が「１」だけ増大するように移動するとともに（ステップ３６０８）、オフセット値を「１」だけ増大させる（ステップ３６０９）。ポインタの移動にともなって、新たにＣ−Ｐ配列において、比較対象となる部分が存在するか否かを判断し（ステップ３６１０）、存在する場合（ステップ３６１０でイエス(Yes)）には、ステップ３６０４に戻る。
【０１４０】
図３７Ａの例（オフセット値＝０の例）では、検索キー配列の要素と、比較対象となったＣ−Ｐ配列の部分の要素（格納位置番号「１」〜「４」の要素）とは部分的に一致しないため、ステップ３６０５でノー(No)と判断される。図３７Ｂの例（オフセット値＝１の例）では、検索キー配列の要素と、比較対象となったＣ−Ｐ配列の部分の要素（格納位置番号「２」〜「５」の要素）とは全て一致する。しかしながら、比較対象となったＣ−Ｐ配列の末尾（格納位置番号＝５）のさらに次（格納位置番号＝６）の要素が、「１」であり、オフセット「１」以上である。したがって、ステップ３６０６でイエス(Yes)と判断される。図３８Ａ、Ｂの例（それぞれ、オフセット値＝２，３の例）においても、ステップ３６０５でノー(No)と判断される。図３９の例（オフセット値＝７）の例では、ステップ３６０５でイエス(Yes)、ステップ３６０６でノー(No)と判断され、その結果、オフセット値「７」が頂点ノードリストに格納される。なお、図３９の例では、比較対象となったＣ−Ｐ配列の末尾（格納位置番号＝１１）のさらに次の要素が存在しないため、ブロックの継続のチェック（つまり、次の要素とオフセットとの比較）は不要である。
【０１４１】
［他のトポロジー検索］
たとえば、トポロジーに加えて、そのノードのタイプ（図２Ａ，Ｂを参照して説明したノードの項目名情報）の一致も、検索条件とする場合も考えられる。この場合には、上記処理において、上記ステップ３６０６の後に、比較された各要素に対応するノードのタイプを比較し、当該タイプが一致した場合には、オフセット値を頂点ノードリストに格納すればよい。
【０１４２】
［昇順形式の集計配列を利用したトポロジー検索］
トポロジー検索は、昇順形式の集計配列を利用しても実現できる。基本的には、検索キーとなるツリー（検索トポロジー）を表現した、標準化された昇順形式の集計配列と、ツリーの昇順形式の集計配列とを比較する。図５３は、本実施の形態にかかる昇順形式を利用したトポロジー検索の処理を示すフローチャートである。図５３の処理は、図３６の処理（Ｃ−Ｐ配列を用いたトポロジー検索処理）とほぼ同様である。図３６の処理においては、比較対象部分の次の要素が、当該比較対象部分と同一ブロックに属するかどうかの判断（ステップ３６０６）がされていたが、昇順形式の集計配列を利用すると、このステップを省略することができる。
【０１４３】
昇順形式の集計配列を利用したトポロジー検索は、概略的には、
検索キーとなるツリーを表現する検索キー配列として、子ノードをもつノードについて、それぞれのノード識別子と、当該ノードを親ノードとする子ノードの出現数との組を、ノード識別子の順に配置した昇順形式の集計配列を、記憶装置中に生成するステップと、
検索キー配列中のノード識別子に、オフセットを与え、オフセットが与えられたノード識別子と、オフセットにしたがった集計配列中の部分に含まれる、対応するノード識別子とを比較するステップと、
比較により全てが一致した集計配列の部分のノード識別子とその出現数とを含む、検索結果を示す集計配列を、記憶装置中に格納するステップと、を備える。
【０１４４】
より詳細には、ＣＰＵ１２は、ＲＡＭ１４などのメモリに格納された検索トポロジーを表わす昇順形式の集計配列を参照して、検索キー配列を生成する（ステップ５３０１）。この検索キー配列は、標準化された昇順形式の集計配列である。次いで、ＣＰＵ１２は、検索キー配列と、検索対象となる集計配列との間の比較すべき位置を示すポインタを初期位置に配置する（ステップ５３０２）。ステップ５３０３においては、ポインタは、集計配列の格納位置番号「０（ゼロ）」の位置に配置される。また、ＣＰＵ１２は、検索キー配列の出現値に加算するオフセット値を、検索キー配列の先頭の出現値およびオフセット値の和と、比較対象部分の先頭の出現値とが一致するように、初期化する（ステップ５３０３）。図５４Ａの場合、検索キー配列の先頭の出現値は「０（ゼロ）」であり、かつ、比較対象部分の先頭の出現値は「０（ゼロ）」であるため、オフセット値も「０（ゼロ）」となる。
【０１４５】
次いで、ＣＰＵ１２は、検索キー配列と、ポインタで示される集計配列の比較対象部分とを比較する（ステップ５３０４）。ここでは、ポインタで示される位置が、比較対象部分の先頭となる。
【０１４６】
たとえば、図５５Ａに示すように、初期的には、検索キー配列の格納位置番号「０（ゼロ）」と、集計配列の格納位置番号「０＋０（後者の０（ゼロ）はオフセット値）」とを揃えるように比較位置が決められる。
【０１４７】
次いで、ＣＰＵ１２は、検索キー配列の出現値のそれぞれにオフセット値を加算し、かつ、オフセット値が加算された検索キー配列の出現値、および、出現回数の組と、比較対象部分の対応する位置の出現値、および、出現回数の組とを比較する（ステップ５３０４）。それぞれの要素の全てが一致した場合には（ステップ５３０５でイエス(Yes)）、オフセット値を、検索結果を格納するためにメモリ上に生成した頂点ノードリストに格納する（ステップ５３０６）。その後、ＣＰＵ１２は、ポインタを１つだけ下側、つまり、格納位置番号が「１」だけ増大するように移動するとともに（ステップ５３０７）、オフセット値を、検索キー配列の先頭の出現値およびオフセット値の和が、ポインタ移動後の比較対象部分の先頭の出現値と一致するように増分する（ステップ５３０８）。ポインタの移動にともなって、新たに集計配列において、比較対象となる部分が存在するか否かを判断し（ステップ５３０９）、存在する場合（ステップ５３０９でイエス(Yes)）には、ステップ５３０４に戻る。
【０１４８】
図５４Ａの例（オフセット値＝０の例）では、検索キー配列においてオフセット値が加えられた出現値と、比較対象部分の出現値とは一致するが、出現回数が一致しない。したがって、ステップ５３０５でノー(No)と判断される。図５４Ｂの例（オフセット値＝１の例）においても、出現値は一致するが、出現回数が一致しない。さらに、図５５Ａの例（オフセット値＝２の例）では、出現値が不一致となる。
【０１４９】
これに対して、図５５Ｂの例（では、出現値および出現回数が全て一致する。したがって、検索結果を表わす頂点ノードリストは、［７］となる。
【０１５０】
昇順形式の集計配列を利用すると、検索キー配列と比較対象部分との間の比較処理の回数を少なくすることができる。また、比較処理において、同一ブロックの判断処理（図３６のステップ３６０６）を省略することができる。
【０１５１】
［トポロジー集計］
次に、トポロジー集計について説明する。トポロジー集計とは、以下のような２つの態様を考えることができる。
（１）トポロジーを次元として、ツリーにおいて、そのトポロジー種の件数を求める。
（２）トポロジーを次元として、ツリーにおいて、そのトポロジー種に属する指定の測度（たとえば、年齢、体重など）の件数、最大値、最小値、合計値、平均値などを求める。
【０１５２】
基本的に、（１）の集計（「第１のトポロジー」と称する。）集計を実行すれば、（２）の集計（「第２のトポロジー集計」と称する。）、つまり、そのトポロジー種に属する測度の演算は容易である。したがって、まず、第１のトポロジー集計について説明する。
【０１５３】
ここで、測度について簡単に説明する。図２Ａ、Ｂを参照して説明したように、実際のノードにおいて、項目名情報、すなわち、ノードのタイプと、項目値情報、すなわち、ノードの値が関連付けられている。上記ノードにおける、項目名情報（ノードのタイプ）および項目値情報（ノードの実際の値）が、上記測度になる場合がある。
【０１５４】
［第１のトポロジー集計］
図４０Ａに示すツリーを考える。ここで、頂点ノードリスト［２，７，８］で特定される部分ツリー群において、トポロジー種ごとの件数を求めることを考える。その結果、トポロジー４０１１が、頂点ノードリスト［２，８］で示される２つの部分ノードとして現れる。また、トポロジー４０１２は、頂点ノードリスト［７］で示される１つの部分ノードとして現れる。したがって、トポロジー４０１１が２件、トポロジー４０１２が１件というトポロジー集計結果が得られる（図４０Ｂ参照）。
【０１５５】
トポロジー集計は、概略的には、
部分ツリーの頂点ノードを格納した頂点ノードリストを、記憶装置中に生成するステップと、
頂点ノードリストに格納されたノード識別子に対応する頂点ノードのそれぞれにより特定される部分ツリーを表す、第１の配列中の部分を特定するステップと、
第１の配列中の部分のそれぞれについて、部分ツリーの頂点ノードが、ルート・ノードとなるように、ノード間の親子関係が、頂点ノード以外のノードである非頂点ノードの各々に付与されたノード識別子に対応する、非頂点ノードの各々に関連付けられた親ノードのノード識別子により表現された、標準形式の第２の配列を、記憶装置中に生成するステップと、
生成された第２の配列を参照して、第２の配列の種別ごとに、生成された配列数をカウントし、配列数を第２の配列の種別と関連付けて、記憶装置中に記憶するステップと、を備える。
【０１５６】
より具体的に、本実施の形態にかかる情報処理装置における第１のトポロジー集計処理について説明する。図４１に示すように、ＣＰＵ１２は、ＲＡＭ１４などのメモリに記憶された頂点ノードリストを参照して、その値（頂点ノードのノード識別子）を取り出す（ステップ４１０１）。次いで、ＣＵＰ１２は、Ｃ−Ｐ配列中、頂点ノードで指定される部分ツリーの範囲を特定する（ステップ４１０２）。これは、たとえば、図４２に示す処理により実現できる。
【０１５７】
図４２に示すように、ＣＰＵ１２は、まず、Ｃ−Ｐ配列中、頂点ノードのノード識別子に「１」を加えた格納位置番号が示す要素を参照する（ステップ４２０１）。次いで、参照されたＣ−Ｐ配列中の要素が、頂点ノードのノード識別子以上であるか否かが判断される（ステップ４２０２）。ステップ４２０２でイエス(Yes)と判断された場合には、この要素に関する格納位置番号に相当するノードは、頂点ノードで特定される部分ツリーに属するため、ＣＰＵ１２は、この格納位置番号をメモリ中に一時的に記憶する（ステップ４２０３）。次いで、ＣＰＵ１２は、Ｃ−Ｐ配列中の参照すべき格納位置番号を「＋１」し、当該格納位置番号が、Ｃ−Ｐ配列の末尾の格納位置番号を超えない限り（ステップ４２０５でノー(No)）、ＣＰＵ１２は、ステップ４２０２〜４２０４の処理を繰り返す。これにより、頂点ノードの部分ツリーに属するノードのノード識別子に対応する格納位置番号を取得することができる。
【０１５８】
次いで、ＣＰＵ１２は、Ｃ−Ｐ配列中、頂点ノードで指定される部分ツリーに相当する部分配列を標準形式に変換する（ステップ４１０３）。標準変換は、図２４に示す処理を実行することにより実現される。
【０１５９】
ＣＰＵ１２は、全ての頂点ノードについて、ステップ４１０２および４１０３の処理を実行し（ステップ４１０４参照）、各頂点ノードについて、標準化された部分配列を得ておく。得られた部分配列は、ＲＡＭ１４などメモリに記憶しておけば良い。次いで、ＣＰＵ１２は、標準形式の部分配列を比較して、部分配列ごとに、幾つ存在したかをカウントする（ステップ４１０５）。この部分配列およびカウント値が、第１のトポロジー集計による集計結果となる。
【０１６０】
なお、ツリー全体を処理対象として、第１のトポロジー集計を実施する場合には、頂点ノードリストに、全てのノード識別子を格納すればよい。
【０１６１】
図４３Ａ〜Ｃは、第１のトポロジー集計処理の例を示す図である。図４３Ａ〜Ｃのそれぞれにおいて、頂点ノードで指定される部分ツリーの範囲（符号４３０１、４３１１、４３２１参照）の特定、標準形式による部分配列（符号４３０２、４３１２、４３２２参照）の取得により、標準形式による部分配列[−１，０，０]が２件、部分配列［−１，０，１，１，０］が１件だけ存在するという結果が得られる。
【０１６２】
［第２のトポロジー集計］
第２のトポロジー集計においては、第１のトポロジー集計の結果から、分類された部分配列ごとに、さらに、指定された測度の件数や、指定された値に関する演算値（最大値、最小値、合計値、平均値など）を求めればよい。
【０１６３】
［昇順形式の集計配列を利用したトポロジー集計］
トポロジー集計は、昇順形式の集計配列を利用しても実現できる。図４０Ａに示すツリーは、昇順形式の集計配列を用いると、図５６のように表すことができる。図４０Ａに示す例と同様に、頂点ノードリスト［２，７，８］で特定される部分ツリー群において、トポロジー種ごとの件数を求めることを考える。
【０１６４】
昇順形式の集計配列を利用したトポロジー集計は、概略的には、
部分ツリーの頂点ノードを格納した頂点ノードリストを、記憶装置中に生成するステップと、
集計配列において、頂点ノードのノード識別子と、当該ノード識別子に関連付けられた出現数とに基づき、少なくとも子孫ノードとなるノードのノード識別子を初期的に算出するステップと、
集計配列において、格納位置番号が増大するように、ノード識別子を参照し、ノード識別子に対応するノードが、頂点ノードの子孫ノードとなるか否かを判断するとともに、当該集計配列のノード識別子に関連付けられた出現数を参照して、子孫ノードのノード識別子を更新するステップと、
頂点ノードの子孫ノードとなると判断されたノードのノード識別子とおよび関連付けられた出現数との組を、部分配列として記憶装置中に生成するステップと、
部分配列において、そのノード識別子から、先頭のノード識別子を減じて、標準形式の部分配列を、記憶装置中に生成するステップと、
生成された標準形式の部分配列を参照して、標準形式の部分配列の種別ごとに、生成された配列数をカウントし、配列数を種別と関連付けて、記憶装置中に記憶するステップと、を備える。
【０１６５】
図５７は、昇順形式の集計配列を利用したトポロジー集計の処理を示すフローチャートである。図５７に示すように、ＣＰＵ１２は、ＲＡＭ１４などのメモリに記憶した頂点ノードリストを参照して、その値（頂点ノードのノード識別子）を取り出す（ステップ５７０１）。次いで、ＣＰＵ１２は、処理対象となった集計配列中、取り出された頂点ノードの部分ツリーの範囲を特定する（ステップ５７０２）。これは、図４９の処理を実行することにより実現される。ステップ５７０２により、部分ツリーの範囲を示す集計配列が生成される。
【０１６６】
ＣＰＵ１２は、ステップ５７０２で得られた部分ツリーの範囲を示す集計配列を標準形式に変換する（ステップ５７０３）。これは、図５１および図５２を参照して説明したように、集計配列において、全ての出現値から、先頭の格納位置番号の出現値を減じることにより実現できる。
【０１６７】
ステップ５７０１〜５７０３の処理を全ての頂点ノードについて実行した後（ステップ５７０４参照）、各頂点ノードについて、標準化された（つまり標準形式の）集計配列を得ておく。得られた集計配列は、ＲＡＭ１４などのメモリに記憶しておけば良い。次いで、ＣＰＵ１２は、集計配列を比較して、集計配列ごとに、幾つ存在したかをカウントする（ステップ５７０５）。この部分ツリーの範囲を示す集計配列およびそのカウント値が、トポロジー集計の集計結果となる。
【０１６８】
図５６の例においては、上記処理の結果、図５８Ａに示すように、それぞれの頂点ノードについて、３つの部分ツリーの範囲を示す集計配列を得ることができる。図５８Ａにおいて、符号５８０１〜５８０３は、それぞれ、頂点ノード「２」、「７」、「８」に関する部分ツリーの範囲を示す集計配列である。したがって、図５８Ｂに示すような集計結果を得ることができる。
【０１６９】
［トポロジーソート］
たとえば、上記集計結果について、件数を昇順或いは降順として並べて表示することが望まれる場合がある。つまり、推移律を満たす大小の尺度に基づいて、最小のものから最大のもの（或いはその逆）に連続してアクセスできる配列を生成することが望まれる場合がある。このように上記大小の尺度に基づく配列を生成することをソートと称する。
【０１７０】
図４４Ａに示すツリー群において、頂点ノードリストを、各頂点ノードに示される部分ツリーのノード数で昇順にソートすることを考える。この場合、図４４Ｂに示すように、ソート後の頂点ノードリストは、［２，８，７］となる。これは、頂点ノード「２」、「８」で示される部分ノードのノード数が「３」となり、その一方、頂点ノード「７」で示される部分ノードのノード数は「５」となるからである。無論、ソート順は、これに限定されるものではなく、集計に関して説明した測度を採用しても良い。
【０１７１】
トポロジーソートの処理は、概略的には、
第１の配列により特定されるツリーの部分ツリーの順序をソートする方法であって、
部分ツリーの頂点ノードを格納した頂点ノードリストを、記憶装置中に生成するステップと、
頂点ノードリストに格納されたノード識別子に対応する頂点ノードのそれぞれにより特定される部分ツリーを表す、第１の配列中の部分を特定するステップと、
第１の配列中の部分のそれぞれについて、部分ツリーの頂点ノードが、ルート・ノードとなるように、ノード間の親子関係が、頂点ノード以外のノードである非頂点ノードの各々に付与されたノード識別子に対応する、非頂点ノードの各々に関連付けられた親ノードのノード識別子により表現された、標準形式の第２の配列を、記憶装置中に生成するステップと、
生成された第２の配列を参照して、設定された評価基準にしたがって、頂点ノードのノード識別子の順序を入れ替えるステップと、を備える。
【０１７２】
図４５は、本実施の形態にかかるトポロジーソートの一例を示す図である。図４５に示すように、この例にかかるトポロジーソート処理は、第１のトポロジー集計処理に類似し、図４５のステップ４５０１〜４５０４は、図４１のステップ４１０１〜４１０４と同様である。したがって、図４６Ａに示す例（図４３Ａのものと同様である）では、頂点ノードリスト中の全ての頂点ノードについて、ステップ４５０１〜４５０３の処理を実行すると、頂点ノード「２」、「７」および「８」について、それぞれ、図４６Ｂ〜Ｄに示す標準形式の配列を得ることができる。図４４Ｂに示すソートの大小比較基準（ノード数でソート）にしたがうと、図４６Ｅに示すように、頂点ノードの順序が入れ替えられた頂点ノードリストを得ることが可能となる。
【０１７３】
［情報処理装置］
図４７は、本発明の実施の形態にかかるツリー型データ構造を構築し、頂点ノードリストを生成し、ツリー型データ構造を構築する種々の配列を生成して、これをメモリに記憶し、かつ、トポロジー検索、トポロジー集計およびトポロジーソートの処理を実行する情報処理装置の例を示す機能ブロックダイヤグラムである。この情報処理装置４７００は、実際には、図１に示すコンピュータシステム１０に必要なプログラムをインストールすることにより実現される。
【０１７４】
図４７に示すように、情報処理装置４７００は、ツリー型データ構造を表現するデータ、頂点ノードリストを含む種々の配列を記憶する記憶部４７０１と、ルート・ノードを含むノードに固有のノード識別子を付与し、ノード識別子を記憶部３５０１に格納するノード定義部４７０２と、ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に、非ルート・ノードの各々の親ノードに付与されたノード識別子を関連付け、当該関連付けを示す配列であるＣ−Ｐ配列を記憶部４７０１に格納する親子関係定義部４７０３と、記憶部４７０１に格納されたノード識別子およびＣ−Ｐ配列に基づいて、部分ツリーを表現する標準化された部分配列を生成する標準化処理部４７０４と、Ｃ−Ｐ配列や部分配列を昇順形式の集計配列に変換する昇順形式処理部４７０５と、トポロジー検索処理を実行するトポロジー検索処理部４７０６と、トポロジー集計処理を実行するトポロジー集計処理部４７０７と、トポロジーソート処理を実行するトポロジーソート処理部４７０８とを有している。標準化処理部４７０４、昇順形式処理部４７０５、トポロジー検索処理部４７０６、トポロジー集計処理部４７０７およびトポロジーソート処理部４７０８による処理結果や生成された配列は、記憶部４７０１に記憶される。
【０１７５】
好ましくは、ノード定義部４７０２は、ノード識別子として数値を用い、より好ましくは、ノード識別子として連続する整数を用いる。また、親子関係定義部４７０３は、非ルート・ノードの各々に付与されたノード識別子と、関連付けられた親ノードに付与されたノード識別子と、の組の配列を記憶部４７０１に格納する。
【０１７６】
また、入力装置（図１の符号２４参照）からの指示などにより、ノードが指定されると、頂点ノードリスト生成部４７０４は、指定されたノードのノード識別子を、頂点ノードリスト中に格納する。また、入力装置からの指示にしたがって、トポロジー検索処理部４７０６、トポロジー集計処理部４７０７、トポロジーソート処理部４７０８は、前述したようなトポロジー検索処理、トポロジー集計処理およびトポロジーソート処理を、それぞれ実行する。その際に、必要に応じて、標準化処理部４７０４および昇順形式処理部４７０５も処理を実行して所定の配列を生成し、その配列を記憶部４７０１に記憶する。
【０１７７】
本発明は、以上の実施の形態に限定されることなく、特許請求の範囲に記載された発明の範囲内で、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
【図面の簡単な説明】
【０１７８】
【図１】図１は、本発明の実施の形態にかかるツリー型データ構造を取り扱うコンピュータシステムのブロックダイヤグラムである。
【図２】図２Ａ、Ｂは、ツリー形式データの一例であるＰＯＳデータの説明図であり、図２Ａは、このツリー形式データのデータ構造（即ち、トポロジー）及びデータ値を視覚的に表現した例であり、図２Ｂは、同じツリー形式データをＸＭＬ形式で表現した例である。
【図３】図３Ａ〜Ｃは、アークリストを用いたツリー型データ構造の表現形式の例の説明図である。
【図４】図４Ａ〜Ｃは、本発明の一実施例による「子→親」関係に基づくツリー型データ構造の表現方法の説明図である。
【図５】図５は、本発明の一実施例によるツリー型データ構造を記憶装置上に構築する方法のフローチャートである。
【図６】図６Ａ〜Ｃは、本発明の一実施例によりＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。
【図７】図７Ａ〜Ｃは、本発明の他の一実施例によりＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。
【図８】図８は、本発明の一実施例による深さ優先に基づくノード定義処理のフローチャートである。
【図９】図９は、本発明の一実施例により作成された「子→親」表現に基づく親子関係の配列の説明図である。
【図１０】図１０は、図６Ｃに示された深さ優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。
【図１１】図１１は、本発明の一実施例による幅優先に基づくノード定義処理のフローチャートである。
【図１２】図１２は、本発明の一実施例により作成された「子→親」表現に基づく親子関係の配列の説明図である。
【図１３】図１３は、図７Ｃに示された幅優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。
【図１４】図１４Ａは、幅優先モードに基づくツリー型データ構造、図１４Ｂは、当該ツリー型データ構造を、「子→親」表現に基づく親子関係の配列を示す図である。
【図１５】図１５Ａは、頂点ノードリストの例、図１５Ｂは、頂点ノードリストで特定される部分ツリー群の例を示す図である。
【図１６】図１６Ａは、検索処理により得られた頂点ノードリストの例、図１６Ｂは、頂点ノードリストで特定される部分ツリー群の例を示す図である。
【図１７】図１７Ａは、集計処理により得られた頂点ノードリストおよび集計結果を示す配列の例、図１７Ｂは、頂点ノードリストで特定される部分ツリー群の例を示す図である。
【図１８】図１８Ａは、ノード数でソートされた頂点ノードリスト、および、対応するノード数を示す配列の例、図１８Ｂは、頂点ノードリストで特定される部分ツリーの例を示す図である。
【図１９】図１９Ａ、Ｃは、それぞれ、論理積演算の対象となる頂点ノードリストの例、図１９Ｂ、Ｄは、それぞれ頂点ノードリストで特定される部分ツリー群の例を示す図である。
【図２０】図２０Ａは、論理積演算の結果を示す頂点ノードリストの例、図２０Ｂは、頂点ノードリストで特定される部分ツリー群を示す図である。
【図２１】図２１は、あるノードを表現するＣ−Ｐ配列、および、部分ツリー群を特定する頂点ノードリストの例を示す図である。
【図２２】図２２は、図２１の頂点ノードリスト中の頂点ノードによりそれぞれ特定される部分ツリーを示す図である。
【図２３】図２３Ａ、Ｂは、本実施の形態にかかる部分ツリーの標準化の概略を示す図である。
【図２４】図２４は、本実施の形態にかかる部分ツリーの標準化の例を示すフローチャートである。
【図２５】図２５は、部分ツリーを表わす標準化された部分配列の例を示す図である。
【図２６】図２６は、本実施の形態にかかる昇順形式の配列の例を説明するための図である。
【図２７】図２７は、昇順形式の集計配列と、Ｃ−Ｐ配列との間の相互変換の概略を説明する図である。
【図２８】図２８は、本実施の形態にかかる集計配列からＣ−Ｐ配列への変換処理の例を示すフローチャートである。
【図２９】図２９Ａ、Ｂは、集計処理からＣ−Ｐ配列への変換処理の具体例を示す図である。
【図３０】図３０Ａ、Ｂは、集計処理からＣ−Ｐ配列への変換処理の具体例を示す図である。
【図３１】図３１Ａ、Ｂは、集計処理からＣ−Ｐ配列への変換処理の具体例を示す図である。
【図３２】図３２Ａ、Ｂは、集計処理からＣ−Ｐ配列への変換処理の具体例を示す図である。
【図３３】図３３Ａ、Ｂは、集計処理からＣ−Ｐ配列への変換処理の具体例を示す図である。
【図３４】図３４Ａ、Ｂは、集計処理からＣ−Ｐ配列への変換処理の具体例を示す図である。
【図３５】図３５Ａ、Ｂは、本実施の形態にかかるトポロジー検索の概略を説明する図である。
【図３６】図３６は、本実施の形態にかかるトポロジー検索処理の例を示すフローチャートである。
【図３７】図３７Ａ、Ｂは、トポロジー検索処理の具体例を示す図である。
【図３８】図３８Ａ、Ｂは、トポロジー検索処理の具体例を示す図である。
【図３９】図３９は、トポロジー検索処理の具体例を示す図である。
【図４０】図４０Ａ、Ｂは、本実施の形態にかかる第１のトポロジー集計の概略を説明する図である。
【図４１】図４１は、本実施の形態にかかる第１のトポロジー集計処理の例を示すフローチャートである。
【図４２】図４２は、図４１のステップ４１０２をより詳細に示すフローチャートである。
【図４３】図４３Ａ〜Ｃは、第１のトポロジー集計処理の具体例を示す図である。
【図４４】図４４Ａ、Ｂは、本実施の形態にかかるトポロジーソートの概略を説明する図である。
【図４５】図４５は、本実施の形態にかかるトポロジーソート処理の例を示すフローチャートである。
【図４６】図４６Ａ〜Ｅは、本実施の形態にかかるトポロジーソート処理の具体例を示す図である。
【図４７】図４７は、本発明の実施の形態にかかるツリー型データ構造を構築し、頂点ノードリストを生成し、ツリー型データ構造を構築する種々の配列を生成して、これをメモリに記憶し、かつ、トポロジー検索、トポロジー集計およびトポロジーソートの処理を実行する情報処理装置の例を示す機能ブロックダイヤグラムである。
【図４８】図４８Ａ、Ｂは、ツリーの例および当該ツリーを表わす昇順形式の集計配列を示す図である。
【図４９】図４９は、昇順形式の集計配列に基づいて、ある頂点ノードの部分ツリーを特定する処理を示すフローチャートである。
【図５０】図５０Ａ〜Ｃは、頂点ノードの部分ツリーを特定する処理の具体例を示す図である。
【図５１】図５１は、昇順形式の集計配列の標準形式を示す図である。
【図５２】図５２は、昇順形式の集計配列の標準形式を示す図である。
【図５３】図５３は、本実施の形態にかかる昇順形式を利用したトポロジー検索の処理を示すフローチャートである。
【図５４】図５４Ａ、Ｂは、本実施の形態にかかる標準形式を利用したトポロジー検索の具体例を示す図である。
【図５５】図５５Ａ、Ｂは、本実施の形態にかかる標準形式を利用したトポロジー検索の具体例を示す図である。
【図５６】図５６は、図４０Ａに示すツリーを表わす昇順形式の集計配列、および、頂点ノードリストの例を示す図である。
【図５７】図５７は、図５７は、昇順形式の集計配列を利用したトポロジー集計の処理を示すフローチャートである。
【図５８】図５８は、図５８Ａ、Ｂは、昇順形式の集計配列を利用したトポロジー集計の処理結果を示す図である。
【符号の説明】
【０１７９】
１０        コンピュータシステム
１２        ＣＰＵ
１４        ＲＡＭ
１６        ＲＯＭ
１８        固定記憶装置
２０        ＣＤ−ＲＯＭドライバ
２２        Ｉ／Ｆ
２４        入力装置
２６        表示装置
４７００    情報処理装置
４７０１    記憶部
４７０２    ノード定義部
４７０３    親子関係定義部
４７０４    標準化処理部
４７０５    昇順形式処理部
４７０６    トポロジー検索処理部
４７０７    トポロジー集計処理部
４７０８    トポロジーソート処理部
【図１】
0004653157.tif 000002
【図２】
0004653157.tif 000003
【図３】
0004653157.tif 000004
【図４】
0004653157.tif 000005
【図５】
0004653157.tif 000006
【図６】
0004653157.tif 000007
【図７】
0004653157.tif 000008
【図８】
0004653157.tif 000009
【図９】
0004653157.tif 000010
【図１０】
0004653157.tif 000011
【図１１】
0004653157.tif 000012
【図１２】
0004653157.tif 000013
【図１３】
0004653157.tif 000014
【図１４】
0004653157.tif 000015
【図１５】
0004653157.tif 000016
【図１６】
0004653157.tif 000017
【図１７】
0004653157.tif 000018
【図１８】
0004653157.tif 000019
【図１９】
0004653157.tif 000020
【図２０】
0004653157.tif 000021
【図２１】
0004653157.tif 000022
【図２２】
0004653157.tif 000023
【図２３】
0004653157.tif 000024
【図２４】
0004653157.tif 000025
【図２５】
0004653157.tif 000026
【図２６】
0004653157.tif 000027
【図２７】
0004653157.tif 000028
【図２８】
0004653157.tif 000029
【図２９】
0004653157.tif 000030
【図３０】
0004653157.tif 000031
【図３１】
0004653157.tif 000032
【図３２】
0004653157.tif 000033
【図３３】
0004653157.tif 000034
【図３４】
0004653157.tif 000035
【図３５】
0004653157.tif 000036
【図３６】
0004653157.tif 000037
【図３７】
0004653157.tif 000038
【図３８】
0004653157.tif 000039
【図３９】
0004653157.tif 000040
【図４０】
0004653157.tif 000041
【図４１】
0004653157.tif 000042
【図４２】
0004653157.tif 000043
【図４３】
0004653157.tif 000044
【図４４】
0004653157.tif 000045
【図４５】
0004653157.tif 000046
【図４６】
0004653157.tif 000047
【図４７】
0004653157.tif 000048
【図４８】
0004653157.tif 000049
【図４９】
0004653157.tif 000050
【図５０】
0004653157.tif 000051
【図５１】
0004653157.tif 000052
【図５２】
0004653157.tif 000053
【図５３】
0004653157.tif 000054
【図５４】
0004653157.tif 000055
【図５５】
0004653157.tif 000056
【図５６】
0004653157.tif 000057
【図５７】
0004653157.tif 000058
【図５８】
0004653157.tif 000059