soapoison

浅谈字典树(Trie)

Trie (字典树) 是用于实现字符串快速检索的多叉树结构,每个节点都拥有若干字符指针,若在插入或检索字符串时扫描到字母 c ,就沿着当前节点的c字符指针,走向该指针指向的节点。
接下来将详细讨论 Trie 的基本操作过程

初始化

一颗空Trie仅包含一个根节点,该点字符指针均为空。

插入

当需要插入一个字符串 S 时,我们令一个指针 P 起初指向根节点。然后,依次扫描 S 种的每个字符 c。

  1. 若 P 的 c 字符指针指向一个已经存在的节点 Q,则令 P = Q。
  2. 若 P 的 c 字符指针指向空,则新建一个节点 Q,令 P 的 c 字符指针指向 Q。,然后令 P = Q

当 S 中的字符扫描完毕时,在当前节点 P 上标记它是一个字符串的末尾。

检索

当需要检索一个字符串 S 在 Trie 上是否存在时,我们令一个指针 P 起初指向根节点,然后依次扫描 S 中的每个字符 c。

  1. 若 P 的 c 字符指针指向空,则说明 S 没有被插入过 trie,结束检索。
  2. 若 P 的 c 字符指针指向一个已经存在的节点 Q,则令 P = Q。

当 S 中的字符扫描完毕时,若当前节点 P 被标记为一个字符串的末尾,则说明 S 在 Trie 中存在,否则说明 S 没有被插入过 Trie。

可以看出,字符数据都体现在树的边上,树的节点仅仅保存一些额外信息。其空间复杂度是 O(NC),其中 N 是节点个数,C 是字符集的大小。

int trie[SIZE][26], tot = 1; //初始化,假设字符串由小写字母构成
void insert(char* str) { //插入一个字符串
    int len = strlen(str), p = 1;
    for(int k = 0;k < len;k ++) {
        int ch = str[k] - 'a';
        if(trie[p][ch] == 0) trie[p][ch] = ++tot;
        p = trie[p][ch];
    }
    end[p] = true;
}
bool search(char* str) { //检索字符串是否存在
    int len = strlen(str), p = 1;
    for(int k = 0;k < len;k ++) {
        p = trie[p][str[k] - 'a'];
        if(p == 0) return false;
    }
    return end[p];
}

posted on 2025-03-16 15:12  soapoison  阅读(63)  评论(0)    收藏  举报

导航