前缀树数据结构及构造算法一览

前缀树,也叫字典树,是一种树形结构,是哈希树的变形。典型应用用于统计和排序大量的字符串,当然不仅限于字符串,常用于文本词频的统计。

它的优点是:利用字符串的公共前缀来减少查询时间,最大限度的减少无谓的字符串比较。

Trie树的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销,以达到提高效率的目的、

前缀树的3个基本性质:

1.结点上不含有字符,字符视为都在传递路径上。

2.从根结点到某一个结点,路径上经过的字符连接起来,为该节点对应的字符串。

3.相同的字符串有且只有一个路径。

TrieNode结点:

class TrieNode
{
public:
    TrieNode()
    {
        pass=0;end=0;children.resize(26);
    }
    int pass;//表示以该字符为前缀的字符串数量
    int end;//以当前字符结尾的字符串数量
    vector<TrieNode*> children;//子节点
};

前缀树的构建

class Trie {
public:
    TrieNode* root;
    Trie() {
        root=new TrieNode();
    }
    
    void insert(string word) {
        TrieNode* node=root;//获得根节点
        int index=0;//建立字符索引号
        node->pass++;//当前结点pass值++;
        for(int i=0;i<word.length();++i)
        {
            index=word[i]-'a';//拿到字符索引
            if(node->children[index]==nullptr)//如果说该索引下无节点,那么就创建它
                node->children[index]=new TrieNode();
            node=node->children[index];//结点运动到子节点位置
            (node->pass)++;//结点的pass值++
        }
        (node->end)++;//最终的结点的end值++;
    }
    //搜索字符串是否存在
    bool search(string word) {
        TrieNode* node=root;//获得根节点
        int index=0;//建立字符索引号
        for(int i=0;i<word.length();++i)
        {
            index=word[i]-'a';
            if(node->children[index]==nullptr)//如果发现某个字符索引下无节点,
//那太好了,直接false
                return false;
            node=node->children[index];//跟下去
        }
        if(node->end!=0)//跳出循环一定是字符串循环完了,就看下当前结点的end值是否为0,
//为0,说明没有字符串以该字符结尾,返回false
            return true;
        else
            return false;
    }
    
    //查找某字符串是否存在或者是否为前缀字符串
    bool startsWith(string prefix) {
        TrieNode* node=root;//获得根节点
        int index=0;//建立字符索引号
        for(int i=0;i<prefix.length();++i)
        {
            index=prefix[i]-'a';
            if(node->children[index]==nullptr)
                return false;
            node=node->children[index];
        }
            return true;
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值