Tak, możesz wykonać tę kompresję w czasie , ale nie jest to łatwe :) Najpierw dokonamy pewnych obserwacji, a następnie przedstawimy algorytm. Zakładamy, że drzewo początkowo nie jest skompresowane - nie jest to tak naprawdę potrzebne, ale ułatwia analizę.O(nlogn)
Po pierwsze, charakteryzujemy indukcyjnie „równość strukturalną”. Niech i T ' będą dwoma (pod) drzewami. Jeśli zarówno T, jak i T ' są zerowymi drzewami (w ogóle nie mają wierzchołków), są one strukturalnie równoważne. Jeśli oba T i T ' nie są zerowymi drzewami, to są one strukturalnie równoważne, jeśli ich lewe dzieci są strukturalnie równoważne, a ich prawe dzieci są strukturalnie równoważne. „Równoważność strukturalna” to minimalny stały punkt nad tymi definicjami.TT′TT′TT′
Na przykład dowolne dwa węzły liścia są strukturalnie równoważne, ponieważ oba mają drzewa zerowe jako oba swoje dzieci, które są strukturalnie równoważne.
Ponieważ denerwujące jest stwierdzenie „ich lewe dzieci są strukturalnie równoważne, podobnie jak ich prawe dzieci”, często mówimy „ich dzieci są strukturalnie równoważne” i zamierzamy to samo. Zauważ też, że czasami mówimy „ten wierzchołek”, gdy mamy na myśli „poddrzew zakorzeniony w tym wierzchołku”.
dd+1O(n2)
{1,2,3,…,n}
nO(n)
Najpierw kompresujemy wszystkie liście (możemy je znaleźć na liście z wierzchołkami o głębokości 0) w jednym wierzchołku. Przypisujemy temu wierzchołkowi identyfikator. Kompresja dwóch wierzchołków odbywa się poprzez przekierowanie elementu nadrzędnego jednego z wierzchołków, tak aby wskazywał na drugi wierzchołek.
dd
Iterujemy wszystkie listy z węzłami o jednakowej głębokości od małej głębokości do dużej głębokości. Dla każdego poziomu tworzymy listę par liczb całkowitych, gdzie każda para odpowiada identyfikatorom potomków niektórych wierzchołków na tym poziomie. Mamy dwa wierzchołki na tym poziomie, które są strukturalnie równoważne, jeśli ich odpowiadające sobie pary liczb całkowitych są równe. Korzystając z porządku leksykograficznego, możemy je posortować i uzyskać zestawy równych par liczb całkowitych. Kompresujemy te zestawy do pojedynczych wierzchołków jak wyżej i nadamy im identyfikatory.
O(n)nO(nlogn)