(57)【要約】【課題】木構造データに含まれる共通部分木を高速に検出すると共に、共通部分木の出現回数を高速に計数する。【解決手段】部分木判定装置１０は、木構造データの任意の２つの中間ノードについて、各中間ノードの直接の子ノードであって各中間ノードの位置を基準とする相対位置が等しい子ノード同士を、ノードの型、葉ノードの値、又は、中間ノードに割り当てられている、該中間ノードを根ノードとする部分木の全てのノードの出現位置及び全ての葉ノードの値の組についてユニークとなる識別ＩＤに基づいて比較することで、中間ノード同士の等価性判定を行う等価性判定部１６を備える。【選択図】図２
2014026331.tif 000002
【特許請求の範囲】
【請求項１】
値を保持する葉ノードと、葉ノード又は他の中間ノードを子ノードとして保持する中間ノードと、親ノードを持たない唯一の中間ノードである根ノードと、を備える木構造データにおける部分木を判定する部分木判定装置であって、
前記木構造データの任意の２つの中間ノードについて、各中間ノードの直接の子ノードであって各中間ノードの位置を基準とする相対位置が等しい子ノード同士を、ノードの型、葉ノードの値、又は、中間ノードに割り当てられている、該中間ノードを根ノードとする部分木の全てのノードの出現位置及び全ての葉ノードの値の組についてユニークとなる識別ＩＤに基づいて比較し、前記相対位置が等しい子ノード同士の全ての組について等価であると判定した場合には、前記２つの中間ノードは等価であると判定し、前記相対位置が等しい子ノード同士の少なくとも一組について等価でないと判定した場合には、前記２つの中間ノードは等価でないと判定する等価性判定部、
を備える部分木判定装置。
【請求項２】
前記木構造データの全てのノードを深さ優先で巡回する木構造巡回部と、
前記識別ＩＤを中間ノードに紐づけて記憶する識別ＩＤ記憶部と、
前記木構造データの任意の中間ノードである第１中間ノードについて、該第１中間ノードと同一のハッシュ値を持つ中間ノードである第２中間ノードが前記識別ＩＤ記憶部に記憶されているか否かを判定するハッシュ値判定部と、
前記ハッシュ値判定部が、前記第２中間ノードが前記識別ＩＤ記憶部に記憶されていると判定し、且つ、前記等価性判定部が、前記第１中間ノードと前記第２中間ノードとが等価であると判定した場合に、前記第１中間ノードに対して前記第２中間ノードの識別ＩＤと同一の識別ＩＤを割り当て、前記ハッシュ値判定部が、前記第２中間ノードが前記識別ＩＤ記憶部に記憶されていないと判定した場合、又は、前記等価性判定部が、前記第１中間ノードと前記第２中間ノードとが等価でないと判定した場合には、前記第１中間ノードに対して新たな識別ＩＤを割り当てる識別ＩＤ割当部と、
前記識別ＩＤ割当部により前記第１中間ノードに割り当てられた前記識別ＩＤを前記第１中間ノードに紐づけて前記識別ＩＤ記憶部に登録する識別ＩＤ登録部と、を更に備え、
前記木構造巡回部により巡回され、処理対象とされた中間ノードを前記第１中間ノードとして、前記ハッシュ値判定部、前記等価性判定部、前記識別ＩＤ割当部、及び前記識別ＩＤ登録部が各処理を行う、請求項１に記載の部分木判定装置。
【請求項３】
前記木構造データにおける等価なノードごとに、該等価なノードの前記木構造データにおける出現回数を該等価なノードに紐づけて記憶する出現回数記憶部と、
前記巡回部により巡回された巡回ノードと等価なノードが前記出現回数記憶部に記憶されているか否かを判定する既登録判定部と、
前記既登録判定部が、前記等価なノードが前記出現回数記憶部に記憶されていないと判定した場合には、前記巡回ノードが初めて出現したことを示す初期値を前記巡回ノードに紐づく前記出現回数として前記出現回数記憶部に登録し、前記既登録判定部が、前記等価なノードが前記出現回数記憶部に記憶されていると判定した場合には、前記出現回数記憶部に記憶されている前記等価なノードに紐づく前記出現回数をインクリメントする出現回数設定部と、
を更に備える、請求項２に記載の部分木判定装置。
【請求項４】
値を保持する葉ノードと、葉ノード又は他の中間ノードを子ノードとして保持する中間ノードと、親ノードを持たない唯一の中間ノードである根ノードと、を備える木構造データにおける部分木を判定する部分木判定装置により実行される部分木判定方法であって、
前記木構造データの任意の２つの中間ノードについて、各中間ノードの直接の子ノードであって各中間ノードの位置を基準とする相対位置が等しい子ノード同士を、ノードの型、葉ノードの値、又は、中間ノードに割り当てられている、該中間ノードを根ノードとする部分木の全てのノードの出現位置及び全ての葉ノードの値の組についてユニークとなる識別ＩＤに基づいて比較し、前記相対位置が等しい子ノード同士の全ての組について等価であると判定した場合には、前記２つの中間ノードは等価であると判定し、前記相対位置が等しい子ノード同士の少なくとも一組について等価でないと判定した場合には、前記２つの中間ノードは等価でないと判定する等価性判定ステップ、
を含む部分木判定方法。
【請求項５】
値を保持する葉ノードと、葉ノード又は他の中間ノードを子ノードとして保持する中間ノードと、親ノードを持たない唯一の中間ノードである根ノードと、を備える木構造データにおける部分木を判定する部分木判定装置に設けられたコンピュータを、
前記木構造データの任意の２つの中間ノードについて、各中間ノードの直接の子ノードであって各中間ノードの位置を基準とする相対位置が等しい子ノード同士を、ノードの型、葉ノードの値、又は、中間ノードに割り当てられている、該中間ノードを根ノードとする部分木の全てのノードの出現位置及び全ての葉ノードの値の組についてユニークとなる識別ＩＤに基づいて比較し、前記相対位置が等しい子ノード同士の全ての組について等価であると判定した場合には、前記２つの中間ノードは等価であると判定し、前記相対位置が等しい子ノード同士の少なくとも一組について等価でないと判定した場合には、前記２つの中間ノードは等価でないと判定する等価性判定部、
として機能させるための部分木判定プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、部分木判定装置、部分木判定方法、及び部分木判定プログラムに関する。
【背景技術】
【０００２】
木構造データは従来から広く研究され、また、様々な用途に利用されている。例えば最近注目を集めているビッグデータ処理システムであるオープンソースソフトウェアHadoop（下記非特許文献１参照）では、SequenceFileという枠組みを用い、木構造データとして表現した個々のレコードを直列化したうえでストレージに保存する。ビッグデータ処理システムでは大量のデータを保存するため、ストレージ容量を節約するために、個々のレコードは少しでもデータサイズを縮小することが要請される。そのため、SequenceFileでは、直列化した結果をGzip等の従来の圧縮技術で圧縮をしてから保存するのが慣習となっている。
【０００３】
下記非特許文献２には、テキストデータを対象として、従来の圧縮技術では上手く利用できない「長い共通文字列」による冗長性を利用した独自の「事前圧縮」を行った後、従来の圧縮技術で圧縮することにより、単に従来の圧縮技術だけで圧縮するよりも高い圧縮率を達成する旨が述べられている。この考え方を木構造データに応用する場合、できるだけ大きな「共通部分木」を探し出し、その冗長性を利用した独自の「事前圧縮」を行うことが考えられる。ここで、木構造データ内の「共通部分木」を高速に検出する方法としては、下記非特許文献３に記載の方法がある。
【０００４】
また、木構造データ中に、別途指定した木構造に“似た部分木”が含まれているかどうかを探索する、いわゆる部分木パターン探索を行う従来方法として、例えば非特許文献４や下記特許文献１に記載の方法などがある。また、木構造データ中の各ノードにＩＤを割り当て、それを利用した処理を行う方法として、例えば下記特許文献２に記載の方法がある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１１−１２３６１９号公報
【特許文献２】特開平１０−２４０７４１号公報
【非特許文献】
【０００６】
【非特許文献１】“Hadoop”、［ｏｎｌｉｎｅ］、インターネット＜ＵＲＬ：http://hadoop.apache.org/＞
【非特許文献２】Jon  Bentley，Douglas  McIlroy著、“Data  Compression  Using  Long  Common  Strings”、Proceeding．DCC'99  Proceedings  of  the  Conference  on  Data  Compression、１９９９年発行、ｐ．２８７−２９５
【非特許文献３】Fabrizio  Luccio，Antonio  Mesa  Enriquez，Pablo  Olivares  Rieumont，Linda  Pagli著、“Exact  Rooted  Subtree  Matching  in  Sublinear  Time”、Technical  Report：TR-01-14、Universita  Di  Pisa、２００１年発行
【非特許文献４】Tatsuya  Asai，Kenji  Abe，Shinji  Kawasoe，Hiroshi  Sakamoto，Setsuo  Arikawa著、“Efficient  substructure  discovery  from  large  semi-structured  data”、IEICE  transactions  on  information  and  systems  Vol.E87-D(No.12)、２００４年１２月１日発行、ｐ．２７５４−２７６３
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ここで、共通部分木による冗長性を利用した事前圧縮を行うためには、木構造データ中の全ての共通部分木とその出現回数を検出する手段が必要となる。しかしながら非特許文献１に記載のSequenceFileには、共通部分木を検出する機能は備わっていない。
【０００８】
また、木構造データ中の共通部分木を検出する機能は、高速に行えることが望ましい。しかしながら、木構造データ中の全ての部分木について、２つの部分木同士の全ての組合せについて総当りで、かつ、部分木中の全子孫ノードについて再帰的に照合を行おうとすると、指数関数的な計算量を要してしまう。従って、そのような方法は回避すべきである。ここで、非特許文献３では、指定した部分木の木構造データ中における出現回数を高速に検出するための技術について論じている。当該技術は、有限アルファベット集合のうちの一つが各々のノードに「ラベル」として付与される状況のみを対象としている。
【０００９】
しかしながら、非特許文献１に記載のSequenceFileのように、木構造データの葉ノードには任意の値（Integer型の整数値、Double型の実数値、String型の文字列、など）を設定できるようになっているのが一般的である。このような木構造データに対して非特許文献３に記載の技術を適用するには、上記のような任意の値をラベルとして扱える必要があるが、「任意の値」は無限にあるため、有限アルファベット集合を前提としている非特許文献３に記載の技術を適用することは困難である。
【００１０】
また、非特許文献４に記載の方法及び特許文献１に記載の方法では、指定した木に“似た部分木”まで含めて探索するため、完全一致する部分木だけを検出する処理と比べ探索空間が広くなり、処理時間が長くなるという問題がある。特許文献２に記載の方法で用いられるＩＤは、任意のノードを根ノードとする部分木同士の等価性を示すものではなく、等価な部分木を高速に検出するという要求の解決に寄与するものではない。
【００１１】
そこで、本発明は、木構造データに含まれる共通部分木を高速に検出すると共に、共通部分木の出現回数を高速に計数することを目的とする。
【課題を解決するための手段】
【００１２】
本発明に係る部分木判定装置は、値を保持する葉ノードと、葉ノード又は他の中間ノードを子ノードとして保持する中間ノードと、親ノードを持たない唯一の中間ノードである根ノードと、を備える木構造データにおける部分木を判定する部分木判定装置であって、木構造データの任意の２つの中間ノードについて、各中間ノードの直接の子ノードであって各中間ノードの位置を基準とする相対位置が等しい子ノード同士を、ノードの型、葉ノードの値、又は、中間ノードに割り当てられている、該中間ノードを根ノードとする部分木の全てのノードの出現位置及び全ての葉ノードの値の組についてユニークとなる識別ＩＤに基づいて比較し、相対位置が等しい子ノード同士の全ての組について等価であると判定した場合には、２つの中間ノードは等価であると判定し、相対位置が等しい子ノード同士の少なくとも一組について等価でないと判定した場合には、２つの中間ノードは等価でないと判定する等価性判定部を備える。
【００１３】
本発明に係る部分木判定方法は、上記の部分木判定装置により実行される部分木判定方法であって、木構造データの任意の２つの中間ノードについて、各中間ノードの直接の子ノードであって各中間ノードの位置を基準とする相対位置が等しい子ノード同士を、ノードの型、葉ノードの値、又は、中間ノードに割り当てられている、該中間ノードを根ノードとする部分木の全てのノードの出現位置及び全ての葉ノードの値の組についてユニークとなる識別ＩＤに基づいて比較し、相対位置が等しい子ノード同士の全ての組について等価であると判定した場合には、２つの中間ノードは等価であると判定し、相対位置が等しい子ノード同士の少なくとも一組について等価でないと判定した場合には、２つの中間ノードは等価でないと判定する等価性判定ステップを含む。
【００１４】
本発明に係る部分木判定プログラムは、上記の部分木判定装置に設けられたコンピュータを、木構造データの任意の２つの中間ノードについて、各中間ノードの直接の子ノードであって各中間ノードの位置を基準とする相対位置が等しい子ノード同士を、ノードの型、葉ノードの値、又は、中間ノードに割り当てられている、該中間ノードを根ノードとする部分木の全てのノードの出現位置及び全ての葉ノードの値の組についてユニークとなる識別ＩＤに基づいて比較し、相対位置が等しい子ノード同士の全ての組について等価であると判定した場合には、２つの中間ノードは等価であると判定し、相対位置が等しい子ノード同士の少なくとも一組について等価でないと判定した場合には、２つの中間ノードは等価でないと判定する等価性判定部として機能させる。
【００１５】
このような形態では、木構造データにおける中間ノード同士の等価性（すなわち、当該中間ノードを根ノードとする部分木同士の等価性）を判定するにあたって、当該中間ノードの直接の子ノード同士を、ノードの型、葉ノードの値、又は中間ノードに割り当てられている、当該中間ノードを根ノードとする部分木の全てのノードの出現位置及び全ての葉ノードの値の組についてユニークとなる識別ＩＤに基づいて比較する。すなわち、葉ノードと中間ノードについては、ノードの型の違いから等価でないと判定できる。また、葉ノード同士については葉ノードの値が一致すれば等価であると判定でき、一致しなければ等価でないと判定できる。また、中間ノード同士については、中間ノードに割り当てられた識別ＩＤが一致すれば等価であると判定でき、一致しなければ等価でないと判定できる。これにより、中間ノード同士の等価性判定において、当該中間ノードの全ての子孫ノードを再帰的に巡回して比較することなく、中間ノード同士の等価性判断を高速に行うことができる。すなわち、木構造データに含まれる共通部分木を高速に検出することができる。
【００１６】
上記の部分木判定装置では、木構造データの全てのノードを深さ優先で巡回する木構造巡回部と、識別ＩＤを中間ノードに紐づけて記憶する識別ＩＤ記憶部と、前記木構造データの任意の中間ノードである第１中間ノードについて、該第１中間ノードと同一のハッシュ値を持つ中間ノードである第２中間ノードが識別ＩＤ記憶部に記憶されているか否かを判定するハッシュ値判定部と、ハッシュ値判定部が、第２中間ノードが識別ＩＤ記憶部に記憶されていると判定し、且つ、等価性判定部が、第１中間ノードと第２中間ノードとが等価であると判定した場合に、第１中間ノードに対して第２中間ノードの識別ＩＤと同一の識別ＩＤを割り当て、ハッシュ値判定部が、第２中間ノードが識別ＩＤ記憶部に記憶されていないと判定した場合、又は、等価性判定部が、第１中間ノードと第２中間ノードとが等価でないと判定した場合には、第１中間ノードに対して新たな識別ＩＤを割り当てる識別ＩＤ割当部と、識別ＩＤ割当部により第１中間ノードに割り当てられた識別ＩＤを第１中間ノードに紐づけて識別ＩＤ記憶部に登録する識別ＩＤ登録部と、を更に備え、木構造巡回部により巡回され、処理対象とされた中間ノードを第１中間ノードとして、ハッシュ値判定部、等価性判定部、識別ＩＤ割当部、及び識別ＩＤ登録部が各処理を行ってもよい。
【００１７】
このような形態では、木構造データを深さ優先で巡回することで、下位の中間ノードから先に識別ＩＤを割り当てられる。すなわち、任意の中間ノード同士の等価性判断を行う際には、既に当該中間ノードよりも下位の中間ノードについて識別ＩＤの割当が完了していることになる。これにより、木構造データを効率よく巡回しつつ、中間ノード同士の等価性判断を高速に行うことができる。すなわち、木構造データに含まれる共通部分木を高速に検出することができる。
【００１８】
上記の部分木判定装置では、木構造データにおける等価なノードごとに、該等価なノードの木構造データにおける出現回数を該等価なノードに紐づけて記憶する出現回数記憶部と、巡回部により巡回された巡回ノードと等価なノードが出現回数記憶部に記憶されているか否かを判定する既登録判定部と、既登録判定部が、等価なノードが出現回数記憶部に記憶されていないと判定した場合には、巡回ノードが初めて出現したことを示す初期値を、巡回ノードに紐づく出現回数として出現回数記憶部に登録し、既登録判定部が、等価なノードが出現回数記憶部に記憶されていると判定した場合には、出現回数記憶部に記憶されている等価なノードに紐づく出現回数をインクリメントする出現回数設定部と、を更に備えてもよい。
【００１９】
このような形態によれば、木構造データに含まれる共通部分木を検出するための巡回処理において、併せて共通部分木の出現回数を計数することができるため、共通部分木の出現回数を計数するための巡回処理を別途行う必要がなくなる。これにより、共通部分木の出現回数を効率的かつ高速に計数することができる。
【発明の効果】
【００２０】
本発明によれば、木構造データに含まれる共通部分木を高速に検出すると共に、共通部分木の出現回数を高速に計数することができる。
【図面の簡単な説明】
【００２１】
【図１】木構造データ及び深さ優先による処理順序について説明するための図である。
【図２】実施形態に係る部分木判定装置の機能構成を示すブロック図である。
【図３】実施形態に係る部分木判定装置のハードウェア構成を示すブロック図である。
【図４】実施形態に係る木構造データを示す図である。
【図５】実施形態に係る部分木判定装置の動作を示すフロー図である。
【図６】部分木判定装置における出現回数設定処理の動作を示すフロー図である。
【図７】部分木判定装置における識別ＩＤ割当処理の動作を示すフロー図である。
【図８】部分木判定装置における等価性判定処理の動作を示すフロー図である。
【図９】実施形態に係る木構造データにおける識別ＩＤ記憶部に記憶される情報を示す図である。
【図１０】実施形態に係る木構造データにおける出現回数記憶部に記憶される情報を示す図である。
【図１１】実施形態に係る部分木判定プログラムの機能構成を示すブロック図である。
【発明を実施するための形態】
【００２２】
以下、添付図面を参照しながら本発明の実施形態を詳細に説明する。なお、図面の説明において同一又は同等の要素には同一の符号を付し、重複する説明を省略する。
【００２３】
まず、図１を用いて、本実施形態における処理対象となる木構造データについて説明する。図１に示すように、木構造データは、値を保持する葉ノードと、葉ノード又は他の中間ノードを子ノードとして保持する中間ノードと、親ノードを持たない唯一の中間ノードである根ノードと、各ノード間を結ぶエッジとからなるデータ構造である。木構造データの実装方法としては、各ノードに子ノードへのポインタを保持させる方法や各ノードに親ノードへのポインタを保持させる方法などのいくつかの方法があるが、実装方法はこれらの方法のいずれかに限定されない。
【００２４】
一定の規則に基づいて木構造データを巡回することにより、木構造データの各ノードに対応するデータ要素（以下、「各ノードに対応するデータ要素」のことを単に「各ノード」と表記する。）について順に処理を行うことができる。図１において、深さ優先で巡回する場合における巡回経路を点線で示すと共に、各ノードの処理順序を括弧付き数字で示す。
【００２５】
本明細書中において、「部分木」とは、木構造データにおける任意のノード以下の要素（ノード、エッジ）のみによって構成される木のことをいう。すなわち、部分木とは、当該任意のノードを根ノードとする木を意味する。
【００２６】
単に「子」又は「子ノード」と記載した場合には、「孫」又は「孫ノード」が含まれてもよく、「直接の子」又は「直接の子ノード」と記載した場合には、直接の親子関係にある「子」又は「子ノード」のみを意味し、「孫」又は「孫ノード」は含まれないものとする。
【００２７】
「部分木の全てのノードの出現位置及び全ての葉ノードの値の組についてユニーク」とは、部分木のノード構成、すなわち、全てのノード要素の位置、種別（葉又は中間）、及び値（葉ノードの場合）が完全一致すれば同値となり、部分木のノード構成のうちの一つでも異なれば異値となるような性質を意味する。
【００２８】
次に、実施形態に係る部分木判定装置１０の機能要素について、図２を用いて説明する。部分木判定装置１０は、木構造構築部１１、木構造巡回部１２、ハッシュ値計算部１３、識別ＩＤ記憶部１４、ハッシュ値判定部１５、等価性判定部１６、識別ＩＤ割当部１７、識別ＩＤ登録部１８、出現回数記憶部１９、既登録判定部２０、及び出現回数設定部２１を備える。
【００２９】
部分木判定装置１０のハードウェア構成を図３に示す。図３に示すように、部分木判定装置１０は、オペレーティングシステムやアプリケーションプログラムなどを実行するＣＰＵ１０１と、ＲＯＭ及びＲＡＭで構成される主記憶部１０２と、ハードディスクメモリなどで構成される補助記憶部１０３と、データ通信を行う通信制御部１０４と、液晶モニタなどで構成される出力部１０５と、入力デバイスであるキーボード及びマウス等で構成される操作部１０６と、ＣＤ−ＲＯＭやＤＶＤなどの記録媒体１１０を読み取る記録媒体読取部１０７とを備える。
【００３０】
図１に示す部分木判定装置１０の各機能は、ＣＰＵ１０１の制御の下で、主記憶部１０２に所定のソフトウェアプログラムを読み込ませて実行することにより実現される。その際、ＣＰＵ１０１は、ソフトウェアプログラムの処理手順に従い、主記憶部１０２及び補助記憶部１０３におけるデータの読み出し及び書き込み動作を制御し、操作部１０６、出力部１０５及び通信制御部１０４の動作を制御する。
【００３１】
図２の木構造構築部１１は、木構造データを構築する機能要素である。木構造構築部１１は、オブジェクト構造を有するデータについて、各オブジェクトを木構造における各ノードに対応させるように木構造データを構築する。
【００３２】
木構造巡回部１２は、木構造構築部１１により構築された木構造データを深さ優先で巡回する機能要素である。木構造巡回部１２の巡回処理により、後述する他の機能要素は、木構造データの各ノードについて深さ優先で処理を行うことができる。これにより、木構造データの任意のノードについて処理を行う際には、既に当該ノードの下位ノードについての処理が完了されていることが保証される。
【００３３】
ハッシュ値計算部１３は、各ノードのハッシュ値を算出する機能要素である。例えば、ハッシュ値計算部１３は、処理対象のノードが葉ノードの場合には、当該葉ノードの値に基づいて当該葉ノードのハッシュ値を算出し、処理対象のノードが中間ノードの場合には、当該中間ノードの直接の子ノードのハッシュ値に基づいて当該中間ノードのハッシュ値を算出する。葉ノードのハッシュ値算出方法としては、ＭＤ５やＳＨＡ１などの従来方法を用いることができる。また、中間ノードのハッシュ値算出方法としては、当該中間ノードの直接の子ノード全てのハッシュ値の排他的論理和を取るなどの方法がある。ただし、葉ノード及び中間ノードのハッシュ値算出方法はこれらの方法のいずれかに限定されない。ハッシュ値計算部１３により算出された葉ノード及び中間ノードのハッシュ値は、以降で説明する各機能要素により適宜参照される。
【００３４】
識別ＩＤ記憶部１４は、中間ノードのユニーク性を保証する識別ＩＤを中間ノードに紐づけて記憶する機能要素である。本実施形態では、識別ＩＤ記憶部１４は、中間ノードをキーとし、当該中間ノードに紐づく識別ＩＤを当該キーに対応する値として格納するハッシュテーブルとして実装される。ただし、識別ＩＤ記憶部１４の実装方法は、これに限定されない。また、識別ＩＤ記憶部１４は、一定の領域に永続的にデータを記憶するものであってもよいし、一時的にデータを記憶し、データが不要となったら領域を再利用するものであってもよい。また、中間ノード及び識別ＩＤの情報（データ）の格納方法も特に限定されない。例えば、これらの情報は、単一の場所にまとめて記憶されてもよく、複数の場所に分散して記憶されてもよい。なお、本実施形態では説明をわかりやすくするため、図９に示すように、上記ハッシュテーブルには、識別ＩＤと共に中間ノードのハッシュ値を含むものとする。
【００３５】
ハッシュ値判定部１５は、任意の中間ノード（第１中間ノード）と同一のハッシュ値を持つ中間ノード（第２中間ノード）が識別ＩＤ記憶部１４に記憶されているか否かを判定する機能要素である。
【００３６】
等価性判定部１６は、任意の２つの中間ノードが等価であるか否かを判定する機能要素である。具体的には、等価性判定部１６は、任意の２つの中間ノードについて、各中間ノードの直接の子ノードであって各中間ノードの位置を基準とする相対位置が等しい子ノード同士を、ノードの型、葉ノードの値、又は中間ノードの識別ＩＤに基づいて比較する。具体的には、等価性判定部１６は、葉ノードと中間ノードについては、ノードの型の違いから等価でないと判定する。また、等価性判定部１６は、葉ノード同士については葉ノードの値が一致すれば等価であると判定し、一致しなければ等価でないと判定する。また、等価性判定部１６は、中間ノード同士については、中間ノードに割り当てられた識別ＩＤが一致すれば等価であると判定し、一致しなければ等価でないと判定する。等価性判定部１６は、相対位置が等しい直接の子ノード同士の全ての組について等価であると判定した場合には、２つの中間ノードは等価であると判定し、相対位置が等しい直接の子ノード同士の少なくとも一組について等価でないと判定した場合には、２つの中間ノードは等価でないと判定する。
【００３７】
識別ＩＤ割当部１７は、第１中間ノードに識別ＩＤを割り当てる機能要素である。具体的には、識別ＩＤ割当部１７は、ハッシュ値判定部１５が、第１中間ノードと同一のハッシュ値を持つ中間ノード（第２中間ノード）が識別ＩＤ記憶部１４に記憶されていると判定し、さらに、等価性判定部１６が、第１中間ノードと第２中間ノードとが等価であると判定した場合には、第１中間ノードに対して第２中間ノードの識別ＩＤと同一の識別ＩＤを割り当て、ハッシュ値判定部１５が、第２中間ノードが識別ＩＤ記憶部１４に記憶されていないと判定し、又は、等価性判定部１６が、第１中間ノードと第２中間ノードとが等価でないと判定した場合には、第１中間ノードに対して新たな識別ＩＤを割り当てる。ここで、中間ノードに対する識別ＩＤの割当は、例えば、中間ノードに対応するオブジェクトのメンバ変数として識別ＩＤを保持させる方法などにより実現できる。ただし、中間ノードに対する識別ＩＤの割当方法は上記の方法に限定されない。
【００３８】
上述したように、中間ノードのハッシュ値はハッシュ値計算部１３が算出するが、中間ノードを根ノードとする部分木のノード構成に対して一意のハッシュ値を生成することを保証するものではない。すなわち、互いにノード構成の異なる中間ノードについて、ハッシュ値が重複する可能性があるため、ハッシュ値が一致することをもって直ちに「等価である」と判定することはできない。そのため、識別ＩＤ割当部１７は、上記のように、ハッシュ値判定部１５の判定だけでなく、等価性判定部１６の判定を併せて行うことにより、中間ノードの等価性判定を確実に行い、その結果に応じた識別ＩＤの割当を行う。
【００３９】
識別ＩＤ割当部１７は、既に他の中間ノードに割り当てた識別ＩＤと重複しない新たな識別ＩＤを割り当てる。識別ＩＤを重複して割り当てないように識別ＩＤを割り当てる方法としては、例えば、新たに割り当てる識別ＩＤの値を保持し識別ＩＤが新たに割り当てられると自動で値をインクリメントする識別ＩＤカウンタを、識別ＩＤ割当部１７に設ける方法がある。ただし、識別ＩＤの割当方法は、識別ＩＤの重複割当がされないものであれば何でもよく、上記の方法に限定されない。
【００４０】
識別ＩＤ登録部１８は、識別ＩＤ割当部１７が第１中間ノードに割り当てた識別ＩＤを識別ＩＤ記憶部１４に登録する機能要素である。
【００４１】
出現回数記憶部１９は、木構造データにおける等価なノードごとに、木構造データにおける出現回数を等価なノードに紐づけて記憶する機能要素である。本実施形態では、出現回数記憶部１９は、等価なノードをキーとし、等価なノードに紐づく出現回数を当該キーに対応する値として格納するハッシュテーブルとして実装される。ただし、出現回数記憶部１９の実装方法は、これに限定されない。また、出現回数記憶部１９は、一定の領域に永続的にデータを記憶するものであってもよいし、一時的にデータを記憶し、データが不要となったら領域を再利用するものであってもよい。また、ノード及び出現回数の情報（データ）の格納方法も特に限定されない。例えば、これらの情報は、単一の場所にまとめて記憶されてもよく、複数の場所に分散して記憶されてもよい。
【００４２】
既登録判定部２０は、木構造巡回部１２により巡回され、処理対象とされた巡回ノードが出現回数記憶部１９に既に登録されているか否かを判定する機能要素である。具体的には、既登録判定部２０は、巡回ノードが葉ノードである場合には、巡回ノードと同一のハッシュ値を持つ葉ノード（等価なノード）が出現回数記憶部１９に記憶されているか否かを判定し、巡回ノードが中間ノードである場合には、巡回ノードと同一の識別ＩＤを持つ中間ノード（等価なノード）が出現回数記憶部１９に記憶されているか否かを判定する。
【００４３】
出現回数設定部２１は、木構造データにおける等価な部分木ごとの出現回数を設定する機能要素である。具体的には、出現回数設定部２１は、既登録判定部２０が、等価なノードが出現回数記憶部１９に記憶されていないと判定した場合には、巡回ノードが初めて出現したことを示す初期値を巡回ノードに紐づく出現回数として出現回数記憶部１９に登録し、既登録判定部２０が、等価なノードが出現回数記憶部１９に記憶されていると判定した場合には、出現回数記憶部１９に記憶されている等価なノードに紐づく出現回数をインクリメントする。本実施形態では、「初期値」として整数値「１」を用いるが、初期値は、部分木判定装置１０を含むシステム内において整合が取れているものであればよく、例えば「０」を用いてもよい。
【００４４】
次に、図４に示す本実施形態に係る木構造データを用いて、図５〜図８に示す部分木判定装置１０の動作を説明する。図４に示す木構造データにおいて、識別ＩＤ記憶部１４に記憶されるハッシュテーブルの情報を図９に示し、出現回数記憶部１９に記憶されるハッシュテーブルの情報を図１０に示す。ここで、図９及び図１０に示すハッシュテーブルの要素の並びは、登録された順である。
【００４５】
図５において、木構造構築部１１は、処理対象のデータ構造に基づいて、図４に示すような木構造データを構築する（ステップＳ５０１）。その後、木構造巡回部１２は、当該木構造データの根ノードを現在ノードとして、木構造データの巡回を開始する（ステップＳ５０２）。木構造巡回部１２は、現在ノードに未巡回の直接の子ノードがあるか否かの判定を行い、深さ優先により最初に発見された未巡回ノードである「中間ａ」に移動する（ステップＳ５０３：ＹＥＳ、ステップＳ５０４）。
【００４６】
現在ノード（中間ａ）が中間ノードであるため（ステップＳ５０５：ＹＥＳ）、木構造巡回部１２は、ステップＳ５０３の判定に移り、現在ノード（中間ａ）に未巡回の直接の子ノードがあるか否かの判定を行う。その後、上述の処理と同様の処理が繰り返され、木構造巡回部１２は、「中間ａ」→「中間ｂ」→「“ｆｏｏ”」と移動し、現在ノード（“ｆｏｏ”）について、ステップＳ５０５の判定を行う。ここで、現在ノード（“ｆｏｏ”）は葉ノードであるため、図６に示す出現回数設定処理が実行される（ステップＳ５０５：ＮＯ、ステップＳ５０６）。
【００４７】
出現回数記憶部１９には、まだ何も記憶されていないため、既登録判定部２０は、等価なノードが出現回数記憶部１９に記憶されていないと判定し（ステップＳ６０１：ＮＯ）、出現回数設定部２１が、初期値（整数値「１」）を現在ノード（“ｆｏｏ”）の出現回数として出現回数記憶部１９に登録する（ステップＳ６０２）。この時点では「“ｆｏｏ”」の出現回数は「１」となっている。その後、木構造巡回部１２は、親ノード（中間ｂ）に移動する（ステップＳ５０７）。続いて、「中間ｂ」の２番目の子ノード（１．２３）について、上述した「“ｆｏｏ”」に対する処理と同様の処理がされる。その後、木構造巡回部１２は、再び親ノード（中間ｂ）に移動する（ステップＳ５０７）。
【００４８】
木構造巡回部１２は、現在ノード（中間ｂ）についてステップＳ５０３の判定を行う。ここで、木構造巡回部１２は、現在ノード（中間ｂ）の全ての直接の子ノード（“ｆｏｏ”、１．２３）について巡回処理が完了しているため、未巡回の直接の子ノードはないと判定する（ステップＳ５０３：ＮＯ）。さらに、現在ノード（中間ｂ）は根ノードではないため、図７に示す識別ＩＤ割当処理が実行される（ステップＳ５０８：ＮＯ、ステップＳ５０９）。
【００４９】
識別ＩＤ記憶部１４には、まだ何も記憶されていないため、ハッシュ値判定部１５は、現在ノード（中間ｂ）と同一のハッシュ値を持つ中間ノードは識別ＩＤ記憶部１４に記憶されていないと判定し（ステップＳ７０１：ＮＯ）、識別ＩＤ割当部１７が、新たな識別ＩＤ（初期値「０」）を「中間ｂ」に割り当てる（ステップＳ７０２）。続いて、出現回数設定処理（ステップＳ５１０）が実行される。その後、木構造巡回部１２は、親ノードへ移動する（ステップＳ５１１）。
【００５０】
続いて、「９８７」、「中間ｃ」、「中間ａ」の順に、各ノードについて上述の処理と同様の処理がされる。続いて、木構造巡回部１２は、一旦根ノードまで遡った後、「中間ｄ」→「中間ｅ」→「“ｆｏｏ”」と移動し、現在ノード（“ｆｏｏ”）について、出現回数設定処理（ステップＳ５０６）がされる。
【００５１】
出現回数記憶部１９には、現在ノード（“ｆｏｏ”）の等価なノード（図１０の１つ目のレコード）が存在するため、既登録判定部２０は、等価なノードが出現回数記憶部１９に記憶されていると判定し（ステップＳ６０１：ＹＥＳ）、出現回数設定部２１が、当該等価なノードの出現回数をインクリメントする（ステップＳ６０３）。これにより、「“ｆｏｏ”」の出現回数は「２」となる。続いて、「中間ｅ」の子ノードの「１．２３」についても、同様の処理がされる。
【００５２】
続いて、木構造巡回部１２は「中間ｅ」に移動し、現在ノード（中間ｅ）について、識別ＩＤ割当処理（ステップＳ５０９）が実行される。識別ＩＤ記憶部１４には、「中間ｅ」と同一のハッシュ値を持つ「中間ｂ」が記憶されているため、等価性判定部１６により、図８に示す等価性判定処理が実行される（ステップＳ７０１：ＹＥＳ、ステップＳ７０３、等価性判定ステップ）。
【００５３】
「中間ｅ」と「中間ｂ」は直接の子ノードの個数がいずれも「２」と一致するため、比較対象ノードとして各中間ノードの位置を基準とする相対位置が等しい直接の子ノード（「中間ｅ」の直接の子ノードである“ｆｏｏ”と「中間ｂ」の直接の子ノードである“ｆｏｏ”）が抽出される（ステップＳ８０１：ＹＥＳ、ステップＳ８０２）。これらのノードは、いずれも型が「String型」で値が「“ｆｏｏ”」である葉ノードであるため（ステップＳ８０３：ＹＥＳ、ステップＳ８０４：ＮＯ、ステップＳ８０５：ＹＥＳ）、全ての直接の子ノード同士の比較が完了したか否かの判定（ステップＳ８０７）がされる。
【００５４】
ここで、未比較の直接の子ノードが残っているため、「中間ｅ」の直接の子ノードである「１．２３」と「中間ｂ」の直接の子ノードである「１．２３」とが比較対象ノードとして抽出される（ステップＳ８０７：ＮＯ、ステップＳ８０２）。これらのノードは、いずれも型が「Double型」で値が「１．２３」である葉ノードであり、この比較で全ての直接の子ノードの比較が完了するため（ステップＳ８０３：ＹＥＳ、ステップＳ８０４：ＮＯ、ステップＳ８０５：ＹＥＳ、ステップＳ８０７：ＹＥＳ）、等価性判定部１６は、「中間ｅ」と「中間ｂ」とは「等価である」と判定する（ステップＳ８０９）。その後、「等価である」との等価性判定結果を受けて（ステップＳ７０４：ＹＥＳ）、識別ＩＤ割当部１７が、「中間ｅ」に対して「中間ｂ」と同一の識別ＩＤ（「０」）を割り当て、識別ＩＤ登録部１８が、当該識別ＩＤを識別ＩＤ記憶部１４に登録する（ステップＳ７０５）。
【００５５】
続いて、出現回数設定処理（ステップＳ５１０）が実行される。出現回数記憶部１９には、「中間ｅ」と同一の識別ＩＤを持つ「中間ｂ」が記憶されているため、既登録判定部２０は、等価なノードが出現回数記憶部１９に記憶されていると判定し、「中間ｂ」の出現回数をインクリメントする。これにより、「中間ｂ」の出現回数は「２」となる。その後、「９８７」、「中間ｆ」の順に、各ノードについて上述と同様の処理がされる。
【００５６】
続いて、「中間ｄ」について、識別ＩＤ割当処理（ステップＳ５０９）がされる。識別ＩＤ記憶部１４には、「中間ｄ」と同一のハッシュ値を持つ「中間ａ」が記憶されているため、等価性判定部１６により、等価性判定処理が実行される（ステップＳ７０１：ＹＥＳ、ステップＳ７０３）。「中間ｄ」と「中間ａ」は直接の子ノードの個数がいずれも「２」と一致するため、比較対象ノードとして各中間ノードの位置を基準とする相対位置が等しい直接の子ノード（「中間ｂ」と「中間ｅ」）が抽出される（ステップＳ８０１：ＹＥＳ、ステップＳ８０２）。これらのノードは、いずれも型が「オブジェクト型」の中間ノードであるため（ステップＳ８０３：ＹＥＳ、ステップＳ８０４：ＹＥＳ）、識別ＩＤによる比較がされる（ステップＳ８０６）。
【００５７】
ここで、識別ＩＤ記憶部１４には、「中間ｄ」及び「中間ａ」について同一の識別ＩＤが記憶されているため、等価性判定部１６は、「中間ｄ」と「中間ａ」とは、識別ＩＤが同一であると判定する（ステップＳ８０６：ＹＥＳ）。その後、「中間ｃ」と「中間ｆ」についても上述と同様の処理がされ、全ての直接の子ノードの比較が完了した時点で、「中間ｄ」と「中間ａ」とは「等価である」と判定される（ステップＳ８０７：ＹＥＳ、ステップＳ８０９）。その後、識別ＩＤ割当部１７が、「中間ｄ」に対して「中間ａ」と同一の識別ＩＤ（「２」）を割り当て、識別ＩＤ登録部１８が、当該識別ＩＤを識別ＩＤ記憶部１４に登録する（ステップＳ７０５）。
【００５８】
続いて、出現回数設定処理（ステップＳ５１０）が実行される。出現回数記憶部１９には、「中間ｄ」と同一の識別ＩＤを持つ「中間ａ」が記憶されているため、既登録判定部２０は、等価なノードが出現回数記憶部１９に記憶されていると判定し、「中間ａ」の出現回数をインクリメントする。これにより、「中間ａ」の出現回数は「２」となる。
【００５９】
その後、「“ｂａｒ”」、「４５６」、「中間ｇ」の順に処理がされる。ここで、「中間ｇ」については、同一のハッシュ値を持つ中間ノードである「中間ｂ」及び「中間ｅ」が識別ＩＤ記憶部１４に記憶されているため、等価性判定処理が実行される（ステップＳ７０１：ＹＥＳ、ステップＳ７０３）。等価性判定処理において、直接の子ノードの個数は一致すると判定される（ステップＳ８０１：ＹＥＳ）。続いて、比較対象ノード（「“ｆｏｏ”」と「“ｂａｒ”」）の型（String型）は一致し、いずれも葉ノードであるため、値が同一か否かの判定がされるが、値が異なるため、「等価でない」と判定される（ステップＳ８０２、ステップＳ８０３：ＹＥＳ、ステップＳ８０４：ＮＯ、ステップＳ８０５：ＮＯ、ステップＳ８０８）。
【００６０】
木構造巡回部１２は、「中間ｇ」の処理が完了した後に、根ノードに移動する。その後、未巡回の直接の子ノードがなく、現在ノードが根ノードであることから、部分木判定装置１０は処理を完了する（ステップＳ５０３：ＮＯ、ステップＳ５０８：ＹＥＳ）。
【００６１】
次に、図１１を用いて、コンピュータを部分木判定装置１０として機能させるための部分木判定プログラムＰ１０について説明する。
【００６２】
図１１は、部分木判定方法を実行することができる部分木判定プログラムＰ１０のモジュールを示すブロック図である。図１１に示すように、部分木判定プログラムＰ１０は、等価性判定モジュールＰ１６を備える。上記等価性判定モジュールＰ１６が実行されることにより実現される機能は、上述した部分木判定装置１０において対応する等価性判定部１６の機能と同様である。
【００６３】
このように構成された部分木判定プログラムＰ１０は、図３に示す記録媒体１１０に記憶され、部分木判定装置１０として用いられるコンピュータにより実行される。当該コンピュータは、記録媒体１１０が記録媒体読取部１０７に挿入されると、記録媒体読取部１０７から記録媒体１１０に格納された部分木判定プログラムＰ１０にアクセス可能となり、当該部分木判定プログラムＰ１０を実行することによって、本実施形態に係る部分木判定装置１０として動作することが可能となる。
【００６４】
部分木判定プログラムＰ１０は、搬送波に重畳されたコンピュータデータ信号としてネットワークを介して提供されるものであってもよい。この場合、部分木判定装置１０として用いられるコンピュータは、通信制御部１０４によって受信した部分木判定プログラムＰ１０を主記憶部１０２に格納することにより、当該部分木判定プログラムＰ１０を実行することができる。
【００６５】
以上説明したように、本実施形態によれば、木構造データにおける中間ノード同士の等価性（すなわち、当該中間ノードを根ノードとする部分木同士の等価性）を判断するにあたって、当該中間ノードの直接の子ノードの値又は識別ＩＤを用いることができる。これにより、当該中間ノードの全ての子孫ノードを再帰的に巡回し、比較する必要がなくなる。すなわち、木構造データの規模が大きい場合でも、計算量を指数関数的に増大させることなく、中間ノード同士の等価性判断を高速に行うことができ、木構造データに含まれる共通部分木を高速に検出することができる。
【００６６】
さらに、木構造データを深さ優先で巡回することで、下位の部分木から順に識別ＩＤを割り当てられるようにすることができる。すなわち、中間ノード同士（例えば、「中間ａ」と「中間ｄ」）の等価性判断を行う際には、既に当該中間ノードよりも下位の中間ノード（例えば、「中間ｂ」、「中間ｃ」、「中間ｅ」、「中間ｆ」）について識別ＩＤの割当が完了していることになる。これにより、木構造データを効率よく巡回しつつ、中間ノード同士の等価性判断を高速に行うことができる。
【００６７】
また、木構造データに含まれる共通部分木を検出するための巡回処理において、併せて共通部分木の出現回数を計数することができるため、共通部分木の出現回数を計数するための巡回処理を別途行う必要がなくなる。これにより、木構造データの規模が大きい場合でも、計算量を指数関数的に増大させることなく、共通部分木の出現回数を効率的かつ高速に計数することができる。
【００６８】
以上、本発明に係る実施形態について詳細に説明した。しかし、本発明は、上記実施形態に限定されるものではない。本発明は、その要旨を逸脱しない範囲において様々な変形が可能である。
【符号の説明】
【００６９】
１０…部分木判定装置、１１…木構造構築部、１２…木構造巡回部、１３…ハッシュ値計算部、１４…識別ＩＤ記憶部、１５…ハッシュ値判定部、１６…等価性判定部、１７…識別ＩＤ割当部、１８…識別ＩＤ登録部、１９…出現回数記憶部、２０…既登録判定部、２１…出現回数設定部、Ｐ１０…部分木判定プログラム、Ｐ１６…等価性判定モジュール。
【図１】
2014026331.tif 000003
【図２】
2014026331.tif 000004
【図３】
2014026331.tif 000005
【図４】
2014026331.tif 000006
【図５】
2014026331.tif 000007
【図６】
2014026331.tif 000008
【図７】
2014026331.tif 000009
【図８】
2014026331.tif 000010
【図９】
2014026331.tif 000011
【図１０】
2014026331.tif 000012
【図１１】
2014026331.tif 000013