Zwei Zeichenfolgen der Länge k , die sich in einem Zeichen unterscheiden, teilen sich ein Präfix der Länge l und ein Suffix der Länge m, so dass k = l + m + 1 ist .
Die Antwort von Simon Prins kodiert das alles durch das Speichern Präfix / Suffix - Kombinationen explizit, dh abc
wird *bc
, a*c
und ab*
. Das ist k = 3, l = 0,1,2 und m = 2,1,0.
Wie valarMorghulis betont, können Sie Wörter in einem Präfixbaum organisieren. Es gibt auch den sehr ähnlichen Suffixbaum. Es ist ziemlich einfach, den Baum mit der Anzahl der Blattknoten unter jedem Präfix oder Suffix zu erweitern. Dies kann in O (k) aktualisiert werden, wenn ein neues Wort eingefügt wird.
Der Grund, warum Sie diese Anzahl von Geschwistern wünschen, ist, dass Sie bei einem neuen Wort wissen, ob Sie alle Zeichenfolgen mit demselben Präfix oder alle Zeichenfolgen mit demselben Suffix aufzählen möchten. ZB für "abc" als Eingabe sind die möglichen Präfixe "", "a" und "ab", während die entsprechenden Suffixe "bc", "c" und "" sind. Wie es offensichtlich ist, ist es für kurze Suffixe besser, Geschwister im Präfixbaum aufzulisten und umgekehrt.
Wie @einpoklum hervorhebt, ist es durchaus möglich, dass alle Zeichenfolgen dasselbe k / 2- Präfix haben. Das ist für diesen Ansatz kein Problem. Der Präfixbaum ist linear bis zur Tiefe k / 2, wobei jeder Knoten bis zur Tiefe k / 2 der Vorfahr von 100.000 Blattknoten ist. Infolgedessen wird der Suffixbaum bis zu einer Tiefe von (k / 2-1) verwendet, was gut ist, da sich die Zeichenfolgen in ihren Suffixen unterscheiden müssen, da sie Präfixe gemeinsam haben.
[Bearbeiten] Wenn Sie als Optimierung das kürzeste eindeutige Präfix eines Strings ermittelt haben, wissen Sie, dass es das letzte Zeichen des Präfixes sein muss , wenn es ein anderes Zeichen gibt, und Sie hätten das nahezu doppelte gefunden, wenn Überprüfung eines kürzeren Präfixes. Wenn "abcde" also das kürzeste eindeutige Präfix "abc" hat, bedeutet dies, dass es andere Zeichenfolgen gibt, die mit "ab?" Beginnen. aber nicht mit "abc". Wenn sie sich also nur in einem Zeichen unterscheiden würden, wäre dies das dritte Zeichen. Sie müssen nicht mehr nach "abc? E" suchen.
Wenn Sie nach der gleichen Logik feststellen würden, dass "cde" ein eindeutiges kürzestes Suffix ist, müssen Sie nur das Präfix "ab" der Länge 2 und nicht die Präfixe der Länge 1 oder 3 überprüfen.
Beachten Sie, dass diese Methode nur für genau einen Zeichenunterschied funktioniert und nicht auf zwei Zeichenunterschiede verallgemeinert wird. Dabei wird ein einziges Zeichen als Trennung zwischen identischen Präfixen und identischen Suffixen verwendet.