Andere Tipps

Ein weiterer guter Grund ist, dass verkettete Listen sich gut, um eine effiziente Multi-Thread-Implementierungen verleihen. Der Grund hierfür ist, dass Änderungen zu lokalen neigen - beeinflussen nur einen Zeiger oder zwei für einfügen und entfernen zu einem lokalisierten Teil der Datenstruktur. So können Sie viele Threads auf derselben verknüpften Liste arbeiten. Noch mehr, es ist möglich, schleusenfreien Versionen mit CAS-Typ und vermeiden schwere Schlösser insgesamt zu schaffen.

Mit einer verknüpften Liste können Iteratoren durchlaufen auch die Liste, während Modifikationen auftreten, sind. Im optimistischen Fall, dass Änderungen nicht kollidieren können Iteratoren ohne Konkurrenz weiter.

Mit einer Reihe, jede Änderung, die die Größe des Arrays ändert, ist wahrscheinlich einen großen Teil des Feldes und in der Tat erfordert Verriegelung, ist es selten, dass dies ohne eine globale Sperre über das gesamte Array durchgeführt wird, um Änderungen stoppen werden die Weltgeschehen.

Wikipedia hat eine sehr guten Abschnitt über die Unterschiede.

  

Verknüpfte Listen haben mehrere Vorteile   über Arrays. Elemente können eingeführt werden,   in Listen auf unbestimmte Zeit verbunden, während   ein Array wird schließlich entweder füllen   oder müssen der Größe verändert werden, eine teure   Operation, die nicht einmal sein kann,   möglich, wenn der Speicher ist fragmentiert.   In ähnlicher Weise eine Anordnung von den viele   Elemente können entfernt werden,   verschwenderisch leer oder müssen gemacht werden   kleiner.

     

Auf der anderen Seite, Arrays ermöglichen Zufall   Zugang, während verkettete Listen erlauben nur   sequenzieller Zugriff auf Elemente.   Einfach verkettete Listen, in der Tat kann nur   in einer Richtung durchlaufen werden. Diese   macht verkettete Listen ungeeignet für   Anwendungen, bei denen es sinnvoll ist, zu schauen   bis ein Element durch seinen Index schnell,   wie Heapsort. Sequenzieller Zugriff auf   Arrays sind auch schneller als an den verlinkten   Listen auf vielen Maschinen aufgrund Lokalität   von Referenz- und Datencaches. Linked   Listen erhalten fast keinen Nutzen aus   der Cache-Speicher.

     

Ein weiterer Nachteil der verkettete Listen   ist die zusätzliche Speicherung erforderlich für   Referenzen, die sie oft macht   unpraktisch für Listen von kleinen Daten   Elemente wie Zeichen oder boolean   Werte. Es kann auch langsam sein, und mit   ein naiver allocator, verschwenderisch, zu   weisen Speicher separat für jeden   neues Element, ein Problem im Allgemeinen   Verwendung von Speicherpools gelöst.

http://en.wikipedia.org/wiki/Linked_list

Ich werde eine weitere hinzufügen - Listen als rein funktionalen Datenstrukturen wirken kann.

Zum Beispiel können Sie ganz verschiedene Listen haben das gleiche Ende Abschnitt teilen

a = (1 2 3 4, ....)
b = (4 3 2 1 1 2 3 4 ...)
c = (3 4 ...)

das heißt:.

b = 4 -> 3 -> 2 -> 1 -> a
c = a.next.next  

, ohne die Daten zu kopieren, die durch a in b und c hingewiesen werden.

Das ist, warum sie so beliebt in funktionalen Sprachen sind, die unveränderlichen Variablen - prepend und tail Operationen frei auftreten können, ohne die Originaldaten kopieren zu müssen -. Sehr wichtige Eigenschaften, wenn Sie Daten als unveränderlich sind Behandlung

Neben in die Mitte der Liste eingefügt wird einfacher - es ist auch viel einfacher, aus der Mitte einer Liste zu löschen, als ein Array.

