字典树

字典树(Trie),又叫前缀树,是一种有序,用于保存关联数组其中的键通常是字符串。Trie键由结点在树中的位置决定。每个结点的所有子孙都有相同的前缀,即该节点对应的字符串,根结点对应空字符串。一般情况下,并不是所有的结点都有对应的值,只有叶子节点和部分内部结点所对应的键才有相关的值。

如果我们有and,as,at,cn,com这些单词,对应的trie如下:


Trie使用范围

(1)词频统计。

trie树可以用来压缩空间,因为公共前缀都用一个节点保存。

(2)前缀匹配。

拿上图为例,如果想获取所有以‘a’开头的字符串,从图中可以很明显地看出是and,as,at。如果用最朴素的方法,时间复杂度将会是O(n^2)。Trie树的时间复杂度为O(h),其中为h为检索单词的长度。

定义

字母共计26个,因此构建的trie树是一个26叉树结构,每个结点包含26个子节点。

// Trie树节点定义
struct TrieNode {
        TrieNode *child[26];
        string str;
        TrieNode() : str("") {
            for (auto &a : child) a = NULL;
        }
    };

//Trie定义
struct Trie {
        TrieNode *root;
        Trie() : root(new TrieNode()) {}
        void insert(string s) {
            TrieNode *p = root;
            for (auto &a : s) {
                int i = a - 'a';
                if (!p->child[i]) p->child[i] = new TrieNode();
                p = p->child[i];
            }
            p->str = s;
        }
    };


参考:

[1] http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html

[2] https://zh.wikipedia.org/wiki/Trie

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值