2009-02-25 18 views
4

Wer weiß, wie man einen Suchbaum an begrenzte reguläre Ausdrücke anpassen kann? Die Aufgabe besteht darin, bei einem Dateinamen alle Knoten zu finden, die mit diesem Dateinamen übereinstimmen. Knoten können übliche Dateinamen enthalten (* und?). Offensichtlich, da dies ein Suchbaum ist, ist Geschwindigkeit essentiell.Regulärer Ausdruck (Glob) Suchbaum

EDIT: Ich sollte hinzufügen, dass der wichtigste Fall für die Geschwindigkeit ist die durchschnittliche Zeit, um eine Übereinstimmung auszuschließen. Das heißt, in den meisten Fällen wird der Abgleich fehlschlagen.

Ein Beispiel: Angenommen, der Baum die folgenden Knoten enthalten:

foo, bar, foo *, * bar, foo

Suche nach foo bar würde Knoten zurück 1 und 3 bar für gesucht? würde Knoten 2 und 4 zurückgeben. Suche nach fob würde keine Knoten zurückgeben. Suche nach fooxbar würde Knoten 5 zurückgeben. Suche nach foobar würde Knoten 3 und 4 zurückgeben.

+0

Ist dies ein umgekehrtes Problem (von Regex): Übereinstimmung, wenn eine Zeichenfolge zu einer regulären Sprache gehört oder nicht? – dirkgently

+0

Können Sie uns einen Beispiel-E/A geben? – dirkgently

+0

Ein Beispiel: Angenommen, der Baum enthielt die folgenden Knoten: foo, bar, foo *, * bar, foo? Bar Gegeben eine Zeichenfolge (zB foo, foobar, fooxbar, fob, etc.), schnell den Knoten finden (s), falls vorhanden, die dieser Zeichenfolge entsprechen. –

Antwort

9

Ein Aho-Corasick-Suchbaum würde die Rechnung passen. Aho-Corasick ein sehr guter Artikel über diese Art der Sache Tries, und die in Entwicklung verwendet Implementierung regex zu ersetzen Etrie

bearbeiten Benutzer: das ganze String-Matching zu tun, können Sie Anfang und Ende Anker Zustände hinzuzufügen, wenn mehrzeilige Daten scannen , können Sie den Zeilenumbruch hinzufügen, um zu beginnen und zu beenden. Sie können auch den Teil entfernen, an dem die Querverknüpfung für die Teilübereinstimmung hinzugefügt wird, um eine andere Übereinstimmung zu starten, dies ermöglicht auch einen schnelleren Ausschluss.

Ein anderer Algorithmus zum Überprüfen der Zugehörigkeit zu einem Zeichenfolgensatz ist CritBit. Dies hat keine Regex, aber es ist einfach und testet komplette Strings.

+0

Das sieht sehr vielversprechend aus, obwohl ich die gesamte Eingabezeichenfolge und keine Teilzeichenfolgen darin abgleichen möchte. Ich werde die Links lesen und bestätigen, dass sie der Rechnung entsprechen. –

+0

Sie können einen neuen Frontlinienanker hinzufügen oder wenn Sie mehrere Linienheuschober scannen und die Linienende an der Vorderseite der Nadel hinzufügen. zB "\ nSuchfolge". – sfossen