Aber ehrlich gesagt, habe ich nie verwenden eine verkettete Liste. Jedes Mal, wenn ich schnell Einfügen und Löschen benötigen, habe ich auch schnelles Nachschlagen benötigt, also ging ich zu einem HashSet oder ein Wörterbuch.

zwei Listen verknüpft Merging (insbesondere zwei doppelt verknüpfte Listen) ist viel schneller als zwei Arrays verschmelzenden (vorausgesetzt, die Zusammenführung ist destruktiv). Die erstere nimmt O (1), wobei letztere nimmt O (n).

EDIT: Um zu klären, ich meine hier im ungeordneten Sinn "Verschmelzung", nicht wie in Mergesort. Vielleicht wäre „verketten“ gewesen ein besseres Wort.

Ein weit unappreciated Argument für Arraylist und gegen LinkedList ist, dass LinkedLists unbequem ist beim Debuggen . Die Zeit, die Wartung Entwickler verbrachte das Programm zu verstehen, z.B. Bugs, erhöht und IMHO finden manchmal nicht die Nanosekunden in Leistungsverbesserungen oder Bytes im Speicherverbrauch in Unternehmen applicatons rechtfertigen. Manchmal (na ja, natürlich hängt es von der Art der Anwendungen), dann ist es besser, ein paar Bytes zu verschwenden, sondern eine Anwendung, die mehr wartbar ist oder leichter zu verstehen.

Zum Beispiel in einer Java-Umgebung und mit Hilfe des Eclipse-Debugger Debuggen eine Arraylist wird ein sehr einfache offenbare Struktur zu verstehen:

arrayList   ArrayList<String>
  elementData   Object[]
    [0] Object  "Foo"
    [1] Object  "Foo"
    [2] Object  "Foo"
    [3] Object  "Foo"
    [4] Object  "Foo"
    ...

Auf der anderen Seite, den Inhalt einer LinkedList beobachten und die Suche nach bestimmten Objekten wird ein Expand-The-Baum Klicken Alptraum, nicht den kognitiven Aufwand zu erwähnen benötigt, um die LinkedList Interna herauszuzufiltern:

linkedList  LinkedList<String>
    header  LinkedList$Entry<E>
        element E
        next    LinkedList$Entry<E>
            element E   "Foo"
            next    LinkedList$Entry<E>
                element E   "Foo"
                next    LinkedList$Entry<E>
                    element E   "Foo"
                    next    LinkedList$Entry<E>
                    previous    LinkedList$Entry<E>
                    ...
                previous    LinkedList$Entry<E>
            previous    LinkedList$Entry<E>
        previous    LinkedList$Entry<E>

Vor allem in C ++ verknüpfen Listen sollen nicht viel mehr Probleme mit zu arbeiten, als ein Array. Sie können die std :: list oder die Boost-Zeigerliste für verkettete Listen. Die wichtigsten Fragen mit verknüpften Listen vs Arrays sind besonders vielen Platz für Zeiger und schrecklichen Direktzugriff erforderlich. Sie sollten eine verkettete Liste, wenn Sie verwenden

  • Sie müssen nicht zufällig Zugriff auf die Daten
  • Sie werden das Hinzufügen / Löschen von Elementen, vor allem in der Mitte der Liste

Für mich ist es so ist,

  1. Zugriff

    • verketteten Listen erlaubt nur sequenziellen Zugriff auf Elemente. So ist die algorithmische Komplexität ist Größenordnung von O (n)
    • Arrays erlaubt direkten Zugriff auf seine Elemente und damit die Komplexität Größenordnung von O (1)
  2. Speicher

    • Verknüpfte Listen benötigen einen zusätzlichen Speicher für Referenzen. Das macht sie unpraktisch für Listen von kleinen Datenelementen wie Zeichen oder Boolesche Werte.
    • Arrays keine zusätzlichen Speicher benötigen zum nächsten Datenelement zu zeigen. Jedes Element kann über Indizes zugegriffen werden.
  3. Größe

    • Die Größe von Verknüpfte Listen ist von Natur aus dynamisch.
    • Die Größe von array auf Erklärung beschränkt.
  4. Einfügen / Löschen

    • Elemente können in verkettete Listen auf unbestimmte Zeit eingefügt und gelöscht werden.
    • Einfügen / Löschen von Werten in Arrays sind sehr teuer. Es erfordert Speicher Neuzuweisung.

