Mam duży zestaw danych o drzewach i chciałbym je przeszukać, określając treelet (połączony podgrupa). Kwerenda powinna zwrócić wszystkie wystąpienia treeline w zbiorze danych.
Czy istnieją wydajne algorytmy do tego celu?
Myślałem o czymś takim jak tablice sufiksów, jednak naiwne kodowanie drzew, ponieważ łańcuchy (przez ustaloną kolejność ich węzłów) nie będą działać, ponieważ szkielet wyszukiwania może mieć dowolny dowolny kształt.
AKTUALIZACJA:
Kilka szczegółów na temat typowych przypadków, których oczekuję:
Zbiór danych będzie się składał z co najmniej dziesiątek tysięcy drzew, z których każde składa się z około dwudziestu do trzydziestu węzłów. Drzewa nie będą binarne, ale typowa liczba dzieci na węzeł będzie niewielka (zwykle nie większa niż cztery lub pięć, chociaż w niektórych zdegenerowanych przypadkach może osiągnąć około trzydziestu). Liczba etykiet wyniesie dziesiątki tysięcy.
Potrzebuję tego dla aplikacji NLP: każde drzewo będzie parsowaniem zależności zdania, każdy węzeł reprezentuje występowanie słowa, a każda etykieta słowo słownikowe (z pewną dekoracją).
źródło
Odpowiedzi:
Chociaż nie jest specjalnie ukierunkowany na (ukorzenione) drzewa, myślę, że struktura danych G-trie może działać całkiem dobrze w twoim otoczeniu. Jest to adaptacja trie (do wyszukiwania zestawów ciągów) do wykresów.
źródło
Jakiś czas temu napisałem algorytm kanonizacji drzew Ronalda Reada i umieściłem go na wikipedii .
Zrobiłbym hashtable dla każdego podpisu wewnętrznego węzła i oznaczyłbym je listą wskaźników z powrotem do poddrzewa, z którego pochodzą. Będzie to jednak działać tylko w przypadku treeline z prawdziwymi liśćmi.
źródło