Eu tenho um grande conjunto de dados de árvores e gostaria de pesquisá-lo especificando uma árvore (subgrafo conectado). A consulta deve retornar todas as ocorrências da árvore no conjunto de dados.
Existem algoritmos eficientes para fazer isso?
Eu estava pensando em algo como matrizes de sufixo, no entanto, codificar ingenuamente as árvores, pois as seqüências de caracteres (por uma ordem transversal fixa de seus nós) não funcionarão, pois a árvore de busca pode ter qualquer forma arbitrária.
ATUALIZAR:
Alguns detalhes sobre as instâncias típicas que eu espero:
O conjunto de dados consistirá em pelo menos dezenas de milhares de árvores, cada uma consistindo em cerca de vinte a trinta nós. As árvores não serão binárias, mas o número típico de filhos por nó será pequeno (geralmente não maior que quatro ou cinco, embora em alguns casos degenerados possa chegar a cerca de trinta). O número de etiquetas estará na casa das dezenas de milhares.
Eu preciso disso para aplicativos de PNL: cada árvore será a análise de dependência de uma frase, cada nó representando uma palavra oculta e cada rótulo uma palavra de dicionário (com alguma decoração).
fonte
Respostas:
Embora não seja especificamente voltada para árvores (enraizadas), acho que a estrutura de dados do G-trie pode ter um desempenho muito bom em sua configuração. É uma adaptação do trie (para pesquisar conjuntos de strings) a gráficos.
fonte
Há um tempo atrás, escrevi o algoritmo de canonização em árvore de Ronald Read e o coloquei na wikipedia .
Eu criaria uma hashtable para cada assinatura de nó interno e as rotularia com uma lista de ponteiros para as subárvores de onde elas vieram. No entanto, ele só funcionará para árvores com folhas verdadeiras.
fonte