2014-08-28 5 views
5

Ich glaube, dass in einigen anderen Sprachen als Ruby eine Array-Suche O (1) ist, weil Sie wissen, wo die Daten beginnen, und multiplizieren Sie den Index mit der Größe der Daten, die das Array hält, und greifen Sie dann auf diesen Speicherort .Warum wird in einem Array O (1) gesucht?

Allerdings kann ein Array in Ruby Objekte aus verschiedenen Klassen haben, also wie schafft es ein Nachschlagen von O (1) Komplexität?

+0

Ihr erster Absatz widersprach Ihrem zweiten Absatz, also habe ich bearbeitet, um es nicht widersprüchlich zu machen. Wenn Sie eine bestimmte Sprache im Sinn haben, die Sie nicht erwähnt haben, dann machen Sie das klar. – sawa

+0

Sawa, du bist mehr als richtig. Danke für die Bearbeitung. – blackghost

Antwort

6

Was @Neil Slater sagte, mit ein wenig mehr Details ...

Grundsätzlich gibt es zwei plausible Ansätze eine Reihe von heterogenen Objekten unterschiedlicher Größe zu speichern:

  1. Shop die Objekte als einzeln - oder doppelt - linked list, wobei dem Speicherplatz für jedes einzelne Objekt ein oder mehrere Zeiger auf die vorhergehenden und/oder folgenden Objekte vorangestellt sind. Diese Struktur hat den Vorteil, dass es sehr einfach ist, neue Objekte an beliebigen Stellen einzufügen, ohne sich um den Rest des Arrays zu bewegen. Der Nachteil ist jedoch, dass das Nachschlagen eines Objekts an seiner Position generell O(N) ist, da man von einem beginnen muss Ende der Liste und durchspringe sie Knoten für Knoten, bis du bei der n-ten ankommst.

  2. Speichern Sie eine Tabelle oder ein Array von Zeigern konstanter Größe auf die einzelnen Objekte. Da diese Nachschlagetabelle Objekte konstanter Größe in einem zusammenhängenden geordneten Layout enthält, suchen Sie nach den Adressen einzelner Objekte O(1); Die Tabelle ist nur ein C-artiges Array, in dem die Suche nur ein paar wenige Maschinenanweisungen benötigt, sogar auf RISC-CPU-Architekturen.

(Die Allocation-Strategien der einzelnen Objekte für die Speicherung sind auch interessant und komplex, aber nicht unmittelbar relevant für Ihre Frage.)

dynamische Sprachen wie Perl/Python/Ruby-ziemlich alle entscheiden sich für # 2 für ihre allgemeine Liste/Array-Typen. Mit anderen Worten, sie machen die Suche effizienter als das Einfügen von Objekten an zufälligen Orten in der Liste, was für viele Anwendungen die bessere Wahl ist.

Ich bin nicht vertraut mit den Implementierungsdetails für Ruby, aber sie sind wahrscheinlich sehr ähnlich denen von Pythons list Art, deren Leistung und Design in wunderbaren Details bei effbot.org erklärt wird.

4

Ihre Implementierung enthält wahrscheinlich ein Array von Speicheradressen, die auf die tatsächlichen Objekte zeigen. Daher kann es immer noch nachschlagen, ohne das Array zu durchlaufen.

+4

Für MRI Ruby und Rubinius: Intern * alle * Ruby-Objekte sind der gleiche Basistyp in C (bezeichnet in einem '# define' namens' VALUE', also könnte es in einigen Implementierungen geändert werden). Manchmal wird ein "WERT" als ein Zeiger behandelt, manchmal (z. B. für kleine ganze Zahlen) ist ein codierter Wert des Elements. Es sind diese 'VALUE'-Ausdrücke fester Länge, die jedoch in einem Array gespeichert werden. Wenn Sie dieses Detail angeben, können Sie das * wahrscheinlich * löschen. –

+0

@NeilSlater Geben Sie Ihren Kommentar als richtige Antwort ein: D Ich lösche meine Tipp-Antwort. – lulalala

Verwandte Themen