- baut ein trie auf dem Array von Strings
- Für jeden Array-Eintrag, zu Fuß die Trie und wenn der aktuelle Knoten ein Wort markiert, drucken Sie es (unter der gleichen Gruppe wie der aktuellen String). Führen Sie eine Buchhaltung durch, um zu vermeiden, dass das gleiche Wort mehrmals gedruckt wird.
Zeitkomplexität, die Reifen zu bauen ist O(|w1| + ... + |wn|)
wo |wi|
die Länge der Zeichenfolge ist wi
; also ist es linear in der Summe der Längen der Saiten. Die Raumkomplexität wird durch denselben Ausdruck begrenzt, ist aber viel niedriger, wenn viele gemeinsame Präfixe vorhanden sind (was in der Praxis der Fall ist).
Der Abfrageschritt hat Zeitkomplexität linear in der Länge der Saite --- nur den Zweig durchquert, die die Zeichenfolge entspricht. (Vielleicht können Sie Strings, die Sie auf dem Weg besucht haben, abmelden - und werden daher der aktuellen Zeichenfolge vorangestellt - so dass Sie sie später nicht einmal durchqueren. Der Besuch längerer Strings hilft Ihnen, die zeitliche Komplexität zu erhöhen . weiter unten)
Hier ist eine Struktur, um loszulegen:
typedef struct node_t_ node_t;
struct node_t_ {
node_t c *children[ALPHABET_SIZE];
char kIsLeaf; // set to 1 if represents a word
char ch; // character stored in the leaf (redundant)
}
Einfügen einfach. Sie beginnen mit Nicht-NULL root
, die Nullzeichen speichert (die leere Zeichenfolge darstellt).
Insertion:
void insert(const char* str) {
node_t* current = root;
while (*str != '\0') {
if (current->children[*str] == NULL) {
create new node;
}
current = current->children[*str++];
}
current->kIsLeaf = 1;
}
Die anderen Verfahren sind sehr ähnlich. Trie ist eine sehr elegante, einfach zu implementierende und einfach zu bedienende Datenstruktur.
Und wo haben Sie Probleme? – Henry
In meiner aktuellen Implementierung (Brute-Force) stehe ich vor der N * N-Komplexität (was erwartet wird) und dies funktioniert nicht mit großen Arrays. –