Trie(前缀树)简介

trie(前缀树)简介

Trie树,也称前缀树,是一种用于高效存储和检索字符串的数据结构,广泛应用于自动补全、拼写检查和IP路由等场景。

Trie树的关键特性:

节点: 每个节点代表一个字符。根节点: 根节点为空,作为树的起始点。子节点: 每个节点可拥有多个子节点,数量取决于字符集大小(例如,英文字母为26个)。单词结束标记: 特定节点标记,指示该节点代表一个完整单词的结尾。

基本Trie树操作:

1. 插入单词:

插入新单词需要遍历Trie树,对于不存在的字符,创建新的节点。

2. 查找单词:

查找单词通过遍历Trie树,检查单词是否存在。

3. 前缀查找:

检查Trie树中是否存在以特定前缀开头的单词。

JavaScript实现基本Trie树:

class TrieNode {    constructor() {        this.children = {}; // 存储子节点        this.isWordEnd = false; // 标记单词结尾    }}class Trie {    constructor() {        this.root = new TrieNode();    }    // 插入单词    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.isWordEnd = true; // 标记单词结尾    }    // 查找单词    search(word) {        let node = this.root;        for (let char of word) {            if (!node.children[char]) {                return false;            }            node = node.children[char];        }        return node.isWordEnd;    }    // 检查是否存在以指定前缀开头的单词    startsWith(prefix) {        let node = this.root;        for (let char of prefix) {            if (!node.children[char]) {                return false;            }            node = node.children[char];        }        return true;    }}// 示例用法const trie = new Trie();trie.insert("apple");console.log(trie.search("apple"));   // trueconsole.log(trie.search("app"));     // falseconsole.log(trie.startsWith("app")); // truetrie.insert("app");console.log(trie.search("app"));     // true

登录后复制

高级Trie树操作:

1. 删除单词:

删除单词需要递归方法,删除不再需要的节点。

delete(word, node = this.root, depth = 0) {    if (depth === word.length) {        if (!node.isWordEnd) return false; // 单词不存在        node.isWordEnd = false;        return Object.keys(node.children).length === 0; // 检查节点是否有子节点    }    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.isWordEnd;    }    return false;}

登录后复制

2. 统计以指定前缀开头的单词数量:

计算有多少单词以给定前缀开头。

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.isWordEnd ? 1 : 0;    for (let char in node.children) {        count += this._countWords(node.children[char]);    }    return count;}

登录后复制

3. 自动补全建议:

给定前缀,返回所有以该前缀开头的单词。

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.isWordEnd) results.push(prefix);    for (let char in node.children) {        results = results.concat(this._collectWords(node.children[char], prefix + char));    }    return results;}

登录后复制

时间复杂度:

插入: O(l) (l = 单词长度)查找: O(l)前缀查找: O(l)删除: O(l)

Trie树的应用场景:

自动补全系统 (例如搜索框、文本编辑器)拼写检查器IP路由 (最长前缀匹配)文字游戏 (例如,Boggle)DNA序列匹配

以上就是Trie(前缀树)简介的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2642682.html

(0)
上一篇 2025年3月7日 06:52:38
下一篇 2025年3月6日 04:11:42

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论