Tengo un gran conjunto de datos de árboles y me gustaría buscarlo especificando un treelet (subgrafo conectado). La consulta debe devolver todas las ocurrencias del treelet en el conjunto de datos.
¿Hay algoritmos eficientes para hacerlo?
Estaba pensando en algo así como matrices de sufijos, sin embargo, codificar ingenuamente los árboles como cadenas (mediante un orden transversal fijo de sus nodos) no funcionará, ya que el treelet de búsqueda puede tener cualquier forma arbitraria.
ACTUALIZAR:
Algunos detalles sobre las instancias típicas que espero:
El conjunto de datos consistirá en al menos decenas de miles de árboles, cada uno de los cuales constará de veinte a treinta nodos. Los árboles no serán binarios, pero el número típico de niños por nodo será pequeño (generalmente no mayor de cuatro o cinco, aunque en algunos casos degenerados puede llegar a unos treinta). El número de etiquetas estará en las decenas de miles.
Lo necesito para las aplicaciones de PNL: cada árbol será el análisis de dependencia de una oración, cada nodo representará la aparición de una palabra y cada etiqueta será una palabra del diccionario (con algo de decoración).
fuente
Respuestas:
Aunque no está específicamente dirigido a árboles (enraizados), creo que la estructura de datos G-trie podría funcionar bastante bien en su entorno. Es una adaptación del trie (para buscar conjuntos de cadenas) a gráficos.
fuente
Hace un tiempo escribí el algoritmo de canonización de árboles de Ronald Read y lo puse en wikipedia .
Haría una tabla hash para cada firma de nodo interno y las etiquetaría con una lista de punteros de vuelta a los subárboles de los que provienen. Sin embargo, solo funcionará para las cochinillas con hojas verdaderas.
fuente