Ich mache ein Basisprogramm in OCaml, in dem ich Graphen benutze. I definiert einen Graphen als:OCaml: Element zu einer Liste in einem Array hinzufügen
type 'a graph = ('a * int list) array;;
wo Elemente in dem Array die Vertices sind, und die Elemente in den Listen die Kanten von dem Scheitelpunkt sind. Ich muss in der Lage sein, einen Graph in O (| V | + | E |) zu erstellen, der echt erscheint. Also habe ich zuerst das Vertex-Array mit leeren Listen erstellt. Jetzt möchte ich die Kanten hinzufügen.
Der einzige Weg, den ich mit herauskommen, ist dies:
let addEdge a b g = g.(a)<-(fst g.(a), b::snd g.(a));;
Ich bin nicht wirklich sicher darüber, aber es scheint mir, diese linear zu der Zeit in dem Grad der a ich dies tun . Das würde bedeuten, wenn einer meiner Vertices mit jedem anderen Vertices verbunden ist, wird es mich O (n^2)
Bin ich richtig? Wenn ich bin, muss ich das trotzdem linear halten?
Ich verstehe nicht, was sind die 'a' für. Nur Inhalte? Oder fügen Sie dem Diagramm einige Informationen hinzu? – Lhooq
Ja, ich löse tatsächlich 2-CNF-QBF in linearer Zeit, meine Scheitelpunkte sind Litterals, und es gibt eine Kante von nicht a nach b und von nicht b nach a, wenn ich eine Klausel (a oder b) habe - wo a und b sind auch litterals - –
Ok. Wie auch immer, ich habe es behalten ;-) – Lhooq