Я с трудом пытаюсь описать это в правильных терминах, поэтому я просто приведу как можно больше подробностей, и, надеюсь, кто-то знает, что я пытаюсь сделать = -)
Я пытаюсь сравнить два дерева узлов, чтобы определить, насколько они похожи / различны по структуре. На приведенных ниже схемах оба примера имеют одинаковое количество детей, внуков и т. Д. В примере 1 у Root есть ребенок с двумя детьми, а в примере два - с root.
Я мог бы, вероятно, выяснить, как выполнить рекурсивный цикл и подсчитать, сколько существует каждого уровня, и сравнить это, давая мне представление о том, насколько похожи деревья, но, только делая это таким образом, будет выглядеть, как будто они идентичны, но на самом деле это не так.
Кто-нибудь случайно узнал об этом? Или даже какой технический термин для чего это?
Изменить: Кроме того, это в C #, и я использую списки для хранения этих объектов и их детей.
Пример 1
Пример 2
источник
Ответы:
То, что вы ищете, это изоморфизм корневых деревьев , который является специализированной версией изоморфизма графов , за исключением деревьев и корневой узел является фиксированным.
Объяснение, данное в этом назначении, использует два свойства:
Используя эти два свойства, продвигайтесь вверх от листьев к корню, помечая каждый узел количеством детей в лексикографическом порядке. Например, ваш корень в примере 1 будет помечен (0, 0, (0, 1)) - у него три ребенка, у первого / второго 0 детей, а у третьего 2 ребенка, имеющих 0 и 1 ребенка соответственно. Наконец, вы просто сравниваете корневые метки, чтобы увидеть, совпадают ли деревья.
Я не занимался этим предметом, и я только прочитал эту статью несколько минут назад, поэтому я не могу ручаться за ее правильность; надеюсь, это поможет в любом случае.
источник
Проблема, чтобы увидеть, являются ли два графика логически одинаковыми, называется Graph Isomorphishm, поэтому вы можете захотеть начать с этого.
Обратите внимание, что общая проблема изоморфизма графов есть в NP, однако для этого особого случая может быть ярлык, я не уверен, так как кажется логичным, что для того, чтобы узнать различия, нужно проверить, равны ли они.
источник