Ich habe einen großen Datensatz von Bäumen und möchte ihn durch Angabe eines Baumes (verbundener Untergraph) durchsuchen . Die Abfrage sollte alle Vorkommen des Baumes im Datensatz zurückgeben.
Gibt es dafür effiziente Algorithmen?
Ich dachte an so etwas wie Suffix-Arrays, aber die naive Codierung der Bäume als Zeichenfolgen (durch eine feste Durchlaufreihenfolge ihrer Knoten) funktioniert nicht, da der Suchbaum eine beliebige Form haben kann.
AKTUALISIEREN:
Einige Details zu den typischen Fällen, die ich erwarte:
Der Datensatz besteht aus mindestens Zehntausenden Bäumen mit jeweils etwa zwanzig bis dreißig Knoten. Die Bäume sind nicht binär, aber die typische Anzahl der Kinder pro Knoten ist klein (normalerweise nicht größer als vier oder fünf, obwohl sie in einigen entarteten Fällen etwa dreißig erreichen kann). Die Anzahl der Etiketten liegt bei Zehntausenden.
Ich brauche das für NLP-Anwendungen: Jeder Baum ist die Abhängigkeitsanalyse eines Satzes, jeder Knoten repräsentiert ein Wort Occourrence und jeder beschriftet ein Wörterbuchwort (mit etwas Dekoration).
quelle
Antworten:
Obwohl nicht speziell auf (verwurzelte) Bäume ausgerichtet, denke ich, dass die G-trie-Datenstruktur in Ihrer Umgebung recht gut funktioniert. Es ist eine Anpassung des Versuchs (zum Suchen von Stringsätzen) an Graphen.
quelle
Vor einiger Zeit habe ich Ronald Reads Baumkanonisierungsalgorithmus geschrieben und auf Wikipedia gestellt .
Ich würde eine Hashtabelle für jede interne Knotensignatur erstellen und sie mit einer Liste von Zeigern auf die Teilbäume beschriften, aus denen sie stammen. Es funktioniert jedoch nur bei Baumwipfeln mit echten Blättern.
quelle