J'ai un grand ensemble de données d'arbres et je voudrais le rechercher en spécifiant un treelet (sous-graphe connecté). La requête doit renvoyer toutes les occurrences du treelet dans l'ensemble de données.
Existe-t-il des algorithmes efficaces pour le faire?
Je pensais à quelque chose comme des tableaux de suffixes, cependant, encoder naïvement les arbres comme des chaînes (par un ordre de traversée fixe de leurs nœuds) ne fonctionnera pas, car le treelet de recherche peut avoir n'importe quelle forme arbitraire.
MISE À JOUR:
Quelques détails sur les cas typiques que j'attends:
L'ensemble de données comprendra au moins des dizaines de milliers d'arbres, chacun composé d'environ vingt à trente nœuds. Les arbres ne seront pas binaires, mais le nombre typique d'enfants par nœud sera petit (généralement pas plus grand que quatre ou cinq, bien que dans certains cas dégénérés il puisse atteindre une trentaine). Le nombre d'étiquettes sera de plusieurs dizaines de milliers.
J'en ai besoin pour les applications PNL: chaque arbre sera l'analyse de dépendance d'une phrase, chaque nœud représentant une occurrence de mot et chaque étiquette un mot de dictionnaire (avec une certaine décoration).
la source
Réponses:
Bien qu'elle ne soit pas spécifiquement destinée aux arbres (enracinés), je pense que la structure de données G-trie pourrait fonctionner assez bien dans votre environnement. C'est une adaptation du trie (pour rechercher des ensembles de chaînes) aux graphiques.
la source
Il y a quelque temps, j'ai rédigé l'algorithme de canonisation de l'arbre de Ronald Read et je l'ai mis sur wikipedia .
Je créerais une table de hachage pour chaque signature de nœud interne et les étiqueterais avec une liste de pointeurs vers les sous-arbres dont ils sont issus. Cependant, cela ne fonctionnera que pour les treelets avec de vraies feuilles.
la source