zoukankan      html  css  js  c++  java
  • Trie字典树的学习及理解

    字典树详解见

    我这里学习时主要是看了李煜东的进阶指南里的讲解,以下是书中介绍的内容。

    Trie,又称字典树,是一种用于实现字符串快速检索的多叉树结构,Tire的每个节点都拥有若干个字符指针,若在插入或检索字符串时扫描到一个字符c,就沿着当前节点的c这个字符指针,走向该指针指向的节点。

    初始化时一颗空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。

    在Trie中,字符数据都体现在树的边(指针)上,树的节点仅保存一些额外的信息,例如单词结尾标记等。其空间复杂度为O(nc),其中n是节点个数,c是字符集的大小。

    代码实现:

     1 // 假设字符串由小写字母构成
     2 int trie[SIZE][26], tot = 1;
     3 
     4 // Trie的插入
     5 void insert(char* str) {
     6     int len = strlen(str), p = 1;
     7     for (int k = 0; k < len; k++) {
     8         int ch = str[k]-'a';
     9         if (trie[p][ch] == 0) trie[p][ch] = ++tot;
    10         p = trie[p][ch];
    11     }
    12     end[p] = true;
    13 }
    14 
    15 // Trie的检索
    16 bool search(char* str) {
    17     int len = strlen(str), p = 1;
    18     for (int k = 0; k < len; k++) {
    19         p = trie[p][str[k]-'a'];
    20         if (p == 0) return false;
    21     }
    22     return end[p];
    23 }
  • 相关阅读:
    Thread
    C# Iterations: IEnumerator, IEnumerable and Yield
    基于SharePoint 2010 创建一个简单的工作流
    利用with关键字实现数据查询的递归调用
    编写JQuery插件示例
    生成密码web小工具
    (转)关于SQL Server 中合并行的方法
    html5做的割绳子游戏
    SharePoint Foundation和SharePoint Server的区别
    如何实现基于AD的MOSS的FORM认证方式
  • 原文地址:https://www.cnblogs.com/five20/p/8516933.html
Copyright © 2011-2022 走看看