当前位置:首页 > JavaScript

js实现前缀树

2026-03-16 06:49:49JavaScript

前缀树(Trie)的基本概念

前缀树是一种树形数据结构,用于高效存储和检索字符串集合。每个节点代表一个字符,从根节点到某一节点的路径构成一个字符串。常用于自动补全、拼写检查等场景。

实现前缀树的核心结构

使用对象(或Map)表示节点,每个节点包含子节点和标记是否为单词结尾的属性。

js实现前缀树

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

前缀树的插入操作

从根节点开始,逐字符插入字符串。若字符不存在则创建新节点,最后标记单词结尾。

js实现前缀树

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;
    }
}

前缀树的搜索操作

检查字符串是否存在:逐字符匹配,若全部字符匹配且最后一个节点标记为结尾,则返回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;
}

完整代码示例

class TrieNode {
    constructor() {
        this.children = {};
        this.isEndOfWord = 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.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

性能分析

  • 时间复杂度:插入、搜索和前缀检查均为 O(L),其中 L 是字符串长度。
  • 空间复杂度:最坏情况下为 O(N×L),N 是字符串数量,L 是平均长度。

通过上述实现,可以高效处理字符串集合的存储和查询需求。

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

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现乘

js实现乘

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

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…