Schnellster Weg, um ein mehrdimensionales Array zurückzusetzen?

8

Angenommen, ich habe ein zweidimensionales Array: vectors[x][y] , und die ursprüngliche Array-Struktur sieht folgendermaßen aus:

%Vor%

Nach einigen Berechnungen sind die Daten im Array zufällig. Was ist der schnellste und effizienteste Weg, das Array in den Ausgangszustand zurückzubringen?

Ich weiß, dass ich einfach das obige zeroed-Array codieren und Vektoren wieder gleich setzen kann, aber ich kenne auch einen Algorithmus wie:

%Vor%

ist O (x * y).

Also, was ist der bessere Weg? Und gibt es einen besseren, noch schnelleren / effizienteren Weg, dies zu lösen?

Und für den allgemeinen Fall der Nullstellung eines mehrdimensionalen Arrays beliebiger Länge, was ist der beste Weg? (Ich arbeite in JavaScript, wenn es darauf ankommt)

    
chrisdotcode 07.11.2012, 18:27
quelle

5 Antworten

3

Hier sind meine zwei Cent:

Ich würde eine saubere Kopie Ihres ursprünglichen Arrays für die schnellste Leistung behalten. Sie können entweder eine referenzierte fest codierte Kopie behalten

%Vor%

oder machen Sie einen dynamischen sauberen Klon des ursprünglichen Arrays mit slice ((rekursiv in Ihrem Fall für tiefe Kopie):

%Vor%

Unabhängig davon ist der Ansatz von das Zurücksetzen Ihrer Vektorreferenz auf eine Originalkopie schneller als das Durchlaufen und Zurücksetzen jedes Knotens . Wenn Ihr altes Vektor-Array-Objekt nicht mehr referenziert wird, wird es von JavaScript in Garbage gesammelt.

Damit stellt sich die Frage, ob wir jedes Mal eine saubere Kopie erhalten sollen. Wenn Sie einmal eine fest codierte Instanz haben, erhalten Sie eine saubere Kopie, und Sie müssen sie danach klonen. Sie möchten auch nicht über ähnliche For-Schleifen in die dynamische Generierung wie die Reset-Option. Ich rate dazu, eine Clone-Funktion zu schreiben, die einfach ein neues fest codiertes oder initialisiertes Array zurückgibt:

%Vor%

Idealerweise ist es am besten, verschiedene Ansätze zu vergleichen.

BEARBEITEN Dank Vega's Input habe ich seinen Test modifiziert, um drei Ansätze zu testen. In Chrome und IE9 scheint diese Lösung die schnellste zu sein, in FF (15.0.1) scheint die manuelle Iteration schneller zu sein (Speicherzuweisung / -verwaltung in FF möglicherweise langsamer). Ссылка

    
cbayram 07.11.2012, 19:06
quelle
1

Bis jetzt klingt es so, als hätten wir zwei Möglichkeiten.

  1. Überschreibe das Ganze mit Nullen. (Ihre Lösung)

  2. Notieren Sie alle geänderten Elemente und setzen Sie diese nur zurück. record[0].x = 3; record[0].y = 5; und so weiter Sie müssen jedoch immer noch einmal den Datensatz durchlaufen. Um es weiter zu erklären: Ich meine, dass jedes Mal, wenn ein Element im Array auf einen Wert gesetzt wird, die Platzierung dieses Elements im Array aufgezeichnet werden soll. Mit einer Schleife können Sie dann jedes Element aufrufen und auf 0 setzen. Wenn Sie also ein Array mit wenigen Arrays hätten, wäre es effizienter.

Abhängig von der Implementierung kann ich sehen, warum Sie # 2 anstelle von # 1 möchten ... aber wenn Sie ernsthaft eine Matrix haben, die groß genug ist, dass Sie sich um die Analyse des Algorithmus kümmern müssen, könnten Sie eine Art von machen Server-Vorverarbeitung.

    
beta0x64 07.11.2012 18:41
quelle
0

Ich riskiere und sage, dass der schnellste Weg, allen Elementen den gleichen Wert zuzuweisen, der Aufruf von Array.map () ist.

Aber hier ist ein Haken. Beachten Sie, dass dies bei Browsern, die diese Methode nativ implementiert haben, unglaublich schnell abläuft und in anderen Browsern nur die übliche Leistung aufweist. Beachten Sie außerdem, dass .map () in einigen alten Browsern nicht verfügbar ist. Sie müssen also Underscore.js oder eine andere Bibliothek verwenden, die diese Methode bereitstellt.

    
alexandernst 07.11.2012 18:38
quelle
0

Eine andere Möglichkeit, das Problem zu untersuchen, ist die Verwendung eines linearen Arrays und die Berechnung des linearen Index aus den x, y-Indizes, wenn Sie Ihre Aktualisierungen vornehmen.

Die Initialisierung ist dann nur eine einzige for Schleife mit der Zeit O (x + y)

    
HBP 07.11.2012 18:50
quelle
0

Wenn ich Sie wäre, hätte ich ein leeres Array und wenn ich den Wert zurücksetzen würde, würde ich einfach die Variable durch die leere ersetzen. Es kostet Sie nur ein weiteres leeres Array, wenn Sie wieder viel mit dem Zurücksetzen und der Initialisierung zu tun haben.

Aktualisieren

Vielleicht wird dir das dabei helfen:

%Vor%

Prost.

    
Rikki 07.11.2012 18:31
quelle