Unterschiede zwischen Baumstrukturen erkennen
Dies ist eher eine CS-Frage, aber eine interessante :
Sagen wir, wir haben 2 Baum-Strukturen mit mehr oder weniger den gleichen Knoten neu geordnet. Wie würden Sie das finden
- alle
- in gewissem Sinne minimal
Reihenfolge der Operationen
MOVE(A, B)
- bewegt sich Ein Knoten unter Knoten B (mit der kompletten Unterstruktur)INSERT(N, B)
- fügt eine neue Knoten N unter dem Knoten BDELETE (A)
- löscht den Knoten A (den gesamten Teilbaum)
verwandelt sich ein Baum an den anderen.
Es könnte natürlich Fälle geben, in denen eine solche transformation nicht möglich ist, trivial root A mit Kind B, root B mit Kind etc.). In solchen Fällen würde der Algorithmus einfach liefern ein Ergebnis "nicht möglich".
Sogar noch mehr spektakuläre version ist eine Verallgemeinerung für Netzwerke, d.h. wenn wir davon ausgehen, dass ein Knoten mehrmals vorkommen kann in der Struktur (effektiv mit mehreren "Eltern"), während die Zyklen sind verboten.
Disclaimer : Dies ist nicht Hausaufgaben, eigentlich kommt es von einem echten business-problem und ich fand es ziemlich interessant, Frage mich, ob jemand weiß vielleicht eine Lösung.
InformationsquelleAutor der Frage Tomas Vana | 2011-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es nicht nur einen Wikipedia-Artikel auf graph-Isomorphie (wie Space_C0wb0y Punkte out) sondern auch einen engagierten Artikel über die graph-Isomorphismus-problem. Es hat einen Abschnitt
Solved special cases
für die Polynom-Zeit-Lösungen bekannt sind. Bäume ist einer von Ihnen und er zitiert die folgenden zwei Verweise:InformationsquelleAutor der Antwort
Waren Sie nicht klar, wenn Sie vergleichen abstrakte syntax-Bäume für source-code, XML-Dokumente interpretiert werden, wie Bäume, oder eine andere Art von Baum.
Gibt es eine Reihe von arbeiten, diskutieren, vergleichen syntax Bäume und informatik minimale Distanzen mit verschiedenen Mitteln. Die Ideen relevant sein sollte.
Ein gutes Papier ist Ändern Destillierendas versucht, zu vergleichen Sie den Quellcode mit zwei abstrakte syntax Bäume und berichten von einer minimalen Differenz. Das Papier spricht von einer bestimmten Methode, und auch breifly erwähnt (und Verweise) zu einer Vielzahl von ähnlichen Techniken.
Einige dieser algorithmen sind tatsächlich realisiert verfügbaren tools für den Vergleich von Quell-text. Unsere Smart Differencer ist einer von Ihnen.
InformationsquelleAutor der Antwort Ira Baxter
Obwohl diese Frage ist alt, ich ' ll fügen Sie ein paar mehr Referenzen und algorithmen unter:
XML-Dokumente
Darüber hinaus gibt es Bibliotheken und frameworks auf GitHub (in javascript), die für die Einführung diffing von Baum-ähnlichen Strukturen zum Beispiel Anwendungen, die den Umgang mit JSON-Daten oder XML-Strukturen (e.g für client-side MVC/MVVM):
InformationsquelleAutor der Antwort Nikos M.
In Fall Leute finden, die diese Frage und brauche etwas umgesetzt Node.js oder der browser, ich bin mit link und code-Beispiel für eine Implementierung, die ich geschrieben habe, finden Sie auf github hier: (https://github.com/hoonto/jqgram.git) auf der Grundlage der bestehenden PyGram Python-code (https://github.com/Sycondaman/PyGram).
Dies ist eine Baum-edit-Distanz Annäherung Algorithmus, aber es ist viel, viel schneller, als zu versuchen, zu finden, die wahre edit-Distanz. Die Angleichung vollzieht sich in O(n log n) Zeit und O(n) Platz in der Erwägung, dass wahre edit-Distanz ist oft O(n^3) oder O(n^2) mit den bekannten algorithmen für echte edit-Distanz. Siehe das wissenschaftliche paper, aus dem die PQ-Gram-Algorithmus kommt: (http://www.vldb2005.org/program/paper/wed/p301-augsten.pdf)
Also mit jqgram:
Beispiel:
Und das gibt dir eine Zahl zwischen 0 und 1. Je näher an null, je mehr eng verwandt, die beiden Bäume sehen zu jqgram. Ein Ansatz könnte sein, zu verwenden jqgram zu eng auf einige eng stehende Bäume, unter vielen Bäumen, angesichts der Geschwindigkeit, dann nutzen Sie wahre edit-Distanz auf die wenigen verbleibenden Bäume, die Sie benötigen, um einen genaueren Inspektion, und für die, die Sie finden können python-Implementierungen für Referenz-oder port des Zhang & Shasha-Algorithmus für Beispiel.
Beachten Sie, dass der lfn und cfn Parameter geben an, wie jeder Baum sollte bestimmen die Knoten-Bezeichnungen und die Kinder-array für jede Baumwurzel unabhängig voneinander, so dass Sie tun können, funky Sachen wie der Vergleich eines Objekts zu einem browser-DOM zum Beispiel. Alles, was Sie tun müssen, ist, bieten diese Funktionen zusammen mit jeder Wurzel und jqgram werden den rest tun, indem Sie mit Ihrer lfn und cfn zur Verfügung stehenden Funktionen zu bauen die Bäume. Also in diesem Sinne ist es (meiner Meinung nach jedenfalls) viel leichter zu bedienen als PyGram. Plus, die Javascript verwenden, so ist es der client oder der server-Seite!
AUCH, zu beantworten, mit Bezug auf Zyklus-Erkennung, überprüfen Sie heraus die clone-Methode innerhalb von jqgram, es ist Zyklus-Erkennung gibt, aber die credit dafür geht an den Autor der node-Klon, von dem dieses Stück leicht modifiziert wurde und im Lieferumfang enthalten.
InformationsquelleAutor der Antwort hoonto