Der folgende Algorithmus ist in einem Codegenerierungsproblem erforderlich, das ich anwende. Mein aktueller Algorithmus ist O (n^2), aber ich habe das Gefühl, dass es einen besseren Weg dafür gibt.Wie kann man effizient einen Abhängigkeitsgraphen von einer transitiven paarweisen Beziehung konstruieren?
Angenommen, ich habe eine Prädikatfunktion für die Berechnung, ob x < y.
less?: (x:T, y:T) -> True|False
Ich weiß a priori, dass diese Beziehung transitiv ist. So dass
less?(a, b) and less?(b, c)
less?(a, c)
impliziert eine Reihe von Objekten (x1, ..., xn) Ich möchte die Abhängigkeitsgraphen berechnen. Es soll wie folgt aussehen:?
x1 => (x2, x4, x5)
x2 => (x3)
x5 => (x7)
x10 =>()
etc...
wobei jeder Knoten, xi, mit einer Liste von xj zugeordnet ist, so daß weniger (xj, xi) wahr ist. Der einfachste Weg, dieses Diagramm zu berechnen, besteht darin, weniger zu telefonieren. auf alle möglichen Paare von (xi, xj). Aber desto weniger? Beziehung ist teuer und ich möchte die Anrufe zu weniger minimieren?
Danke für Ihre Hilfe.
-Patrick
Aus Sicht der Komplexität der Algorithmen, können Sie nicht besser als O (n^2): für ein "weniger?" Mit einem einzigen "True" -Paar, müssen Sie im schlimmsten Fall vor Ihnen jedes Paar nachschlagen entdecke es. Vielleicht können mehr Details über Ihre Beziehung helfen. – deniss