2016-06-12 13 views
3

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?

+0

Ich verstehe nicht, was sind die 'a' für. Nur Inhalte? Oder fügen Sie dem Diagramm einige Informationen hinzu? – Lhooq

+0

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 - –

+0

Ok. Wie auch immer, ich habe es behalten ;-) – Lhooq

Antwort

3

Mal sehen, was Sie tun (ich ziehe es in eine besser lesbare Art und Weise neu zu schreiben ;-)):

let addEdge a b g = 
    let (c, al) = g.(a) in 
    g.(a) <- (c, b :: al);; 

Für jede Kante a -> b Sie diese Kante durch Hinzufügen b der Liste Ihr Array hinzuzufügen entsprechenden zu a. Erster den Inhalt eines Arrays ist O (1) und in die Liste ein Element hinzuzufügen, ist O (1) auch so, wenn wir wieder, was Sie

  • O tun (| V |), um das Array zu erstellen
  • O (| E |) die Ränder hinzufügen
  • O (| V | + | E |) das Array

Es ist wie eine lineare Art und Weise zu tun, sieht zu erstellen und zu füllen. Das Problem wird auftreten, wenn Sie herausfinden müssen, ob zwei Scheitelpunkte verbunden sind. ;-)

+0

Den Inhalt eines Arrays auf "x" setzen ist konstant? Es braucht nicht O (x)? –

+0

@Anatole Dahan: Standard-Datenstrukturen (d. H. Listen, Arrays usw.) sind optimiert, so dass der Zugriff auf ein Element O (1) ist und dieses Element festgelegt wird. – RichouHunter

+0

@RichouHunter Das Erstellen und Zugreifen auf ein beliebiges Element ist O (1) in Arrays, aber in Listen erfolgt der Zugriff auf das i-te Element in O (i). ;-) – Lhooq

Verwandte Themen