Ein Trie ist eine baumartige Datenstruktur, die zum effizienten Speichern und Durchsuchen von Zeichenfolgen verwendet wird, insbesondere in Anwendungen wie Autovervollständigung, Rechtschreibprüfung und IP-Routing.
Das Einfügen eines Wortes erfordert das Durchlaufen des Tries und das Erstellen neuer Knoten für nicht vorhandene Zeichen.
Die Suche prüft, ob ein Wort im Versuch vorhanden ist, indem es seine Knoten durchläuft.
Dadurch wird überprüft, ob ein Wort im Versuch mit einem bestimmten Präfix beginnt.
class TrieNode { constructor() { this.children = {}; // Stores child nodes this.isEndOfWord = false; // Marks the end of a word } } class Trie { constructor() { this.root = new TrieNode(); } // Insert a word insert(word) { let node = this.root; for (let char of word) { if (!node.children[char]) { node.children[char] = new TrieNode(); } node = node.children[char]; } node.isEndOfWord = true; // Mark the end of the word } // Search for a word search(word) { let node = this.root; for (let char of word) { if (!node.children[char]) { return false; } node = node.children[char]; } return node.isEndOfWord; } // Check if any word starts with the given prefix startsWith(prefix) { let node = this.root; for (let char of prefix) { if (!node.children[char]) { return false; } node = node.children[char]; } return true; } } // Example usage const trie = new Trie(); trie.insert("apple"); console.log(trie.search("apple")); // true console.log(trie.search("app")); // false console.log(trie.startsWith("app")); // true trie.insert("app"); console.log(trie.search("app")); // true
Das Löschen eines Wortes erfordert einen rekursiven Ansatz, bei dem wir Knoten entfernen, die nicht mehr benötigt werden.
delete(word, node = this.root, depth = 0) { if (depth === word.length) { if (!node.isEndOfWord) return false; // Word doesn't exist node.isEndOfWord = false; return Object.keys(node.children).length === 0; // Check if node has children } const char = word[depth]; if (!node.children[char]) return false; const shouldDeleteChild = this.delete(word, node.children[char], depth + 1); if (shouldDeleteChild) { delete node.children[char]; return Object.keys(node.children).length === 0 && !node.isEndOfWord; } return false; }
Zählen Sie, wie viele Wörter mit einem bestimmten Präfix beginnen.
countWordsWithPrefix(prefix) { let node = this.root; for (let char of prefix) { if (!node.children[char]) return 0; node = node.children[char]; } return this._countWords(node); } _countWords(node) { let count = node.isEndOfWord ? 1 : 0; for (let char in node.children) { count += this._countWords(node.children[char]); } return count; }
Gibt bei einem gegebenen Präfix alle Wörter zurück, die damit beginnen.
getWordsWithPrefix(prefix) { let node = this.root; for (let char of prefix) { if (!node.children[char]) return []; node = node.children[char]; } return this._collectWords(node, prefix); } _collectWords(node, prefix) { let results = []; if (node.isEndOfWord) results.push(prefix); for (let char in node.children) { results = results.concat(this._collectWords(node.children[char], prefix + char)); } return results; }
Das obige ist der detaillierte Inhalt vonEinführung in Trie (Präfixbaum). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!