Comment puis-je calculer l'arbre de distance d'édition?
J'ai besoin de calculer la distance d'édition entre les arbres pour un projet personnel de la mine. Cette document décrit un algorithme, mais je ne peux pas faire des têtes ou queues hors de lui. Êtes-vous au courant de toutes les ressources qui décrivent un algorithme plus accessible façon? Pseudo-code ou code serait utile, aussi.
Vous devez vous connecter pour publier un commentaire.
Voici quelques le code source java (format tarball en bas) pour un Arbre de Distance d'Édition de l'algorithme qui peut être utile pour vous.
La page inclut des références et des diapositives qui vont par le biais de la "Zhang et Shasha" algorithme étape-par-étape et d'autres liens utiles pour vous obtenir jusqu'à la vitesse.
Edit: Alors que cette réponse a été acceptée parce qu'elle a souligné la Zhang-Shasha algorithme, le code dans le lien a des bugs. Steve Johnson et tim.tadh ont fourni travail code Python. Voir Steve Johnson commentaire pour plus de détails.
(Édité à cette réponse de lien vers la version actuelle de l'application donnée par tim.tadh)
Cette bibliothèque Python met en œuvre la Zhang-Shasha algorithme correctement: https://github.com/timtadh/zhang-shasha
Il a commencé comme un port direct de la source de Java répertoriés dans le actuellement accepté de répondre (l'un avec le tarball lien), mais que la mise en œuvre est pas correct et est presque impossible à exécuter à tous.
J'ai écrit une mise en œuvre ( https://github.com/hoonto/jqgram.git ), fondés sur le PyGram code Python (https://github.com/Sycondaman/PyGram) pour ceux d'entre vous qui souhaitent utiliser l'arborescence de la distance d'édition approximation à l'aide de PQ-Gramme de l'algorithme dans le navigateur et/ou dans Node.js.
La jqgram arbre de distance d'édition rapprochement module implémente le PQ-Gramme algorithme pour à la fois côté serveur et côté navigateur applications; O(n log n) en temps et O(n) l'espace performant où n est le nombre de nœuds. Voir le document académique à partir de laquelle l'algorithme, il vient: (http://www.vldb2005.org/program/paper/wed/p301-augsten.pdf)
Le PQ-Gramme rapprochement est beaucoup plus rapide que l'obtention de la vraie distance d'édition par Zhang & Shasha, Klein, ou Guha et. al, qui assurent la distance d'édition algorithmes à tous d'effectuer un minimum de O(n^2) et sont donc souvent inadaptés.
Souvent dans les applications réelles, il n'est pas nécessaire de connaître la véritable distance d'édition si un relatif rapprochement de plusieurs arbres à une norme connue peut être obtenue. Javascript dans le navigateur et maintenant sur le serveur avec l'avènement de Node.js traiter souvent avec les structures en arbre et de la performance de l'utilisateur final est généralement critique dans l'implémentation de l'algorithme et de design, ainsi jqgram.
Exemple:
Noter que le lfn et cfn paramètres spécifient la façon dont chaque arbre doit déterminer l'étiquette du nœud noms et les enfants de tableau pour chaque racine de l'arbre de façon indépendante, de sorte que vous pouvez faire des choses funky comme comparer un objet à un navigateur DOM par exemple. Tout ce que vous devez faire est de fournir à ces fonctions avec chaque racine et jqgram fera le reste, en appelant votre lfn et cfn fonctions fournies pour construire les arbres. Donc, dans ce sens, il est (à mon avis en tout cas) beaucoup plus facile à utiliser que PyGram. De Plus, son Javascript, afin de l'utiliser côté client ou côté serveur!
Maintenant une approche que vous pouvez utiliser est d'utiliser jqgram ou PyGram pour obtenir quelques arbres qui sont à proximité, puis d'utiliser un véritable algorithme edit distance contre un plus petit ensemble d'arbres, pourquoi dépenser de tous les calculs sur les arbres, vous pouvez déjà déterminer facilement, sont très éloignés, ou vice versa. Ainsi, vous pouvez utiliser jqgram pour affiner le choix.
Espère que le code permet à certains gens.
Ici vous trouverez des implémentations Java de l'arbre de distance d'édition algorithmes:
http://www.inf.unibz.it/dis/projects/tree-edit-distance
En plus de Zhang&Shasha de l'algorithme de 1989, il y a aussi l'arbre de distance d'édition implémentations plus récents, y compris les algorithmes de Klein 1998, Demaine et coll. 2009, à la robustesse de l'Arbre de Distance d'Édition (RTED) par l'algorithme Pawlik&Augsten, 2011.
J'ai fait un simple wrapper python (apted.py) pour la APTED algorithme à l'aide de jpype si quelqu'un est intéressé:
Il y a un journal de la version de la ICALP2007 papier que vous y référer lors de http://www.wisdom.weizmann.ac.il/~oweimann/Publications/TEDinTALG.pdf
Cette version dispose également d'un pseudo-code.
Il y a beaucoup de variations de l'arbre à une distance d'édition. Si vous pouvez aller avec de haut en bas de l'arborescence de distance d'édition, ce qui limite les insertions et les suppressions à la laisse, je vous propose d'essayer le document suivant: http://portal.acm.org/citation.cfm?id=671669&dl=GUIDE&coll=GUIDE&CFID=68408627&CFTOKEN=54202965. La mise en œuvre est simple de la matrice de programmation dynamique avec O(n2) coût.
Je pense que vous êtes simplement à la recherche pour le chemin le plus court entre deux verticies. Si oui, vous pouvez utiliser L'algorithme de Dijkstra. (La page wikipedia a pseudocode sur elle pour vous à consulter.)