字典树详解见

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

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是字符集的大小。

代码实现:

 // 假设字符串由小写字母构成
int trie[SIZE][], tot = ; // Trie的插入
void insert(char* str) {
int len = strlen(str), p = ;
for (int k = ; k < len; k++) {
int ch = str[k]-'a';
if (trie[p][ch] == ) trie[p][ch] = ++tot;
p = trie[p][ch];
}
end[p] = true;
} // Trie的检索
bool search(char* str) {
int len = strlen(str), p = ;
for (int k = ; k < len; k++) {
p = trie[p][str[k]-'a'];
if (p == ) return false;
}
return end[p];
}

Trie字典树的学习及理解的更多相关文章

  1. 标准Trie字典树学习二:Java实现方式之一

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...

  2. 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  3. 算法导论:Trie字典树

    1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...

  4. C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  5. Trie字典树 动态内存

    Trie字典树 #include "stdio.h" #include "iostream" #include "malloc.h" #in ...

  6. 817E. Choosing The Commander trie字典树

    LINK 题意:现有3种操作 加入一个值,删除一个值,询问pi^x<k的个数 思路:很像以前lightoj上写过的01异或的字典树,用字典树维护数求异或值即可 /** @Date : 2017- ...

  7. 数据结构 -- Trie字典树

    简介 字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 性质:   1.  根节 ...

  8. 踹树(Trie 字典树)

    Trie 字典树 ~~ 比 KMP 简单多了,无脑子选手学不会KMP,不会结论题~~ 自己懒得造图了OI WIKI 真棒 字典树大概长这么个亚子 呕吼真棒 就是将读进去的字符串根据当前的字符是什么和所 ...

  9. 标准Trie字典树学习一:原理解析

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 字典树Trie学习一:原理解析 2.字典树Tr ...

随机推荐

  1. cocos2d-x3.7 cclabel文字破碎,异常,变乱

    效果图如下: 无论是按钮(control button),还是普通的label都有小概率出现这种情况. 该问题发现于cocos2d-x3.7 原因: 在3.x中使用ttfconfig创建的label, ...

  2. 强制删除无用old windows文件夹命令

    磁盘上有旧系统留下的目录比如old.windows.program files.users(中文目录是用户,删除命令里还是要用user才有效),因为目录的特殊设置,导致无法直接删除,需要修改属性和权限 ...

  3. Qt-QML-自定义个自己的文本Text

    好久都没有正经的更新自己的文章了,这段时间也辞职了,听了小爱的,准备买个碗,自己当老板,下面请欣赏效果图 这个界面布局就是自己是在想不到啥了,按照常规汽车导航的布局布局了一下,主要看内容哈,看看这个文 ...

  4. python3读取csv文件

    代码如下 import csv with open('D:\\abc\\userinfo.csv',newline='') as f: reader = csv.reader(f) for row i ...

  5. Appium-测试失败后屏幕截图的

    本文参考:http://www.cnblogs.com/hexianl/p/4958556.html 使用testng测试框架进行管理测试 1.创建监听,代码如下: import io.appium. ...

  6. leetcode-全排列详解(回溯算法)

     全排列     给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2 ...

  7. 一个简单的页面弹窗插件 jquery.pageMsgFrame.js

    页面弹窗是网站中常用的交互效果,它可以强提示网站的某些信息给用户,或者作用于某些信息的修改等等功能. 这几天在做一个项目的时候,就顺捎把这个插件写一下,栽棵树,自己乘凉吧. 原创博文,转载请注明出处: ...

  8. 日历(Calendar)模块

    #usr/bin/python3 #! -*-conding : utf-8 -*- #2018.3.14 """ 日历(Calendar)模块 此模块的函数都是日历相关 ...

  9. nodejs笔记--基础篇(一)

    Sublime Node.js开发环境配置 下载并安装Node.js安装包后再开始配置 1.先安装好Sublime Text 2 2.运行Sublime,菜单上找到Tools ---> Buil ...

  10. Linux下实现Rsync目录同步备份

    需求:对于开发机器做目录的数据备份 测试机IP:192.168.1.100   WEB目录:/bckup/ 下面我将用一台机器来备份上面测试机 /bckup下的所有数据,并实现时时同步 备份机器IP: ...