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