8. Tire 树

本文详细介绍了字典树(TrieTree)的数据结构,它利用空间来优化查找效率。通过Trie树的节点、索引和计数器的概念,解释了如何插入字符串、搜索完整单词以及检查前缀。Trie树在存储大量词汇时能快速进行前缀匹配。
摘要由CSDN通过智能技术生成

Tire 树存储的结构 

 关于大佬对字典树的解读:【数据结构】字典树TrieTree图文详解

个人想法:

字典树首先需要足够大的空间,是采用空间换时间的一种数据结构。

1. idx :想法优点类似单链表中next指针,通过将p = tire[p][c_temp],可以不断寻找下一个地方。其中tire[p][c_temp]就是不断的存储当时插入字符串时的idx,正是通过idx每个字符才有了自己的地址。

2. tire[N][26] :每个节点下面都有26个子节点,其中tire[p][c_temp] 就是p类似指针,不断的更新,查找到p下面的元素

3.cnt[p]:  cnt[p]是代表p指针下有没有完整的字符串。如果为0说明,没有输入恰好到此的字符串。  cnt[p]不一定只为0或1,因为有可能多次输入了同一个单词.

4.p 核心就在于p的一直变换,可以看作为一个指针,不断指向下一个寻址的地址。

208. 实现 Trie (前缀树) - 力扣(LeetCode)

class Trie {
public:
    int tire[60000][26]={0},cnt[60000]={0},idx; 
    Trie() {
        idx=0;
    }
    
    void insert(string word) {
        int p = 0;
        for(int i =0;i<word.size();i++){
            int c_temp = word[i]-'a';
            if(tire[p][c_temp]==0){
                tire[p][c_temp] = ++idx;
            }
            p = tire[p][c_temp];
        }
        cnt[p]++;
    }
    
    bool search(string word) {
        int p=0;
        for(int i =0;i<word.size();i++){
            int c_temp = word[i]-'a';
            if(tire[p][c_temp]==0){return false;}
            p = tire[p][c_temp];
        }
        return cnt[p];
    }
    
    bool startsWith(string prefix) {
        int p = 0;
        for(int i =0;i<prefix.size();i++){
            int c_temp = prefix[i]-'a';
            if(tire[p][c_temp]==0){return false;}
            p = tire[p][c_temp];
        }
        return true;
    }
};

/**
 * Your Trie object will be instantiated and called as such:
 * Trie* obj = new Trie();
 * obj->insert(word);
 * bool param_2 = obj->search(word);
 * bool param_3 = obj->startsWith(prefix);
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋进在AI路上的小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值