潜在的に無限のシンボルのセットがあります:A, B, C, ...
明確な特別なプレースホルダー シンボルもあります?
(その意味は以下で説明します)。
すべてのノードにシンボルがアタッチされ、0 個以上の空でないサブツリーがあるような、空でない有限ツリーを検討してください。特定のノードのサブツリーの順序は重要です (したがって、たとえば、2 つのサブツリーを持つノードがある場合、どちらが左でどちらが右であるかを区別できます)。任意のシンボルは、異なるノードに接続されたツリーに 0 回以上表示できます。プレースホルダ シンボル?
は、リーフ ノード (つまり、サブツリーを持たないノード) にのみ付けることができます。ツリーが非循環であることは、ツリーの通常の定義から導き出されます。
有限性要件は、ツリー内のノードの総数が正の有限整数であることを意味します。添付されたシンボルの総数、ツリーの深さ、およびすべてのサブツリーのノードの総数はすべて有限です。
ツリーは関数表記法で与えられます。ノードはそれに付けられた記号で表され、サブツリーがある場合は、同じ方法で再帰的に表されるサブツリーのカンマ区切りのリストを含む括弧が続きます。だから、例えば木
A
/ \
? B
/ \
A C
/|\
A C Q
\
?
として表されA(?,B(A(A,C,Q(?)),C))
ます。
一致するパターンとして使用される、事前に計算された不変のツリーSのセットがあります。通常、セットには ~ 10 5のツリーがあり、そのすべての要素には通常 ~ 10 ~ 30 のノードがあります。以下に述べる私の問題に最も適したSの表現を事前に作成するのに十分な時間を費やすことができます。
ツリーT (通常は ~ 10 2ノード)を受け入れ、TがサブツリーとしてSの要素を含むかどうかを可能な限り高速にチェックする関数を作成する必要があります。TまたはSの要素に?
現れる場合の両方)。
セットSを格納するデータ構造と一致をチェックするアルゴリズムを提案してください。任意のプログラミング言語または疑似コードで問題ありません。