Ich arbeite an einem Typsystem und stoße auf ein Problem, das dem niedrigsten gemeinsamen Vorfahren ähnlich zu sein scheint. Bei zwei Typen muss ich die kleinste Folge von Konvertierungen finden, die zum gleichen Zieltyp führt. Wenn ich einen einfachen Typbaum hätte, weiß ich, wie ich das Ergebnis erhalte, aber leider habe ich eine etwas komplexere Diagrammstruktur.
Diese Grafik enthält einige wichtige Punkte. Es ist unidirektional und es werden niemals Schleifen gebildet. Aufgrund einer unbegrenzten Anzahl von Typen kann es jedoch nicht statisch hergestellt werden. Die Entfernung eines Pfades ist im Allgemeinen recht gering. Es "fühlt" sich eher wie ein Baum mit einer Reihe von Abkürzungskanten an.
Anfangs habe ich mir den niedrigsten gemeinsamen Vorfahren angesehen, aber er wird hauptsächlich als Baumalgorithmus beschrieben. Ich habe die Hoffnung, dass ich sie anpassen könnte, noch nicht aufgegeben. Die andere Möglichkeit wäre ein allgemeinerer Pfadfindungsalgorithmus.
Ich hoffe, jemand hat dieses oder ein ähnliches Problem schon einmal gesehen und kann mir einige Hinweise geben, wie ich es weiter angehen kann. Es kommt mir bekannt vor, dass ich davon ausgehe, dass etwas existieren muss, und ich suche nur nach den falschen Begriffen / Namen.
Hier ist mein Versuch, dies formeller zu beschreiben.
Lass es eine Grafik geben so dass jeder Scheitelpunkt eine Reihe von ausgehenden Kanten hat . Da das Diagramm dynamisch und möglicherweise unendlich ist, gibt es keine Möglichkeit, das Formular zu erstellen für das gesamte Diagramm.
Ein Pfad wird aus einem Scheitelpunkt gebildet, indem einer der verfügbaren Kanten von diesem Knoten gefolgt wird. . Die Länge dieses Pfades entspricht der Anzahl der Eckpunkte in der Sequenz. Es ist kein Zyklus möglich. Die Menge aller Pfade zwischen zwei Knoten wird ausgedrückt als.
Beachten Sie, dass kann in einer endlichen Anzahl von Schritten als leer bestimmt werden. Das Ganze aufzählen Set ist praktisch nicht möglich.
Das Problem besteht darin, den kürzesten Weg von zwei Scheitelpunkten zu einem dritten Scheitelpunkt zu finden. Das heißt, gegeben, finden so dass Pfade und existieren und ist minimal.
quelle
java.lang.Object
)?Antworten:
Wenn der niedrigste gemeinsame Vorfahr zweier Typen immer existiert und eindeutig ist, ist Ihre Struktur ein Join-Semilattice. Die Berechnung des niedrigsten gemeinsamen Vorfahren ist möglich, aber die Laufzeitkomplexität im schlimmsten Fall ist nicht so gut, wie ich es intuitiv erwartet hätte. Ich habe vor einiger Zeit eine verwandte Frage gestellt , war aber zu faul, um eine Antwort zu schreiben, nachdem ich die relevante Lösung in der "Literatur" gefunden hatte. Ich habe gerade die Antwort geschrieben und sie beginnt wie folgt:
Hier ist der relevante Teil aus Kapitel 2.3.1:
quelle