Ці дерева ізоморфні?


21

Вступ

У цьому виклику ваше завдання полягає в тому, щоб написати програму, яка вирішить, чи є два задані дерева ізоморфними. Дерево означає спрямований ациклічний графік, де кожен вузол має рівно один вихідний край, крім кореня, якого немає. Два дерева є ізоморфними, якщо одне можна перетворити на інше шляхом перейменування вузлів. Наприклад, два дерева (де кожен край вказує вгору)

  0       0
 /|\     /|\
1 3 4   1 2 5
|\       /|
2 5     3 4

їх легко помітити як ізоморфні.

Ми кодуємо дерево як список Lнегативних цілих чисел наступним чином. Корінь дерева має мітку 0, а також має вузли 1,2,...,length(L). Кожен вузол i > 0має вихідний край до L[i](використовуючи індексацію на основі 1). Наприклад, список (з індексами, наведеними під елементами)

[0,0,1,3,2,2,5,0]
 1 2 3 4 5 6 7 8

кодує дерево

  0
 /|\
1 2 8
| |\
3 5 6
| |
4 7

Вхідні дані

Ваші входи - це два списки неотримливих цілих чисел, наведені у рідному форматі чи вашій мові. Вони кодують два дерева способом, зазначеним вище. Ви можете взяти на себе такі умови:

  1. Вони не порожні.
  2. Вони мають однакову довжину.
  3. Кожен список Lзадовольняє L[i] < iвсім (на основі 1) індексами i.

Вихідні дані

Якщо результат дерев є ізоморфним, то вихідний результат має бути довірчою величиною, а якщо ні - хибною.

Правила та оцінка

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

Тестові кейси

Сутові екземпляри

[0] [0]
[0,1,2,1] [0,1,1,3]
[0,1,1,3,3] [0,1,2,2,1]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,4,2,1]
[0,1,2,3,1,2,3,0,8] [0,1,0,3,3,4,4,7,7]

Фальшиві екземпляри

[0,0] [0,1]
[0,1,2,0,3,3,4] [0,1,2,3,0,4,3]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,5,2,1]
[0,1,1,0,1,3,2,1,5] [0,1,0,3,3,3,2,5,2]
[0,1,2,3,1,2,3,0,8] [0,1,0,1,4,4,5,6,6]
[0,1,0,2,0,3,0,4,0,5] [0,0,2,1,0,3,4,0,0,9]


@DigitalTrauma Dangit, ти змусив ОП заборонити вбудовані ... У мене було 60-байтне рішення Mma ...
LegionMammal978

Відповіді:


2

Математика, 48 байт

SameQ@@(Sort//@(0(0//.PositionIndex@#))&/@{##})&

Це навіть коротше, ніж рішення, яке використовує IsomorphicGraphQ:

IsomorphicGraphQ@@(Graph@*MapIndexed[#->Tr@#2&]/@{##})&

6

Пітона, 83

Анонімна функція на другому рядку - це моє рішення.

f=lambda l,i=0:sorted(f(l,j+1)for j,e in enumerate(l)if e==i)
lambda a,b:f(a)==f(b)

fповертає канонізовану форму піддерева, який є відсортованим списком його канонізованих дітей. Тоді ми повинні просто перевірити, чи однакові канонізовані форми кожного дерева.

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