Rumah >hujung hadapan web >tutorial js >Pengenalan kepada Trie (Pokok Awalan)
A Trie ialah struktur data seperti pepohon yang digunakan untuk menyimpan dan mencari rentetan dengan cekap, terutamanya dalam aplikasi seperti autolengkap, semakan ejaan dan penghalaan IP.
Memasukkan perkataan melibatkan merentasi trie dan mencipta nod baharu untuk aksara yang tidak wujud.
Carian menyemak sama ada perkataan wujud dalam trie dengan merentasi nodnya.
Ini menyemak sama ada sebarang perkataan dalam percubaan bermula dengan awalan yang diberikan.
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
Memadamkan perkataan melibatkan pendekatan rekursif, di mana kami mengalih keluar nod yang tidak diperlukan lagi.
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; }
Kira bilangan perkataan yang bermula dengan awalan yang diberikan.
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; }
Diberi awalan, kembalikan semua perkataan yang bermula dengannya.
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; }
Atas ialah kandungan terperinci Pengenalan kepada Trie (Pokok Awalan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!