Zwei Dinge:

  

eine verknüpfte Liste Codierung ist, kein Zweifel, ein bisschen mehr Arbeit als ein Array mit und er fragte sich, was den zusätzlichen Aufwand rechtfertigen würde.

Sie niemals eine verknüpfte Liste codieren, wenn C ++ verwenden. Verwenden Sie einfach die STL. Wie schwer es ist, sollte zu implementieren nie ein Grund sein, um eine Datenstruktur über einen anderen zu wählen, weil die meisten sind bereits dort umgesetzt werden.

Was die tatsächlichen Unterschiede zwischen einem Array und einer verknüpften Liste, für mich die große Sache ist, wie Sie planen, um die Struktur zu verwenden. Ich werde den Begriff Vektor verwenden, da, dass der Begriff für eine veränderbare Array in C ++ ist.

Indizierung in eine verknüpften Liste langsam ist, weil Sie die Liste zu durchqueren müssen, um den angegebenen Index zu bekommen, während ein Vektor im Speicher zusammenhängend ist, und Sie können es Zeiger Mathematik erhalten werden.

Anfügen an das Ende oder der Anfang einer verknüpften Liste ist einfach, da Sie nur einen Link zu aktualisieren, wo in einem Vektor Sie die Größe haben können, und kopieren Sie den Inhalt über.

Das Entfernen eines Elements aus einer Liste ist einfach, da Sie nur ein Paar von Verbindungen haben zu brechen und sie dann zusammenbringen zurück. ein Element aus einem Vektor Entfernen kann entweder schneller oder langsamer sein, je nachdem, ob Sie um kümmern. Swapping im letzten Artikel über die Spitze der Artikel, den Sie schneller entfernen möchten, während alles verschiebt, nachdem es nach unten langsamer ist, aber behält Ordnung.

Eric Lippert hatte vor kurzem eine Post auf einer der Gründe, Arrays sollten konservativ verwendet werden.

Schnelle Einführung und Entfernung sind in der Tat die besten Argumente für verkettete Listen. Wenn Ihre Struktur auf jedes Element dynamisch und konstant Zeit-Zugriff wächst nicht erforderlich ist (wie dynamische Stapel und Warteschlangen), verkettete Listen sind eine gute Wahl.

Hier ist ein schnell ein: Entfernen von Elementen ist schneller

.

Linked-Liste ist besonders nützlich, wenn die Sammlung ständig wächst und schrumpft. Zum Beispiel ist es schwierig, eine Queue (fügen Sie bis zum Ende, von vorne entfernen) zu implementieren, sich vorzustellen versucht, ein Array - Sie würden alle Ihre Zeit verschieben Dinge verbringen unten. Auf der anderen Seite ist es trivial mit einer verketteten Liste.

Anders als Zugabe und von der Mitte der Liste entfernen, Ich mag verkettete Listen mehr, weil sie dynamisch wachsen und schrumpfen können.

Niemand hat jemals Codes ihre eigene verknüpfte Liste mehr. Das wäre dumm. Die Prämisse, dass eine verknüpfte Liste mit mehr Code nimmt, ist einfach falsch.

