Eine Liste besteht aus cons
Zellen. Von der R5RS list section:
Die Objekte in den Auto-Feldern der aufeinander folgenden Paare einer Liste sind die Elemente der Liste. Zum Beispiel ist eine Liste mit zwei Elementen ein Paar, dessen Auto das erste Element ist und dessen cdr ein Paar ist, dessen Auto das zweite Element ist und dessen cdr die leere Liste ist. Die Länge einer Liste ist die Anzahl der Elemente, die der Anzahl der Paare entspricht.
Zum Beispiel kann die Liste (a b c)
entspricht die folgende Reihe von Paaren: (a . (b . (c .())))
und konnte durch den folgenden „Knoten“ im Speicher dargestellt werden: []
[p] --> [p] --> [p] --> null
| | |
|==> a |==> b |==> c
jeden Knoten enthält einen Zeiger auf den Wert (es ist car
), und einen weiteren Zeiger auf das nächste Element (es ist cdr
).
Dadurch kann die Liste auf eine unbegrenzte Länge anwachsen, aber eine ref
Operation muss am Anfang der Liste beginnen und k
Elemente durchlaufen, um die gewünschte zu finden. Wie Sie gesagt haben, ist dies O (n).
dagegen ein Vektor ist im Grunde eine Anordnung von Werten, die intern als ein Array von Zeigern dargestellt werden könnten.
[p p p]
| | |
| | |==> c
| |
| |==> b
|
|==> a
Wo das Array []
eine Reihe von drei Zeigern enthält, und jeder Zeiger auf einen Wert in dem Vektor zugeordnet ist: Zum Beispiel könnte der Vektor #(a b c)
dargestellt werden. So könnten Sie intern das dritte Element des Vektors v
mit der Notation v[3]
referenzieren. Da Sie die vorherigen Elemente nicht durchlaufen müssen, ist vector-ref
eine O (1) -Operation.
Der Hauptnachteil ist, dass Vektoren eine feste Größe haben. Wenn Sie also mehr Elemente hinzufügen müssen, als der Vektor halten kann, müssen Sie einen neuen Vektor zuweisen und die alten Elemente in diesen neuen Vektor kopieren. Dies kann möglicherweise eine teure Operation sein, wenn Ihre Anwendung dies regelmäßig tut.
Es gibt viele Online-Ressourcen - dieser Artikel auf Scheme Data Structures geht mehr ins Detail und liefert einige Beispiele, obwohl es viel mehr auf Listen ist.
Alles, was gesagt, wenn Ihre Schlüssel sind (oder werden kann) ganze Zahlen sind und Sie entweder eine feste Anzahl von Elementen haben oder können mit einer angemessenen Menge von Vektor-Umschichtungen verwalten - zum Beispiel, laden Sie den Vektor beim Start und dann meist Lesevorgänge ausführen - ein Vektor kann eine attraktive Alternative zu einer Assoziationsliste sein.
Vielen Dank, dass Sie mich über Hashtabellen informiert haben. –
Akzeptiert diese Antwort ein wenig spät, aber hey. –