Порівняння двох структур дерева


13

Мені важко намагатися описати це правильними термінами, тому я просто розповім якомога більше деталей і, сподіваюся, хтось знає, що я намагаюся зробити = -)

Я намагаюся порівняти два дерева вузлів, щоб визначити, наскільки вони схожі / різні за структурою. На моїх діаграмах нижче, обидва приклади мають однакову кількість дітей, онуків і т. Д. У прикладі 1 Корінь має дитину з двома дітьми, але в прикладі двоє кореня немає.

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

Хтось про це знає? Або навіть який технічний термін для чого це?

Редагувати: також це в C #, і я використовую списки для зберігання цих об'єктів та їхніх дітей.

Приклад 1

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

Приклад 2

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


1
Чого ви насправді намагаєтесь досягти? Це звучить трохи як проблема XY .
msell

Найкращим чином я можу описати це для порівняння "молекулярних" структур, які користувач створює одну молекулу за один раз. Приклад 1 буде структурою, яку створив користувач, а приклад 2 міг би бути частиною списку заздалегідь визначених структур, що допоможе визначити, чи створив користувач правильну структуру. Ізоморфізм кореневого дерева, мабуть, те, що я шукав = -)
Мангоїд

Відповіді:


11

Що ви шукаєте - це вкорінений ізоморфізм дерева, який є спеціалізованою версією Графічного ізоморфізму , за винятком дерев та кореневого вузла.

Пояснення, дане в цьому завданні, використовує два властивості:

  • Мати однакову кількість рівнів (відстань між кореневими та листковими вузлами)
  • Кожен рівень має однакову кількість вузлів

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

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


Дивовижне, це майже саме те, що я шукаю! Мені доведеться його відпустити. Спасибі!
Мангоїд

Я думаю, що це працює лише в тому випадку, якщо у вас є кореневий вузол, але в цьому випадку це може бути так: D +1
Roy T.

Якщо кореневий вузол не вказаний, ви все одно можете використовувати цю техніку, але спробуйте кожен корінь. Якщо порівнювати два дерева, це означає повторення до n разів.
congusbongus

Так, це спрацювало як шарм. Витратили трохи часу, щоб зрозуміти це, але працює ідеально = -)
Мангоїд

Дякую за це, схоже на те, що я теж міг би використовувати, я люблю алгоритм пошуку Центру дерева. Дуже розумний.
oodavid

4

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

Зауважте, що загальна проблема ізоморфізму графіка є в NP, однак для цього особливого випадку може бути ярлик, я не впевнений, оскільки здається логічним, що для того, щоб знати відмінності, вам потрібно перевірити, чи вони рівні.


Так, це мені потрібно. Ніколи б не зрозумів, як це називається. Спасибі = -)
Мангоїд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.