Angenommen, ich habe ein Array mit einer Größe von N
(wo N > 0
), gibt es eine effizientere Möglichkeit, dem Array ein Präfix hinzuzufügen, für das keine O (N + 1) -Schritte erforderlich wären?
Im Code mache ich im Wesentlichen Folgendes
function prependArray(value, oldArray) {
var newArray = new Array(value);
for(var i = 0; i < oldArray.length; ++i) {
newArray.push(oldArray[i]);
}
return newArray;
}
javascript
arrays
prepend
Samccone
quelle
quelle
Antworten:
Ich bin mir nicht sicher, ob Big-O effizienter ist, aber die Verwendung der
unshift
Methode ist sicherlich prägnanter:[Bearbeiten]
Dieser jsPerf-Benchmark zeigt, dass er
unshift
in mindestens einigen Browsern anständig schneller ist, unabhängig von der möglicherweise unterschiedlichen Big-O-Leistung, wenn Sie das Array direkt ändern können . Wenn Sie das ursprüngliche Array wirklich nicht mutieren können, würden Sie so etwas wie das folgende Snippet ausführen, das nicht wesentlich schneller zu sein scheint als Ihre Lösung:[Bearbeiten 2]
Der Vollständigkeit halber kann anstelle des OP-Beispiels die folgende Funktion verwendet werden
prependArray(...)
, um die Array-unshift(...)
Methode zu nutzen:quelle
prepend
"unshift
" anzurufen ?unshift
klingt für eine solche Array-Operation besser geeignet (es verschiebt die Elemente ... mehr oder weniger physisch).prepend
wäre besser für verknüpfte Listen geeignet, bei denen Sie Elemente buchstäblich voranstellen.push
undunshift
beide enthaltenu
, währendpop
undshift
nicht haben.Mit ES6 können Sie jetzt den Spread-Operator verwenden , um ein neues Array mit Ihren neuen Elementen zu erstellen, die vor den ursprünglichen Elementen eingefügt werden.
Update 2018-08-17: Leistung
Ich wollte mit dieser Antwort eine alternative Syntax präsentieren, die meiner Meinung nach einprägsamer und prägnanter ist. Es ist zu beachten, dass diese Syntax gemäß einigen Benchmarks (siehe diese andere Antwort ) erheblich langsamer ist. Dies wird wahrscheinlich keine Rolle spielen, es sei denn, Sie führen viele dieser Operationen in einer Schleife aus.
quelle
unshift
Wenn Sie ein Array vor ein anderes Array stellen, ist es effizienter, es nur zu verwenden
concat
. So:Dies ist jedoch immer noch O (N) in der Größe von oldArray. Trotzdem ist es effizienter als das manuelle Iterieren über oldArray. Abhängig von den Details kann es Ihnen auch helfen, denn wenn Sie viele Werte voranstellen möchten, ist es besser, sie zuerst in ein Array einzufügen und dann am Ende mit oldArray zu verknüpfen, als jeden einzeln vorzustellen.
Es gibt keine bessere Möglichkeit als O (N) in der Größe von oldArray, da Arrays im zusammenhängenden Speicher mit dem ersten Element an einer festen Position gespeichert werden. Wenn Sie vor dem ersten Element einfügen möchten, müssen Sie alle anderen Elemente verschieben. Wenn Sie dies umgehen möchten, tun Sie, was @GWW gesagt hat, und verwenden Sie eine verknüpfte Liste oder eine andere Datenstruktur.
quelle
unshift
. Beachten Sie jedoch, dass a) das oldArray mutiert, währendconcat
dies nicht der Fall ist (welches für Sie besser ist, hängt von der Situation ab), und b) nur ein Element einfügt.[0]
), während durch Verschieben das Array an Ort und Stelle mutiert wird. Aber beide sollten O (N) sein. Auch Prost auf den Link zu dieser Seite - sieht sehr praktisch aus.Wenn Sie dem Array (a1 ein Array a2) voranstellen möchten, können Sie Folgendes verwenden:
quelle
Wenn Sie das alte Array beibehalten müssen, schneiden Sie das alte auf und verschieben Sie die neuen Werte an den Anfang des Slice.
quelle
Ich habe einige neue Tests verschiedener Methoden zum Voranstellen. Bei kleinen Arrays (<1000 Elemente) ist der Leader für den Zyklus mit einer Push-Methode gekoppelt. Bei großen Arrays wird die Unshift-Methode zum Marktführer.
Diese Situation gilt jedoch nur für den Chrome-Browser. In Firefox hat unshift eine großartige Optimierung und ist in allen Fällen schneller.
Die ES6-Verbreitung ist in allen Browsern mehr als 100-mal langsamer.
https://jsbench.me/cgjfc79bgx/1
quelle
Es gibt eine spezielle Methode:
Wenn Sie dem Array jedoch mehrere Elemente voranstellen möchten, ist die Verwendung einer solchen Methode schneller:
quelle
Array.prototype.unshift.apply(a,b);
Beispiel für das Voranstellen vor Ort:
quelle
Beim Aufrufen wird
unshift
nur die Länge des neuen Arrays zurückgegeben. Um am Anfang ein Element hinzuzufügen und ein neues Array zurückzugeben, habe ich Folgendes getan:oder einfach mit Spread Operator:
Auf diese Weise bleibt das ursprüngliche Array unberührt.
quelle