2つのツリー構造の比較


13

私はこれを正しい用語で説明しようとするのに苦労しているので、できるだけ多くの詳細を提供し、誰かが私がやろうとしていることを知っていることを願っています=-)

2つのノードツリーを比較して、それらが構造的に類似/異なるかどうかを判断しようとしています。以下の図では、両方の例に同じ数の子、孫などがあります。例1では、Rootには2つの子を持つ子がありますが、例2では、​​rootにはありません。

再帰的にループする方法を見つけて、各レベルの数を数え、それを比較して、ツリーがどれほど似ているかを知ることができますが、それだけで同じように見えますが、実際にはそうではありません。

誰でもこれについて知っていますか?それとも、これが何であるかを表す専門用語ですか?

編集:また、これはC#であり、これらのオブジェクトとその子を保存するためにリストを使用しています。

例1

ここに画像の説明を入力してください

例2

ここに画像の説明を入力してください


1
実際に何を達成しようとしていますか?これはXY問題のように聞こえます
msell

私がそれを説明できる最善の方法は、ユーザーが一度に1つの分子を作成する「分子」構造を比較することです。例1はユーザーが作成した構造であり、例2はユーザーが正しい構造を作成したかどうかを判断するのに役立つ定義済み構造のリストの一部です。ルートツリーの同型は、明らかに私が探していたものです=-)
Mungoid

回答:


11

探しているのは根付きツリー同型です。これは、グラフ同型の特殊バージョンであり、ツリーとルートノードは固定されています。

この割り当ての説明では、2つのプロパティを使用しています。

  • レベル数が同じ(ルートノードとリーフノード間の距離)
  • 各レベルには同じ数のノードがあります

これらの2つのプロパティを使用して、リーフからルートへと進み、各ノードに辞書式の順序で子の数をラベル付けします。たとえば、例1のルートには(0、0、(0、1))というラベルが付けられます-3つの子があり、1番目/ 2番目には0の子があり、3番目にはそれぞれ0と1の子を持つ2つの子があります。最後に、ルートラベルを比較して、ツリーが同じかどうかを確認します。

私はこの種の主題をやったことがなく、数分前にこの論文を読んだだけなので、その正確さを保証することはできません。とにかくそれが役立つことを願っています。


素晴らしい、それはまさに私が探しているものです!私はそれを試してみる必要があります。ありがとう!
マンゴイド

これはルートノードがある場合にのみ機能すると思いますが、この場合はそうかもしれません:D +1
Roy T.

ルートノードが指定されていない場合でも、この手法を使用できますが、すべてのルートを試してください。2つのツリーを比較する場合、これは最大n回繰り返すことを意味します。
コンガスボン

うん、それは魅力のように働いた。それを理解するのに少し時間がかかりましたが、完璧に動作します=-)
Mungoid

これをありがとう、私も使用できるもののように見えます、私はツリーの中心を見つけるためのアルゴリズムを愛しています。非常に賢い。
oodavid

4

2つのグラフが論理的に同じかどうかを確認する問題は、Graph Isomorphishmと呼ばれるため、そこから開始することをお勧めします。

一般的なGraph Isomorphism問題はNPにありますが、この特別な場合にはショートカットが存在する可能性があることに注意してください。


うん、私が必要なもの。それが何と呼ばれたのか理解できなかっただろう。ありがとう=-)
マンゴイド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.