Détecter des différences entre les structures en arbre

Ce n'est plus un CS question, mais une question intéressante :

Disons que nous avons 2 structures en arbre avec plus ou moins les mêmes nœuds réorganisé. Comment voulez-vous trouver

  1. tout
  2. dans un certain sens, minimale

la séquence des opérations

  • MOVE(A, B) - déplace Un nœud sous le nœud B (avec l'ensemble de la sous-arborescence)
  • INSERT(N, B) - insère un nouveau nœud N sous le nœud B
  • DELETE (A) - supprime le nœud (avec l'ensemble de la sous-arborescence)

qui transforme un arbre à l'autre.

Il peut évidemment y avoir des cas où une telle transformation n'est pas possible, trivial être root avec Un enfant de B la racine de B avec Un enfant, etc.). Dans de tels cas, l'algorithme serait tout simplement de livrer un résultat "pas possible".

Encore plus spectaculaire version est une généralisation pour les réseaux, c'est à dire lorsque nous supposons qu'un nœud peut se produire plusieurs fois dans l'arbre (effectivement le fait d'avoir plusieurs "parents"), tandis que les cycles sont interdits.

Avertissement : Ceci est pas des devoirs à faire, en fait il s'agit d'un réel problème d'entreprise et je l'ai trouvé assez intéressant demandais si quelqu'un connais une solution.

  • MOVE(A,B) semblent être les mêmes que INSERT(A,B) si A n'a pas d'enfants. Ce qui se passe pour les enfants de A si l'on ne INSERT(A,B) ? (vont-ils être rattachés à Aparent ?)
  • la différence est que, INSÉRER signifie vraiment d'un nouveau nœud, qui n'était pas dans l'arbre (donc n'ayant pas d'enfant, du moins pas dans l'état d'origine où il n'était même pas présent). Se DÉPLACER sur l'autre main est vraiment un mouvement, c'est à dire déplacer le nœud y compris ses enfants
  • Cela sonne comme vous avez besoin de détecter graphique-isomorphisme. La partie sur la transformation me rappelle de la Levenshtein, qui peut parfaitement être résolu en O(n*m) à l'aide de la programmation dynamique. Peut-être que ces pointeurs vous aider.
  • Avez-vous jamais trouver une solution? En regardant l'article de wikipédia et des liens je ne vois pas un algorithme de n'importe où. Je voudrais faire cela en javascript où je sais déjà à l'origine des opérations qui ont fait les deux arbres différents, mais aurait comme pour produire une option diff: par exemple, si une partie de l'arbre a été taillés et puis re-greffé à la même place, elle permettrait d'optimiser à aucun changement.
  • avez-vous trouvé quelque chose d'utile? J'ai regarder pour la même alhoritm de changements de réduction dans l'arbre.
  • Des sons proches de ce qu'est un OS/outil 3ème partie a à faire pour comparer des dossiers de fichiers.

InformationsquelleAutor Tomas Vana | 2011-05-05