Questi alberi sono isomorfi?


21

introduzione

In questa sfida, il tuo compito è scrivere un programma che decida se due alberi sono isomorfi. Un albero indica un grafico aciclico diretto in cui ogni nodo ha esattamente un bordo in uscita, tranne la radice, che non ne ha. Due alberi sono isomorfi se uno può essere trasformato nell'altro rinominando i nodi. Ad esempio, i due alberi (dove ogni bordo punta verso l'alto)

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

sono facilmente visti come isomorfi.

Codifichiamo un albero come un elenco Ldi numeri interi non negativi nel modo seguente. La radice dell'albero ha un'etichetta 0e ha anche dei nodi 1,2,...,length(L). Ogni nodo i > 0ha un fronte in uscita verso L[i](usando l'indicizzazione basata su 1). Ad esempio, l'elenco (con gli indici indicati sotto gli elementi)

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

codifica l'albero

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

Ingresso

I tuoi input sono due elenchi di numeri interi non negativi, forniti nel formato nativo o nella tua lingua. Codificano due alberi nel modo sopra specificato. Puoi assumere le seguenti condizioni al riguardo:

  1. Non sono vuoti.
  2. Hanno la stessa lunghezza.
  3. Ogni elenco Lsoddisfa L[i] < iper tutti gli indici (basati su 1) i.

Produzione

La tua produzione deve essere un valore veritiero se gli alberi sono isomorfi e un valore falso in caso contrario.

Regole e punteggio

È possibile scrivere un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard. Non ci sono limiti di tempo, ma gli built-in che decidono l'isomorfismo dell'albero o del grafico non sono consentiti.

Casi test

Istanze sincere

[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]

Casi falsi

[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, hai fatto in modo che OP non consentisse i builtin ... Avevo una soluzione Mma a 60 byte ...
LegionMammal978,

Risposte:


2

Mathematica, 48 byte

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

È ancora più breve della soluzione che utilizza IsomorphicGraphQ:

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

6

Python, 83

La funzione anonima sulla seconda riga è la mia soluzione.

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)

frestituisce una forma canonizzata di una sottostruttura che è un elenco ordinato dei suoi figli canonizzati. Quindi dobbiamo semplicemente verificare se le forme canonizzate di ogni albero sono uguali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.