Zeit, die Komplexität des Systems.arraycopy(...)?
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
ist eine native-Methode.
Was ist die Zeit-Komplexität für diese Methode?
- jeder Verweis auf die Komplexität ist bemerkenswert.
- Siehe auch stackoverflow.com/questions/2772152/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wird es zu gehen Sie durch alle Elemente in dem array zu tun. Array ist eine einzigartige Daten-Struktur, wo haben Sie eine Größe angeben, wenn Sie Sie initialisieren. Reihenfolge wäre das Quell-array der Größe oder in Big O hinsichtlich seiner O(Länge).
Infact dies geschieht intern in einer ArrayList. ArrayList umschließt ein array. Obwohl ArrayList sieht aus wie eine dynamisch wachsende Sammlung, die intern eine arrycopy, wenn es zu erweitern.
length
- warum wäre dies O(n)?System.arraycopy
wird versuchen, die cast von einem Typ zu einem anderen im Falle von arrays unterschiedlicher Typen. Dies könnte als O(n log m) für int zu string, zum Beispiel, wobei m der Wert der Größe. In der Praxis ist dies jedoch auf Java, so ist es O(n).Otherwise, if any of the following is true, an ArrayStoreException is thrown ... °The src argument refers to an array with a primitive component type and the dest argument refers to an array with a reference component type °...
Integer
nichtint
, die arraycopy werden versuchen, Sie zu konvertieren, durch die Zuordnung (es werden Ausnahmen nur, wenn Sie sich in primitive Art, aber wenn Sie sind beide Objekte...). Aber gekommen, an es zu denken, ich glaube, Sie werfen einen Fehler bei Typ-Konvertierung; ich war convoluting Java-Objekt-Zuordnung mit C++ - Objekt-Zuordnung. Guten Fang.Ich habe einige der Untersuchung, und später beschlossen, einen test schreiben, code, hier ist was ich habe.
Mein Test-code ist unten angegeben:
Es erzeugt das Ergebnis unten gezeigt
So, Bragboy korrekt ist.
arraycopy()
können auch Plattform-abhängig.O(?)
hier? Natürlich sind meine performance-Analyse ist nicht bullet proof 😉 und ich bin neugierig zu wissen. Graben hinunter zur JDK-source-hilfreich sein könnten. Irgendwelche Gedanken?Nur in der Summe Bemerkungen auf eine andere Frage (gekennzeichnet als ein Duplikat von diesem).
bragboy die Antwort stimmt natürlich, aber dann hatte ich gedacht, dass der einzige Weg, um eine sichere Antwort finden, um den Quellcode zu eine kanonische Antwort, aber das ist nicht möglich. Hier ist die Erklärung für
System.arraycopy();
Es ist
native
, geschrieben in der Sprache des Betriebssystems, was bedeutet, dass die Umsetzung derarraycopy()
ist Plattform abhängig.So, zum Schluss ist es wahrscheinlich, O(n), vielleicht aber auch nicht.
Hier einige relevante Quellcode von OpenJDK 8 (openjdk-8-src-b132-03_mar_2014). Ich fand es mit Hilfe von Java-native-Methode source code (Hinweis: die Anweisungen sind verwirrend; ich suchte die Quelle für die relevanten IDS). Ich denke, Kapitän Ford Kommentar korrekt ist; d.h., es gibt (viele) Fälle, in denen die Iteration jedes element ist nicht nötig. Beachten Sie, dass nicht der Iteration jedes element nicht unbedingt bedeutet O(1), es bedeutet einfach nur "schneller". Ich denke, dass Sie unabhängig ist, wird ein array kopieren muss grundsätzlich O(x), auch wenn x nicht die Anzahl der Elemente im array zu verwenden; d.h., Sie jedoch tun es, das kopieren wird teurer mit mehr Elementen in dem array, und wenn Sie eine Sehr Große Auswahl, es wird ein Linear Lange Zeit. Nachteil: ich weiß nicht für bestimmte, dass dies der eigentliche source-code für die Java ausgeführt werden; nur, dass dies die nur Umsetzung die ich finden konnte, in die OpenJDK-8-Quelle. Ich denke, dass dies ist ein cross-Plattform-Implementierung, aber ich könnte falsch sein-ich definitiv noch nicht herausgefunden, wie um diesen code zu erstellen. Siehe auch: Unterschiede zwischen Oracle JDK und Open JDK. Das folgende stammt aus: /openjdk/hotspot/src/share/vm/oops/objArrayKlass.cpp
Ich verstehe nicht, wie Kowser Antwort beantwortet seine eigene Frage. Ich dachte, um die Zeit zu überprüfen Komplexität eines Algorithmus vergleicht Man seine Laufzeit für die Eingänge von verschiedenen Größen, wie diesem:
Ausgabe: