Welche Daten Strukturen lassen sich effizient speichern der 2-d "grid" - Daten?
Ich versuche, eine Anwendung zu schreiben, dass führt Operationen auf einem raster von zahlen, wo jedes mal, wenn eine Funktion ausgeführt wird, der Wert jeder Zelle geändert wird, und der Wert jeder Zelle ist abhängig von seinen Nachbarn. Der Wert jeder Zelle wäre eine einfache ganze Zahl.
Was wäre die beste Art und Weise der Speicherung meiner Daten hier? Ich habe sowohl eine flache Liste/array-Struktur, aber das scheint wirkungslos, da habe ich immer wieder Berechnungen anstellen, um herauszufinden, welche Zelle über der aktuellen Zelle (wenn es ein beliebiger Rastergröße) und verschachtelten Listen, die nicht scheinen, um eine sehr gute Möglichkeit der Darstellung der Daten.
Kann ich nicht helfen, aber das Gefühl, es muss eine bessere Möglichkeit der Darstellung dieser Daten im Speicher für diese Art von Zweck. Irgendwelche Ideen?
(beachten Sie, ich glaube nicht, das ist wirklich eine subjektive Frage, aber stack-überlauf scheint zu denken, es ist.. ich bin irgendwie gehofft, es gibt eine akzeptierte Möglichkeit, diese Art von Daten wird gespeichert)
- Fragen nach dem "besten" Weg, etwas zu tun, in den meisten Fällen ist subjektiv. Aber ich denke, in diesem Fall, es ist ziemlich eindeutig.
- Was du machst, ist ein viel wie ein zellulärer Automat. Sie konnte die Spur zu einem open-source-Implementierung von Conway ' s Leben in Ihrer bevorzugten Sprache und haben einen Blick auf, was Sie tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier sind ein paar Ansätze. Ich werde (versuchen zu) zeigen diese Beispiele mit einer Darstellung von einem 3x3-raster.
Der flachen array
Zugriff auf Elemente auf der linken oder rechten, subtrahieren oder fügen Sie 1 hinzu (achten Sie auf die Reihe-Grenzen). Zugriff auf die Elemente oben oder unten, subtrahieren oder fügen Sie die Zeile Größe (in diesem Fall 3).
Die zwei-dimensionales array (für Sprachen wie C oder FORTRAN, die dies unterstützen)
Zugriff auf benachbarte Elemente ist nur Inkrementieren oder Dekrementieren entweder die Zeilen-oder Spaltennummer. Der compiler macht immer noch genau die gleichen Arithmetik wie in der flachen array.
Array von arrays (zB. Java)
In dieser Methode, eine Liste von "row-Pointer" (dargestellt auf der linken Seite) jeder ist eine neue, unabhängige array. Wie die 2-d-array, benachbarte Elemente zugegriffen werden, durch anpassen des entsprechenden index.
Vollständig verknüpften Zellen (2-d doppelt verkettete Liste)
Diese Methode ist jede Zelle mit bis zu vier Zeiger zu den angrenzenden Elementen. Zugang zu angrenzenden Elemente wird durch die entsprechenden Zeiger. Sie müssen noch immer eine Struktur von Zeigern auf Elemente, die (wahrscheinlich mit einer der oben genannten Methoden) zu vermeiden, Schritt durch die einzelnen verkettete Liste sequentiell. Diese Methode ist ein bisschen sperrig, aber es hat eine wichtige Anwendung in Knuth ' s Dancing Links - Algorithmus, wo die links geändert werden, die während der Ausführung des Algorithmus zu überspringen "leeren" Platz in der Startaufstellung.
Wenn die lookup-Zeit ist wichtig für Sie, dann ein 2-dimensionales array könnte Ihre beste Wahl sein, da suchen bis Sie eine Zelle Nachbarn ist eine Konstante Zeit den Betrieb angesichts der (x,y) - Koordinaten der Zelle.
Eines dynamisch reservierten Arrays von arrays macht es trivial, zeigen Sie auf die Zelle über der aktuellen Zelle, und unterstützt die beliebige grid-Größen sowie.
Weiter auf meinen Kommentar, Sie können finden die Hashlife - Algorithmus interessant.
Im wesentlichen (wenn ich es richtig verstehe), Sie speichern Ihre Daten in einem quad-tree mit einer hash-Tabelle verweist auf Knoten des Baumes. Die Idee hier ist, dass die gleichen Muster auftreten mehr als einmal in Ihrem Netz, und jede Kopie hash den gleichen Wert, so haben Sie nur, um zu berechnen, es einmal.
Dies ist wahres Leben, das ist ein raster von meist-false Boolean. Ob es stimmt für dein problem ist, weiß ich nicht.
Sollten Sie Abstrakt aus, wie Sie Ihre Daten speichern.
Wenn Sie tun müssen, relativ Operationen im array, Scheibe ist die gemeinsame patterd, es zu tun.
Sie könnte so etwas wie dieses: