2009-08-17 25 views
1

Ich entschied mich, einen kleinen Parser zu schreiben, um BBCode zu analysieren und richtig formatiertes HTML zurückzugeben. Es fällt mir schwer zu entscheiden, wie die Schlüsselwörter am effizientesten dargestellt werden können. Ich könnte immer separate Strings verwenden, um sie zu halten, aber ich habe das Gefühl, dass es eine unbekannte Datenstruktur (für mich) geben muss, die eine effiziente Suche ermöglichen würde.Was ist die effizienteste Datenstruktur für Keywords?

Ich benutze C++, wenn es etwas in der STL gibt, die ich verwenden kann. Ich beabsichtige nicht, es wirklich zu benutzen, also brauche ich nichts wie PHP. Es wird keine GUI-Schnittstelle haben; Geben Sie einfach eine Textdatei ein und es wird eine neue Datei mit dem ausgegliederten HTML ausgegeben.

Bearbeiten: Mit Schlüsselwörtern meine ich die öffnenden und schließenden Tags, wie [b] und [/b].

Antwort

4

Da Sie alle Ihre Keywords im Voraus kennen, können Sie die Vorteile von perfect hashing, z. via this library - siehe auch die wikipedia entry und die Zeiger daraus.

1

Der Klassiker ist der Aho-Corasick-Schlüsselwortbaum, der in der Arbeit von 1973 eingeführt wurde.

lineare Zeit Wort einfügen, lineare Zeit Wort suchen.

+0

Da die Einfügung zur Kompilierzeit ist, warum ist das besser als die Verwendung eines RAW-Arrays, das auch eine lineare Suche hat? – jkeys

+0

Huh? Warum wird die Einfügung zur Kompilierzeit durchgeführt? Meinst du, dass deine Einfügung nur zur Kompilierzeit erfolgt? Darüber hinaus kann ich nicht sehen, wie ein Array eine lineare Zeitsuche ist, es sei denn, Sie verwenden einige erweiterte Algorithmen auf Suffix-Arrays, die ich bezweifle, dass Sie sind. Die Aho-Corasick-Methode sucht nach ALLEN Schlüsselwörtern für eine Übereinstimmung in der Zeit linear in Bezug auf die Länge des gesuchten Wortes. –

2

Die klassische Antwort ist eine Hash-Tabelle. Konstante Zeit Einfügen/Ersetzen.

Aber es ist nicht ganz klar, was Sie wollen. Wenn es nur darum geht, die Schlüsselwörter sauber zu organisieren, anstatt sie durch Ihren Code zu puffern, würde ein einfaches Array ausreichen; Verwenden Sie dann #defines zum Indizieren und wählen Sie sie aus.

+0

Ich möchte es einfach halten. Wenn ich mir Sorgen um die Geschwindigkeit mache (dh ich brauche konstante Zeit anstelle von linearer Zeit), ist meine einzige Option, einzelne Strings zu speichern und separat zu verwenden? – jkeys

+0

Wenn Sie diesen Ansatz verwenden, ist Karp-Rabin die Antwort. Sie werden keine wahre konstante Zeit erreichen. –

Verwandte Themen