In diesen Tagen, eine verkettete Liste Gebäude ist nur eine Übung für Studenten, so dass sie das Konzept verstehen. Stattdessen jeder verwendet eine vordefinierte Liste. In C ++ basiert die auf der Beschreibung in unserer Frage, dass würde wahrscheinlich eine stl Vektor bedeutet (#include <vector>).

Daher vs einem Array eine verkettete Liste Auswahl ist ganz über die unterschiedlichen Eigenschaften jeder Struktur in Bezug auf die Bedürfnisse Ihrer App wiegen. die zusätzlichen Programmieraufwand zu überwinden sollte Null Einfluss auf die Entscheidung haben.

Es ist wirklich eine Frage der Effizienz, der Aufwand einfügen, löschen oder verschieben (wo Sie tauschen nicht nur) Elemente innerhalb einer verknüpften Liste ist minimal, dh die Operation selbst O (1), Verse O (n) für eine Anordnung. Dies kann einen wesentlichen Unterschied machen, wenn Sie stark auf eine Liste von Daten arbeitet. Sie wählten Ihre Datentypen auf, wie Sie auf sie arbeiten soll, und wählen Sie die effizienteste für den Algorithmus Sie verwenden.

Arrays sinnvoll, wo die genaue Anzahl der Elemente bekannt sein wird, und wo durch den Index der Suche macht Sinn. Zum Beispiel, wenn ich den genauen Zustand meines Videoausganges zu einem bestimmten Zeitpunkt ohne Komprimierung speichern will, würde ich wahrscheinlich eine Reihe von Größe [1024] [768] verwenden. Das wird mich bieten genau das, was ich brauche, und eine Liste wäre viel, viel langsamer um den Wert eines gegebenen Pixels zu erhalten. In Orten, wo ein Array macht keinen Sinn, es in der Regel eines besserer Datentyp als eine Liste ist effektiv mit Daten umgehen.

Arrays Vs verlinkte Liste:

  1. Array Speicherzuweisung fehl manchmal wegen der fragmentierten Speicher.
  2. Caching ist besser in Arrays als alle Elemente zusammenhängenden Speicherplatz zugewiesen werden.
  3. Die Codierung ist komplexer als Arrays.
  4. Keine Größenbeschränkung auf verlinkte Liste, im Gegensatz zu Arrays
  5. Einfügen / Löschen werden schneller in verlinkte Liste und Zugriff ist schneller in Arrays.
  6. verlinkte Liste besser von Multi-Threading Sicht.

als Arrays sind in der Natur statisch, also alle Operationen wie Speicherzuweisung erfolgt zum Zeitpunkt der Kompilierung nur. So Prozessor hat weniger Aufwand bei seiner Laufzeit zu setzen.

Angenommen, Sie haben eine geordnete Menge, die Sie auch durch das Hinzufügen und Entfernen von Elementen ändern möchten. Darüber hinaus müssen Sie Fähigkeit, ein Verweis auf ein Element in einer solchen Art und Weise zu erhalten, die später eine vorherige oder nächste Element zu erhalten. Zum Beispiel kann eine To-do-Liste oder in einem Buch von Absätzen.

Als erstes sollten wir beachten, dass, wenn Sie Verweise auf Objekte außerhalb des Satzes beibehalten mögen selbst, Sie werden wahrscheinlich Zeiger im Array am Ende zu speichern, anstatt die Speicherung Objekte selbst. Andernfalls werden Sie nicht in der Lage sein, in einem Array einfügen - wenn Objekte in das Array eingebettet sind, werden sie während Einfügungen bewegen und alle Hinweise auf sie werden ungültig. Gleiches gilt für die Array-Indizes.

Ihr erstes Problem, wie Sie selbst festgestellt haben, ist Einfügung - verknüpfte Liste ermöglicht in O (1) eingesetzt wird, aber ein Array würde erfordern in der Regel O (n). Dieses Problem kann teilweise überwunden werden. - es ist möglich, eine Datenstruktur zu schaffen, die Array-ähnliche Nebenordnungszugriffsschnittstelle, wo sowohl das Lesen und Schreiben gibt, sind, im schlimmsten Fall, logarithmisch

Ihre zweite und ernsteres Problem ist, dass ein Element der Suche nächstes Elements gegeben ist O (n). Wenn sich das Gerät nicht geändert wurde der Index des Elements als Referenz anstelle des Zeigers behalten konnte wodurch Fund-next ein O (1) Betrieb, aber da es alles, was Sie haben, ist ein Zeiger auf das Objekt selbst und keiner Weise seinen aktuellen Index im Array die nicht durch Abtasten der gesamte „Array“ zu bestimmen. Dies ist ein unüberwindbares Problem für Arrays -. Auch wenn Sie Einfügungen optimiert, gibt es nichts, was Sie finden nächsten Typ Betrieb zu optimieren tun können, um

In einem Array haben Sie das Privileg, jedes Element in O Zugriff (1) Zeit. So ist es geeignet für Operationen wie Binäre Suche Schnell sortieren usw. verlinkte Liste auf der anderen Seite eignet sich zum Einfügen Löschen als in O (1) Zeit. Beide hat Vorteile als auch Nachteile und man lieber über das andere läuft darauf hinaus, was Sie implementieren möchten.

- größere Frage ist, können wir ein Hybrid aus beiden haben. So etwas wie, was Python und Perl als Listen implementieren.

verlinkte Liste

Es ist mehr bevorzugt, wenn es um Einsetzen kommt! Im Grunde, was ist tut, ist, dass sie mit dem Zeiger beschäftigt

1 -> 3 -> 4

Einfügen (2)

1 ........ 3 ...... 4
..... 2

Schließlich

1 -> 2 -> 3 -> 4

Ein Pfeil, der von den zwei Punkten auf 3 und den Pfeil von 1 Punkten bei 2

Einfach!

Aber von Array

| 1 | 3 | 4 |

Einfügen (2) | 1 | 3 | | 4 | | 1 | | 3 | 4 | | 1 | 2 | 3 | 4 |

Nun kann jeder den Unterschied sichtbar machen! Nur für 4 Index Wir führen 3 Stufen

Was passiert, wenn die Array-Länge ist eine Million dann? Ist Array leistungsfähig? Die Antwort ist nein! :)

