Frage

Eine weitere Frage auf SO die Einrichtungen in einigen Sprachen gebracht Strings Hash ihnen einen schnellen Nachschlagen in einer Tabelle zu geben. Zwei Beispiele hierfür sind Wörterbuch <> in .NET und der {} Speicherstruktur in Python. Andere Sprachen unterstützen sicherlich einen solchen Mechanismus. C ++ seiner Karte hat, LISP hat eine gleichwertige, wie die meisten anderen modernen Sprachen.

Es wurde in den Antworten auf die Frage geltend, dass Hash-Algorithmen auf Strings können in konstantem timem mit einem SO Mitglied durchgeführt werden, die 25 Jahren Erfahrung in der Programmierung hat behauptet, dass irgendetwas in konstanter Zeit gehasht werden kann. Meine persönliche Behauptung ist, dass dies nicht wahr ist, es sei denn, Ihre Anwendung eine Grenze auf der String-Länge platziert. Dies bedeutet, dass eine Konstante K die maximale Länge eines Strings diktieren würde.

Ich bin mit dem Rabin-Karp-Algorithmus bekannt, die eine Hash-Funktion für den Betrieb verwendet, aber dieser Algorithmus nicht diktieren, eine bestimmte Hash-Funktion zu verwenden, und der Computer der vorgeschlagenen Autoren O (m), wobei m des Länge des Hash-String.

Ich sehe einige andere Seiten wie diese ( http: // www. cse.yorku.ca/~oz/hash.html ), die angezeigt wird, einige Hash-Algorithmen, aber es scheint, dass jeder von ihnen iteriert über die gesamte Länge der Saite zu ihrem Wert zu gelangen.

Aus meiner vergleichsweise begrenzten Lesung zu dem Thema, scheint es, dass die meisten assoziativen Arrays für String-Typen sind tatsächlich erstellt eine Hash-Funktion verwenden, die mit einem Baum von einer Art unter der Haube arbeitet. Dies kann ein AVL-Baum oder rot / schwarz Baum sein, der in dem Schlüssel / Wert-Paar an die Stelle des Wertes Elements verweist.

Auch bei dieser Baumstruktur, wenn wir in der Größenordnung von Theta bleiben sollen (log (n)), wobei n die Anzahl der Elemente in dem Baum zu sein, brauchen wir eine konstante Zeit Hash-Algorithmus haben. Ansonsten haben wir den additiven Nachteil über die Kette von iterieren. Obwohl Theta (m) würde durch Theta (log (n)) für Indizes mit vielen Saiten verfinstert werden, können wir ignorieren es nicht, wenn wir in einer solchen Domäne sind, dass die Texte, die wir gegen die Suche sehr groß sein wird.

Ich bin mir bewusst, dass Suffix Bäume / Arrays und Aho-Corasick die Suche bringen kann bis auf Theta (m) für einen größeren Aufwand in Erinnerung, aber was ich frage speziell, wenn eine konstante Zeit Hash-Verfahren für Strings beliebiger existiert Längen, wie durch das andere Mitglied sO beansprucht wurde.

Danke.

War es hilfreich?

Lösung

Generell glaube ich, dass jeder vollständige String Hash jedes Zeichen der Zeichenkette verwenden müssen und deshalb brauchen würde als O (n) für n Zeichen wachsen. Aber ich denke, für die praktische String-Hashes können Sie ungefähren Hashes verwenden, die O leicht sein kann (1).

einen String Hash betrachten, die immer verwendet Min (n, 20) einen Standard-Zeichen-Hash zu berechnen. Offensichtlich wächst als O (1) mit Stringgröße. Wird es zuverlässig funktioniert? Es hängt von Ihrer Domain ...

Andere Tipps

Eine Hash-Funktion muss nicht (und kann) einen eindeutigen Wert für jeden String zurück.

Sie könnten die ersten 10 Zeichen verwenden einen Zufallszahlengenerator zu initialisieren und dann verwenden, um herausziehen 100 zufällige Zeichen aus der Zeichenfolge, und Hash, der. Dies wäre konstante Zeit.

Sie können auch zurückkehren nur den konstanten Wert 1. Streng genommen ist dies immer noch eine Hash-Funktion ist, die aber nicht sehr nützlich.

Sie können nicht einfach eine allgemeine konstante Zeit Hashing-Algorithmus für Strings erreichen, ohne schwere Fälle von Hash-Kollisionen zu riskieren.

Für die konstante Zeit sein, werden Sie nicht in der Lage sein, jedes Zeichen in der Zeichenfolge zuzugreifen. Als ein einfaches Beispiel an, dass wir die ersten 6 Zeichen nehmen. Dann kommt jemand und versucht, eine Reihe von URLs Hash. Die hat Funktion finden Sie unter „http: /“. Für jede einzelne Saite

ähnliche Szenarien können für andere Zeichen Auswahlschemata auftreten. Sie könnten Zeichen pseudo-zufällig basierend auf dem Wert des vorherigen Zeichens wählen, aber immer noch die Gefahr, dass spektakulär, wenn die Strings aus irgendeinem Grunde laufen die „falschen“ Muster und viel am Ende mit dem gleichen Hash-Wert haben.

Das ist sicherlich machbar, so lange, wie Sie sicherstellen, alle Ihre Strings ‚interniert‘, bevor Sie sie auf etwas passieren erfordern Hashing. Interning ist der Prozess, die Zeichenfolge in eine Kettentabelle des Einführens ist, so dass alle internierten Strings mit dem gleichen Wert in der Tat das gleiche Objekt. Dann können Sie einfach hash die (feste Länge) Zeiger auf die internierten String, statt Hashing die Zeichenfolge selbst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top