Große O-Notations-Arrays im Vergleich zu Linked-List-Einfügungen
Big O Notation-Arrays vs. verkettete Listen Einschübe:
Laut wissenschaftlicher Literatur für arrays ist konstant O(1) und für Verknüpfte Listen, es ist linear, O(n).
Einem array nur eine Multiplikation und addition.
Einer verknüpften Liste, die wird nicht angelegt, in zusammenhängenden Speicher benötigt traversal.
Diese Frage ist, O(1) und O(n) genau zu beschreiben, Indizierung/Suche Kosten für arrays und verketteten Listen jeweils?
Kommentar zu dem Problem - Öffnen
Ich denke, das problem, das ich bin vor ist, ich brauche eine schnelle überprüfung der arrarys, verknüpfte Listen, Bäume, hashes...soweit die Leistung in Big O, aber die Informationen begrenzt wird, auf einer Ebene, da dies ein Feld, das in sich selbst
Ich kenne keine umfassenden Bewertungen von Datenstrukturen und deren Laufzeiten, aber hier sind einige Ressourcen: en.wikibooks.org/wiki/Data_Structures/Tradeoffs und essays.hexapodia.net/datastructures
InformationsquelleAutor der Frage | 2011-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
O(1)
genau beschreibt, einfügen am Ende des Arrays. Allerdings, wenn Sie das einfügen in der Mitte eines Arrays, müssen Sie verschieben Sie alle Elemente nach diesem element, so dass die Komplexität für das einfügen in diesem Fall istO(n)
für arrays. End Anhängen auch Rabatte der Fall ist, wo Sie würde haben, um die feldgrösse zu verändern, wenn es voll ist.Für verlinkte Liste zum Durchlaufen der Liste zu tun, Mitte Insertionen, so dass die
O(n)
. Sie haben nicht zu verschieben Elemente eine Position nach unten aber.Gibt es ein nettes Diagramm auf wikipedia: http://en.wikipedia.org/wiki/Linked_list#Linked_lists_vs._dynamic_arrays
InformationsquelleAutor der Antwort wkl
Vorausgesetzt, Sie sprechen über eine Einfügemarke, wo Sie bereits wissen, die Einfügemarke, d.h. diese berücksichtigen nicht das Durchlaufen der Liste zu finden, die richtige position:
Einfügungen in ein array hängt davon ab, wo Sie einfügen, wie Sie benötigen, um eine Verschiebung der vorhandenen Werte. Schlimmsten Fall (einfügen in array[0]) ist O(x).
Einfügen in eine Liste ist O(1) - da brauchen Sie nur zu ändern next/previous Zeiger der benachbarten Elemente.
InformationsquelleAutor der Antwort tinman
Insertion für arrays würde ich mir vorstellen, ist langsamer. Sicher, Sie haben zum Durchlaufen einer verketteten Liste, aber Sie haben zu zuordnen, speichern und freigeben von Speicher zum einfügen in ein array.
InformationsquelleAutor der Antwort MGZero
Welche Literatur werden Sie referenzieren? Die Größe eines Arrays ermittelt wird, wenn das array erstellt wird, und ändert sich nie danach. Einlegen wirklich nur erfolgen, wenn der auf einen freien Steckplatz am Ende des Arrays. Jede andere Art der Aufnahme erfordern Größenänderung und das ist sicherlich nicht
O(1)
. Die Größe einer verknüpften Liste ist von der Implementierung abhängig, aber muss immer mindestens groß genug für die Speicherung aller Ihrer Elemente. Elemente können eingefügt werden, überall in der Liste und Suche nach den entsprechenden index erfordert durchqueren.InformationsquelleAutor der Antwort Amir Afghani
tldr Eine unsortierten array ist Analog zu einem Satz. Wie ein set, der Elemente Hinzugefügt und entfernt werden können, Iteration und Lesen. Aber, als mit einem Satz, macht es keinen Sinn zu reden Sie über einfügen eines Elements an einer bestimmten position, weil dies zu tun wäre ein Versuch zu verhängen, um eine Sortierung auf das, was ist, per definition unsortiert.
Lohnt es sich, zu verstehen, warum die wissenschaftliche Literatur zitiert array einfügen als O(1) für ein array. Es gibt mehrere Konzepte zu verstehen:
Die Länge eines array, definiert als die Anzahl der Elemente, die das array enthält, kann erhöht oder verringert werden willkürlich in O(1) Zeit und es gibt kein limit für die maximale Größe eines Arrays.
(In einem realen computer ist dies nicht der Fall sein, aufgrund von verschiedenen Faktoren wie Speicher-Größe, virtueller Speicher, swap space, usw.. Aber für den Zweck des Algorithmus asymptotische Analyse diese Faktoren sind nicht wichtig - wir kümmern uns darum, wie die Laufzeit des Algorithmus ändert, wenn sich der input-Größe nimmt in Richtung Unendlichkeit, nicht wie es sich verhält auf einem bestimmten Rechner mit einer bestimmten Speichergröße und Betriebssystem.)
Einfügen und Sie löschen sind O(1), da das array ist eine unsortierte Daten-Struktur.
Einfügen ist nicht Zuordnung
Überlegen, was es eigentlich bedeutet, fügen Sie ein element in einer unsortierten Daten-Struktur. Da gibt es keine definierte Reihenfolge, was auch immer, um tatsächlich geschieht, ist beliebig und spielt keine Rolle. Wenn Sie denken, in Bezug auf eine objektorientierte API, die Signatur der Methode wäre so etwas wie:
Beachten Sie, dass dies ist das gleiche wie das einfügen von Methoden, die für andere Datenstrukturen, wie eine verkettete Liste oder array sortiert:
In allen diesen Fällen werden die Anrufer von der einfügen Methode nicht angeben, wo der Wert eingefügt werden können, endet als gespeichert - es ist eine interne detail der Datenstruktur. Auch macht es keinen Sinn für den Anrufer, um zu versuchen, und fügen Sie ein element an einer bestimmten Stelle in der Datenstruktur, die entweder eine sortierte oder unsortierte Daten-Struktur. Für eine (unsortierte) verkettete Liste die Liste ist per definition unsortiert und daher die Sortierreihenfolge ist irrelevant. Für ein sortiertes array ist, wird der Einfügevorgang wird, per definition, fügen Sie ein element an einer bestimmten Stelle des Arrays.
Somit macht es keinen Sinn zu definieren, die ein array insert-operation:
Mit einer solchen definition, der Anrufer hätte Vorrang einer internen Eigenschaft des Daten-Struktur und ein Bestellsystem Einschränkung auf einem unsortierten array - eine Einschränkung, die nicht vorhanden ist in der definition des Arrays, weil ein array ist unsortiert.
Warum dieses Missverständnis auftreten, mit arrays und nicht mit anderen Daten Strukturen? Wahrscheinlich, weil Programmierer verwendet werden, um den Umgang mit arrays, die mit den Zuweisungsoperator:
Dem Zuweisungsoperator gibt die Werte eines Arrays eine explizite Ordnung. Die wichtige Sache zu beachten ist hier, dass Zuordnung ist nicht das gleiche wie einfügen:
Einer unsortierten array hat keine Sortierreihenfolge, und daher einfügen braucht nicht zu erlauben, das überschreiben der position. einfügen ist nicht das gleiche wie Zuordnung. Array einfügen ist einfach definiert als:
Ist O(1).
InformationsquelleAutor der Antwort bain
Längst auf ein system, das hatte mehr RAM, Speicherplatz, ich implementiert eine verkettete Liste indizierte, dass das indiziert wurde, wie es wurde von hand eingegeben oder als es war aus einer Datei geladen werden. Jeder Datensatz anfügen", um den nächsten index in den Arbeitsspeicher und die Festplatte geöffnete Datei der Datensatz am Ende angehängt geschlossen.
Programm kassierter Auktionen, auf einem Modell, das ich von Radio Shack Computers und der die Schreibvorgänge auf der Festplatte waren nur eine Versicherung gegen Stromausfall und für und archivierten Datensatzes, wie in, um sich zu treffen Zeitdruck die Daten abgerufen werden, bilden RAM und gedruckt in umgekehrter Reihenfolge, damit der Käufer könnte sich Fragen, ob das erste Element, das herauskam, war der Letzte, den er gekauft. Jeder Käufer und Verkäufer wurden mit dem letzten Element von Ihnen verkauft, und das Element verknüpft wurde, um das Element vor. Es war nur ein single-link-link-Liste, die war durchzogen von unten nach oben.
Korrekturen wurden vorgenommen mit Umkehr-Einträge. Ich benutzte die gleiche Methode, die für verschiedene Dinge und ich fand nie ein schnelleres system, wenn die Methode funktionieren würde, für die Arbeit an der hand, und der index wurde auf der Festplatte gespeichert und müssen nicht neu erstellt werden, da die Datei neu geladen, um den Speicher, wie es vielleicht in einem Stromausfall.
Später schrieb ich ein Programm zum Bearbeiten mehr konventionell. Es könnte auch die Reorganisation der Daten, so war es gruppiert zusammen.
InformationsquelleAutor der Antwort Gordon Couger