当前位置:首页 > JavaScript

js实现trie

2026-02-02 00:15:58JavaScript

实现 Trie 数据结构

Trie(前缀树)是一种树形数据结构,用于高效存储和检索字符串集合。以下是 JavaScript 实现 Trie 的完整代码和详细说明。

Trie 节点结构

每个 Trie 节点包含一个子节点映射和一个标志表示是否为单词结尾:

js实现trie

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

Trie 类实现

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.isEndOfWord = true;
  }

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

  // 检查前缀是否存在
  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

方法说明

insert(word)

  • 时间复杂度:O(m),m 为单词长度
  • 从根节点开始遍历每个字符
  • 为不存在的字符创建新节点
  • 最后标记单词结束

search(word)

js实现trie

  • 时间复杂度:O(m)
  • 遍历每个字符检查是否存在对应节点
  • 必须匹配完整单词(isEndOfWord为true)

startsWith(prefix)

  • 时间复杂度:O(m)
  • 只需检查前缀路径是否存在
  • 不要求是完整单词

扩展功能

实现删除操作需要处理节点清理:

delete(word) {
  const deleteHelper = (node, word, index) => {
    if (index === word.length) {
      if (!node.isEndOfWord) return false;
      node.isEndOfWord = 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);
}

应用场景

  • 自动补全系统
  • 拼写检查
  • IP路由最长前缀匹配
  • 字典实现

这种实现方式空间效率较高,适合处理大量具有公共前缀的字符串集合。可以根据具体需求扩展功能,如添加词频统计或支持模糊查询。

标签: jstrie
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…