Das gleiche gilt für das Löschen! In verlinkte Liste können wir einfach den Zeiger und das Element und als nächste in der Objektklasse zunichte machen! Aber für Array, müssen wir Shiftleft ()

auszuführen

Ich hoffe, das hilft! :)

verlinkte Liste mehr ein Overhead ist als Array zu halten, es erfordert auch zusätzliche Speicher all diese Punkte vereinbart werden. Aber es gibt ein paar Dinge, die Anordnung tun kann nicht. In vielen Fällen nehme man ein Array mit einer Länge von 10 ^ 9 möchten, können Sie es nicht bekommen, weil ein Standort kontinuierliche Speicher immer dort sein muss. Verlinkte Liste einen Retter hier sein könnte.

Angenommen, Sie mehrere Dinge mit Daten dann können sie leicht erweitert werden, in der verknüpften Liste gespeichert werden sollen.

STL-Container haben in der Regel Liste Implementierung hinter der Szene verknüpft.

Nur Grund zu verwenden verkettete Liste ist, dass das Element einfügen leicht ist (Entfernen auch).

Disadvatige könnte sein, dass Zeiger viel Platz in Anspruch nehmen.

Und darüber Codierung ist härter: Normalerweise brauchen Sie keinen Code verknüpfte Liste (oder nur einmal) sie enthalten sind in STL  und es ist nicht so kompliziert, wenn Sie es noch zu tun haben.

ich denke auch, dass Linkliste ist besser als Arrays. weil wir in Linkliste, aber nicht in Arrays

Sie durchqueren

Je nach Sprache, könnten einige dieser Nachteile und Vorteile in Betracht gezogen werden:

C Programming Language : Wenn eine verknüpfte Liste mit (durch struct Zeiger der Regel), besondere Beachtung muss sichergestellt werden, dass Sie nicht Speicher undicht sind. Wie bereits erwähnt, sind verkettete Listen einfach zu mischen, weil alle taten, ist Zeiger ändern sich, aber wollen wir erinnern uns alles zu befreien?

Java : Java hat eine automatische Garbage sammeln, so undicht Speicher wird ein Problem nicht, aber von dem hohen Niveau Programmierer versteckt ist die Details der Implementierung, was eine verkettete Liste ist. Methoden wie einen Knoten aus der Mitte der Liste zu entfernen ist eher ein Verfahren kompliziert als einige Nutzer der Sprache würde erwarten, dass es sein.

Warum eine verknüpfte Liste über ein Array? Nun, wie einige haben schon gesagt, eine höhere Geschwindigkeit von Einfügungen und Löschungen.

Aber vielleicht müssen wir uns nicht mit den Grenzen der entweder leben, und das Beste von beidem zugleich ... eh?

