Effektive Möglichkeiten, ein Element in einem Javascript-Array zu finden

8

Ich verwende ein Array mit Titeln. Jeder Titelindex entspricht einer ID in einer Datenbank, die HTML für diesen bestimmten Titel enthält.

Nehmen wir an, ich habe eine Zeichenfolge, die einen der Titel enthält.

%Vor%

Um die Zeichenfolge "title" zu verwenden, um die entsprechende ID zu erhalten, könnte ich Folgendes tun:

%Vor%

Eine andere Methode, die ich verwenden könnte, ist, ein assoziatives Array zusammen mit dem Titel-Array zu erstellen, das das genaue Gegenteil von Titeln ist. Das heißt, es verwendet die Zeichenfolge als Index und gibt die Zahl zurück.

%Vor%

Ich könnte dann auf die ID zugreifen mit:

%Vor%

Was wäre am effektivsten in Bezug auf CPU, Speicher usw.?

Bitte lassen Sie mich auch wissen, wenn meine Logik falsch ist.

Danke Willem

    
Willem 13.03.2009, 10:10
quelle

4 Antworten

11

Der lineare Suchansatz hat eine Komplexität von O (n), und ich denke, dass das ungünstigste für das assoziative Array ist Ansatz ist wahrscheinlich O (log n), (der beste Fall vielleicht O (1) wenn die JS-Engine Hashes verwendet und keine Kollisionen erhält). Es hängt davon ab, wie eine JS-Engine typischerweise assoziative Arrays / Objekte implementiert, aber Sie können sicher sein, dass sie O übertrifft (n).

Der zweite Ansatz wird also schneller sein, aber natürlich mehr Speicher. Dies ist ein sehr typischer Kompromiss , der mehr Geschwindigkeit bringt, aber mehr Speicher verbraucht, und nur Sie können entscheiden, ob Sie möchte diesen Handel machen.

    
Paul Dixon 13.03.2009, 10:40
quelle
0

Es ist auch wichtig, die Anzahl der Schlüsselwertpaare zu berücksichtigen, die Sie speichern müssen. Wenn es weniger als 50 ist (abhängig von der Implementierung), dann ist das Ausführen einer linearen Suche genauso effizient wie das Durchführen einer Hashtabellensuche, aufgrund der Kosten zum Berechnen des Hash-Werts und zum Auflösen von Kollisionen. Eine Ausnahme ist, dass die Google Chrome v8 JavaScript-Engine eine Art zwischengespeicherte Version aller Objekte speichert, die es ermöglichen, eine Eigenschaft auf einem Objekt direkt nachzuschlagen, daher kann die Verwendung der Object-Klasse als Hash-Tabelle schneller sein, obwohl ich bin mir nicht sicher, ob die Kosten für das Erstellen dieser zwischengespeicherten Version den Vorteil für kleinere Listen überwiegen.

    
eulerfx 13.03.2009 17:18
quelle
0

Sie können die indexOf-Funktion von Array in Ihrer ersten Methode verwenden.

Nachfolgend finden Sie die Informationen von Mozilla Developer: Ссылка

indexOf ist eine JavaScript-Erweiterung für den ECMA-262-Standard; als solche kann es in anderen Implementierungen des Standards nicht vorhanden sein. Sie können dies umgehen, indem Sie den folgenden Code am Anfang Ihrer Skripte einfügen, sodass indexOf in ECMA-262-Implementierungen verwendet werden kann, die ihn nicht nativ unterstützen. Dieser Algorithmus ist genau der, der in Firefox und SpiderMonkey verwendet wird.

%Vor%     
Billy 13.03.2009 17:21
quelle
-2

Javascript-Arrays können einen Wert wie den Titel "why-birds-fly" für den Index verwenden.

Beispiel:   var title="Warum-Vögel-fliegen";

var TitelArray [] = new Array ();

TitelArray [title] = id;

Dann haben Sie direkten Zugriff auf die ID nach Titel:

Rückgabe TitelArray [Titel];

    
Rick Hochstetler 13.03.2009 16:17
quelle