2013-06-20 7 views
5

Ich frage mich, was ist die Laufzeit für add(index,E) Methode von Java ArrayList. Laut der javadoc amortisiert sich die Laufzeit für den Add-Vorgang O(1). Aber in der Beschreibung von add(index,E) heißt das.Was ist die Laufzeit für das Einfügen eines Elements in einen Index der arrayList?

Fügt das angegebene Element an der angegebenen Position in dieser Liste ein. Verschiebt das Element, das sich momentan an dieser Position befindet (falls vorhanden) und alle nachfolgenden Elemente nach rechts (addiert eins zu ihren Indizes).

So sieht es aus wie O(N). Ich fragte mich, wofür wir handeln müssten, wenn die Laufzeit für diesen Vorgang O(1) wäre. Gibt es irgendwelche Amortisationsarbeiten, die durchgeführt werden können, um diese Operation O(1) durchzuführen und die Laufzeit für eine andere Operation zu opfern?

Ich lese, dass Java ArrayList von Arrays unterstützt wird, würde die Datenstruktur Hilfe ändern?

+1

[reguläre hinzufügen] (http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#add (E)) ist amortisiert O (1), [add at Index ] (http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#add%28int,%20E%29) ist amortisiert O (N) –

Antwort

3

ArrayList hat O (n) Zeit Komplexität für beliebige Indizes hinzufügen/entfernen, aber O (1) für die Operation am Ende der Liste. Closer zu O (1) Nachschlagen impliziert kann etwas sein wie eine Hash Table Datenstruktur mit Index als Schlüssel und Element als Wert gesichert. Die erneute Einfügung dauert O (n) Zeit, da es eine Größenänderung auslöst.

+0

Zu welcher Nachschlageoperation das hat 'O (1)' Zeit beziehst du dich? – jason

+0

meinst du hinzufügen, wenn Sie Lookup sagen? – tejas

2

Eine naive Implementierung einer Array-unterstützten Liste würde jedes Objekt, das auf einem Insert verschoben werden soll, als separate Operation kopieren. Glücklicherweise sind die zu verschiebenden Bytes alle zusammenhängend im Speicher und jedes Betriebssystem bietet Unterstützung für das effiziente Kopieren großer Speicherbereiche in einer einzigen, schnellen Operation.

Das Einfügen in die Mitte eines Arrays ist also nicht so schlimm, wie Sie vielleicht denken. Natürlich könnte sich die Änderung der Datenstruktur zu einer verketteten Liste als schneller erweisen, wenn Ihre Anwendung das richtige Zugriffsmuster hat.

+2

Wie würde die Datenstruktur in die Liste der verknüpften Listen geändert? Einfügung in die verknüpfte Liste, wenn O (1) vereinbart wurde, aber die Suche nach dem einzufügenden Ort könnte O (N) sein, also zerstört das nicht unseren Zweck? – tejas

+0

Daher der Vorbehalt "Wenn Ihre Anwendung die richtige Art von Zugriffsmuster hat." Wenn Sie zum Beispiel die Liste durchgehen und basierend darauf, was Sie dort finden, entscheiden Sie, Elemente an oder in der Nähe Ihres aktuellen Standorts einzufügen, dann funktioniert eine verknüpfte Liste sehr gut. Wenn Sie völlig zufälligen Zugriff benötigen, dann ist die verknüpfte Liste saugt. – Rob

+0

ein weiterer Aspekt der verknüpften Liste vs Arrays ist die Größenanpassung. Java erreicht amortisierten O (1) für Add-Operation wegen der Größenanpassung. – tejas