Сравнение двух древовидных структур


13

Я с трудом пытаюсь описать это в правильных терминах, поэтому я просто приведу как можно больше подробностей, и, надеюсь, кто-то знает, что я пытаюсь сделать = -)

Я пытаюсь сравнить два дерева узлов, чтобы определить, насколько они похожи / различны по структуре. На приведенных ниже схемах оба примера имеют одинаковое количество детей, внуков и т. Д. В примере 1 у Root есть ребенок с двумя детьми, а в примере два - с root.

Я мог бы, вероятно, выяснить, как выполнить рекурсивный цикл и подсчитать, сколько существует каждого уровня, и сравнить это, давая мне представление о том, насколько похожи деревья, но, только делая это таким образом, будет выглядеть, как будто они идентичны, но на самом деле это не так.

Кто-нибудь случайно узнал об этом? Или даже какой технический термин для чего это?

Изменить: Кроме того, это в C #, и я использую списки для хранения этих объектов и их детей.

Пример 1

введите описание изображения здесь

Пример 2

введите описание изображения здесь


1
Чего вы на самом деле пытаетесь достичь? Это немного похоже на проблему XY .
msell

Лучший способ описать это для сравнения «молекулярных» структур, которые пользователь создает по одной молекуле за раз. Пример 1 мог бы быть структурой, созданной пользователем, а пример 2 мог бы быть частью списка предопределенных структур, чтобы помочь определить, создал ли пользователь правильную структуру. Изоморфизм корневых деревьев - это, по-видимому, то, что я искал = -)
Мунгоид

Ответы:


11

То, что вы ищете, это изоморфизм корневых деревьев , который является специализированной версией изоморфизма графов , за исключением деревьев и корневой узел является фиксированным.

Объяснение, данное в этом назначении, использует два свойства:

  • Имеют одинаковое количество уровней (расстояние между корневыми и листовыми узлами)
  • Каждый уровень имеет одинаковое количество узлов

Используя эти два свойства, продвигайтесь вверх от листьев к корню, помечая каждый узел количеством детей в лексикографическом порядке. Например, ваш корень в примере 1 будет помечен (0, 0, (0, 1)) - у него три ребенка, у первого / второго 0 детей, а у третьего 2 ребенка, имеющих 0 и 1 ребенка соответственно. Наконец, вы просто сравниваете корневые метки, чтобы увидеть, совпадают ли деревья.

Я не занимался этим предметом, и я только прочитал эту статью несколько минут назад, поэтому я не могу ручаться за ее правильность; надеюсь, это поможет в любом случае.


Удивительно, это именно то, что я ищу! Я должен попробовать. Благодарность!
Мунгоид

Я думаю, что это работает, только если у вас есть корневой узел, но в этом случае это может иметь место: D +1
Рой Т.

Если корневой узел не указан, вы все равно можете использовать эту технику, но попробуйте каждый корень. При сравнении двух деревьев это означает повторение до n раз.
congusbongus

Да, это работает как шарм.
Потребовалось

Спасибо за это, похоже, что-то, что я тоже мог бы использовать, я люблю алгоритм, чтобы найти центр дерева. Очень умно.
oodavid

4

Проблема, чтобы увидеть, являются ли два графика логически одинаковыми, называется Graph Isomorphishm, поэтому вы можете захотеть начать с этого.

Обратите внимание, что общая проблема изоморфизма графов есть в NP, однако для этого особого случая может быть ярлык, я не уверен, так как кажется логичным, что для того, чтобы узнать различия, нужно проверить, равны ли они.


Да, это то, что мне нужно. Никогда бы не понял, как это называется. Спасибо = -)
Мунгоид
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.