【数据结构与算法】字典树/前缀树(Python/C++)

前缀树(字典树)是一种优化字符串存储和查询的数据结构,尤其适用于基于前缀的模糊匹配。本文介绍了前缀树的概念、应用场景,并提供了Python和C++的实现示例,其中C++使用了类模板和智能指针以防止内存泄漏。此外,还提及了AC自动机作为前缀树的扩展,用于更复杂的字符串匹配问题。
摘要由CSDN通过智能技术生成

字典树/前缀树 Trie

前缀树是一种树结构,当一系列单词有很多公共前缀时就可以用前缀树来存储和查询,如果这些单词没有公共前缀,那么和用数组存是一样的。因为前缀树中节点通常用字典(Python中的dict,C++中的map)这个数据结构来存储子节点,所以常被称为字典树。前缀树是一种空间换时间的思想,这个和哈希表还有动态规划是一样的。

前缀树常常被用于基于前缀的模糊匹配,但其不局限于存储单词,树中的节点可以是任意的数据类型或者结构,比如前缀树会被用来解决最大异或值的问题,这时前缀树为二叉树,节点的值为0或者1。

前缀树只能用作基于前缀的模糊匹配,如果要做到匹配字符串中的某一段则要借助基于前缀树的AC自动机了,AC自动机融合了前缀树和KMP算法的思想。

前缀树的实现(Python)

class TrieNode:
    """前缀树中节点的数据结构"""
    def __init__(self):
        # count表示有多少个单词以当前节点为结尾
        self.count      = 0
        # pre_count表示以根节点到当前节点为前缀的单词个数
        self.pre_count  = 0
        # children存储所有当前节点的下一个节点
        self.children   = {
   }


class Trie:
    """前缀树的实现"""
    def __init__(self):
        # 定义前缀树的根节点
        self.root = TrieNode()

    def insert(self, word):
        """向前缀树中添加单词"""
        node = self.root
        for ch in word:
            if ch not in node.children:
                node.children[ch] = TrieNode()
            node = node.children[ch]
            node.pre_count += 1
        node.count += 1

    def search(self, word):
        """查找word是否位于前缀树内"""
        node = self.root
        for ch in word:
            if ch not in node.children:
                return False
            node = node.children[ch]
        return node.count > 0

    def start_with(self, prefix):
        """判断prefix是否为前缀树中的前缀"""
        node = self.root
        for ch in prefix:
            if ch not in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值