Ich habe ein riesiges Wörterverzeichnis:
%Vor%Anzahl der Wörter ist wirklich groß.
Nun möchte ich wirklich alle values
, auf die von word
verwiesen wird, abrufen können. word
ist ein Zeichenfolgenwert.
Was sind die besten Werkzeuge? Ich dachte an eine einfache DB-Lösung, aber DBA-Leute sagten, dass es nicht wirklich schnell funktionieren würde.
Also, bevor ich Cormen 's Buch öffne, gibt es einige fertige Lösungen für dieses Problem?
In RDMSs (YesSQL) werden Sie höchstwahrscheinlich Werte mit den Operatoren LIKE
oder =
auf alle Datensätze suchen, d. h. die Suche dauert O (n). Was Sie wirklich brauchen, ist eine Datenstruktur namens invertierten Index , mit der Sie eine Liste von finden können benötigte Werte in O (1). Zur Beschreibung von Struktur und Algorithmen siehe Wikipedia-Artikel, für die Ready-to-Use-Tools weiterlesen.
Es gibt viele Implementierungen des invertierten Index in Suchmaschinen wie Lucene / Solr , Sphinx (was unterstützt übrigens mehrere Datenbanken als Datenquelle) und auch in einigen Schlüssel-Wert-Speichern wie Berkeley DB oder Apache Cassandra . Unterscheidung zwischen Suchmaschinen und Schlüssel-Wert-Speichern ist, dass:
Beachten Sie auch, dass der invertierte Index eine wirklich einfache Struktur ist, so dass Sie ihn einfach selbst implementieren können, wenn keine der vorherigen Optionen für Sie geeignet ist.
Es hängt wirklich davon ab, welches Verhalten du willst. Wenn Sie nur eine exakte Textsuche durchführen wollen, dann ist eine Hash-Tabelle wahrscheinlich eine wirklich gute Idee. Es hat O (1) Lookup erwartet, das ungefähr so schnell ist, wie Sie bekommen werden.
Wenn Sie die Elemente in sortierter Reihenfolge benötigen (z. B. können Sie sie in einer vernünftigen Reihenfolge durchlaufen), dann ist möglicherweise einer der unzähligen ausgeglichenen Suchbäume ein guter Kandidat; zum Beispiel ein rot-schwarzer Baum oder ein AVL-Baum.
Wenn Sie mit einem riesigen Datenbestand arbeiten, der nicht alle in den Hauptspeicher passen kann, dann ist eine B-Baumstruktur eine gute Wahl, bei der es sich um eine Art ausgeglichener binärer Suchbaumstruktur handelt, die die Anzahl der Festplatten minimiert Lesevorgänge erforderlich, um ein bestimmtes Element zu finden. Die meisten Datenbanksysteme verwenden für ihre Suchvorgänge einige B-Bäume.
Wenn Sie wissen möchten, dass Sie nur nach Wörtern suchen und nicht umgekehrt, verwenden Sie einen einfachen Schlüsselwertspeicher. Vielleicht Redis wäre am besten.
Wenn Sie der Meinung sind, dass Sie je nach den Werten suchen müssen, benötigen Sie wahrscheinlich Sekundärindizes oder Offline-MapReduce-Jobs. Vielleicht Cassandra wäre am besten.
Tags und Links algorithm full-text-search nosql