Vorausgesetzt, ich habe ein RIESIGES Array und einen Wert daraus. Ich möchte einen Index des Werts im Array erhalten. Gibt es einen anderen Weg, als anzurufen Array#index
, um ihn zu bekommen? Das Problem ergibt sich aus der Notwendigkeit, ein wirklich großes Array zu behalten und sehr Array#index
oft anzurufen.
Nach einigen Versuchen stellte ich fest, dass das Zwischenspeichern von Indizes innerhalb von Elementen durch Speichern von Strukturen mit (value, index)
Feldern anstelle des Werts selbst einen großen Leistungsschritt darstellt (20-facher Gewinn).
Trotzdem frage ich mich, ob es eine bequemere Möglichkeit gibt, den Index von en element ohne Caching zu finden (oder ob es eine gute Caching-Technik gibt, die die Leistung steigert).
quelle
Warum nicht Index oder Index verwenden?
quelle
Andere Antworten berücksichtigen nicht die Möglichkeit, dass ein Eintrag mehrmals in einem Array aufgeführt wird. Dies gibt einen Hash zurück, bei dem jeder Schlüssel ein eindeutiges Objekt im Array ist und jeder Wert ein Array von Indizes ist, das dem Standort des Objekts entspricht:
Dies ermöglicht eine schnelle Suche nach doppelten Einträgen:
quelle
Gibt es einen guten Grund, keinen Hash zu verwenden? Lookups sind
O(1)
vs.O(n)
für das Array.quelle
#keys
Hash auf, der ein Array zurückgibt, das ich benutze. Trotzdem könnte ich auch über meine Architektur nachdenken ...Wenn es sich um ein sortiertes Array handelt, können Sie einen binären Suchalgorithmus (
O(log n)
) verwenden. Erweitern Sie beispielsweise die Array-Klasse mit dieser Funktionalität:quelle
Wenn Sie eine Kombination aus der Antwort von @ sawa und dem dort aufgeführten Kommentar verwenden, können Sie einen "schnellen" Index und einen Index für die Array-Klasse implementieren.
quelle
Wenn Ihr Array eine natürliche Reihenfolge hat, verwenden Sie die binäre Suche.
Verwenden Sie die binäre Suche.
Die binäre Suche hat
O(log n)
Zugriffszeit.Hier sind die Schritte zur Verwendung der binären Suche:
bsearch
diese Option , um Elemente oder Indizes zu findenCodebeispiel
quelle
Sie können die binäre Suche verwenden (wenn Ihr Array geordnet ist und die Werte, die Sie im Array speichern, in irgendeiner Weise vergleichbar sind). Damit dies funktioniert, müssen Sie in der Lage sein, der binären Suche mitzuteilen, ob sie "nach links" oder "nach rechts" des aktuellen Elements suchen soll. Aber ich glaube, es ist nichts Falsches daran, das
index
beim Einfügen zu speichern und es dann zu verwenden, wenn Sie das Element aus demselben Array erhalten.quelle