Bei Array-Deletionen, können Sie einen ‚Gelöschte‘ Byte verwenden, um die Tatsache zu erklären, dass eine Zeile gelöscht wurde, so dass das Array reorging ist nicht mehr erforderlich. Um die Belastung von Einfügungen zu erleichtern, oder schnell Daten zu ändern, verwenden Sie eine verknüpfte Liste dafür. Dann, wenn sie Bezug genommen wird, haben Sie Ihre Logik erstes sucht, dann die andere. So sie in Kombination mit gibt Ihnen das Beste aus beiden.

Wenn Sie eine wirklich große Auswahl haben, können Sie es mit einem anderen kombinieren könnte, viel kleinere Arrays oder verkettete Liste, wo die kleinere Halte thes 20, 50, 100 zuletzt verwendeten Elemente. Wenn die benötigte man nicht in der kürzeren verknüpften Liste oder ein Array ist, gehen Sie auf die große Auswahl. Wenn es gefunden haben, können Sie es auf der Annahme auf die kleinere verknüpften Liste / Array hinzufügen, dass ‚die Dinge zuletzt verwendet werden, sind die meist likey wiederverwendet werden‘ (und ja, möglicherweise das zuletzt verwendete Element aus der Liste Stoßen). Welche gilt in vielen Fällen und löste ein Problem, das ich in einer ASP-Sicherheitsberechtigungen hatte zu bewältigen Modul überprüft, mit Leichtigkeit, Eleganz und beeindruckender Geschwindigkeit.

Während viele von Ihnen auf großen adv./dis der verknüpften Liste vs Array berührt haben, die meisten der Vergleiche sind, wie man besser / schlechter als die other.Eg. Sie können wahlfreien Zugriff im Array tun, aber in verknüpften Liste und andere nicht möglich. Dies ist jedoch unter der Annahme, Linklisten und Array wird in einer ähnlichen Anwendung angewandt werden. Doch eine richtige Antwort sein sollte, wie Linkliste über Array bevorzugt würde und umgekehrt in einer bestimmten Anwendungsbereitstellung. Angenommen, Sie möchten ein Wörterbuch-Anwendung implementieren, was würden Sie nutzen? Array: mmm wäre es leicht Retrieval durch binäre Suche und andere Such algo .. erlauben aber können denken, wie Link-Liste sein kann better..Say Sie suchen möchten „Blob“ im Wörterbuch. Wäre es sinnvoll, eine Linkliste zu haben, von A-> B-> C-> D ----> Z und dann jedes Listenelement zeigt auch auf ein Array oder eine andere Liste aller Wörter die mit diesem Buchstaben beginnen ..

A -> B -> C -> ...Z
|    |    |
|    |    [Cat, Cave]
|    [Banana, Blob]
[Adam, Apple]

Nun ist der obige Ansatz besser oder eine flache Anordnung von [Adam, Apfel, Banane, Fleck, Katze, Cave]? Wäre es auch möglich sein, mit Array? So ein großer Vorteil der Link-Liste ist, dass Sie ein Element haben, können nicht nur auf das nächste Element zeigen, sondern auch auf einen anderen Link-Liste / array / Heap / oder andere Speicherort. Array ist ein ein flacher contigous Speicher in Scheiben geschnitten in Blöcken Größe des Elements es .. Linkliste auf der anderen Seite zu speichern, wird ist ein Brocken von Nicht-contigous Speichereinheiten (kann beliebig groß sein und kann alles speichern) und zeigt auf jeden andere so, wie Sie wollen. Ebenso kann sagen, dass Sie ein USB-Laufwerk machen. Nun würden Sie Dateien wie wie jedes Array oder als Link-Liste gespeichert werden? Ich denke, Sie bekommen die Idee, was ich zeigte auf:)

  

Warum sollte jemand eine Linked-Liste über einen Array benutzen?

Dies ist nur ein Grund, -. Wenn Sie eine verknüpfte Listendatenstruktur und eine Programmiersprache müssen Sie verwenden, ist kein Zeiger unterstützt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top