当前位置:首页 > JavaScript

js实现前缀树

2026-02-03 05:56:17JavaScript

前缀树(Trie)的基本概念

前缀树是一种树形数据结构,用于高效存储和检索字符串集合。其核心特点是共享公共前缀,适合实现自动补全、拼写检查等功能。

实现前缀树的关键步骤

定义节点结构
每个节点包含子节点(通常用对象或Map表示)和标记是否为单词结尾的标识:

class TrieNode {
  constructor() {
    this.children = {}; // 子节点
    this.isEnd = false; // 是否为单词结尾
  }
}

实现前缀树类
初始化根节点并实现插入、搜索和前缀匹配方法:

class Trie {
  constructor() {
    this.root = new TrieNode();
  }

  // 插入单词
  insert(word) {
    let node = this.root;
    for (const char of word) {
      if (!node.children[char]) {
        node.children[char] = new TrieNode();
      }
      node = node.children[char];
    }
    node.isEnd = true;
  }

  // 搜索完整单词
  search(word) {
    let node = this.root;
    for (const char of word) {
      if (!node.children[char]) {
        return false;
      }
      node = node.children[char];
    }
    return node.isEnd;
  }

  // 检查前缀是否存在
  startsWith(prefix) {
    let node = this.root;
    for (const 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"));   // true
console.log(trie.search("app"));     // false
console.log(trie.startsWith("app")); // true
trie.insert("app");
console.log(trie.search("app"));     // true

性能优化建议

  • 子节点存储:使用Map替代对象可能提升性能(尤其在键为动态时)。
  • 内存优化:对于大规模数据,考虑压缩前缀树(如Radix Tree)。
  • 删除操作:可扩展实现删除功能,需递归清理无用的节点。

扩展:删除单词实现

delete(word) {
  const deleteHelper = (node, word, index) => {
    if (index === word.length) {
      if (!node.isEnd) return false;
      node.isEnd = false;
      return Object.keys(node.children).length === 0;
    }
    const char = word[index];
    if (!node.children[char]) return false;
    const shouldDelete = deleteHelper(node.children[char], word, index + 1);
    if (shouldDelete) {
      delete node.children[char];
      return Object.keys(node.children).length === 0;
    }
    return false;
  };
  deleteHelper(this.root, word, 0);
}

js实现前缀树

标签: 前缀js
分享给朋友:

相关文章

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('imag…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的…