字符串处理【字典树】 - 原理 字典树详解
字符串处理【字典树】 - 原理 字典树详解
字典树,又称Trie树、单词查找树,是一种树形结构,也是哈希树的一种变种,主要用于统计、排序和存储大量的字符串(但不限于字符串),所以经常被搜索引擎系统用于文本词频统计。
它的优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
字典树是用于字符串快速检索的多叉树,每个节点都包含多个字符指针,将从根节点到某一节点路径上经过的字符连接起来,为该节点对应的字符串。
例如,bee是一个单词,beer也是一个单词,此时可以在每个单词结束的位置都加一个end[]标记,表示从根到这里有一个单词。
字典树的基本操作: 创建、查找、插入和删除,极少出现删除操作。
【1】字典树的创建
字典树的创建指将所有字符串都插入字典树中。插入操作指将一个字符串插入字典树中。
字典树可以采用数组或链表存储,这里采用数组存储来实现静态链表。
[举个栗子]
字符串是由小写字母组成的,每个节点都包含26个域(26个字母)。
① 插入一个单词s(bike),首先将字符转换为数字,s[0]-‘a’=1,判断trie[1][1]为0,令trie[1][1]=2,相当于创建一个新的节点(下标为2)。
② s[1]-‘a’=8,判断trie[2][8]为0,令trie[2][8]=3。
③ s[2]-‘a’=10,判断trie[3][10]为0,令trie[3][10]=4。
④ s[3]-‘a’=4,判断trie[4][4]为0,令trie[4][4]=5,end[5]=true,标记单词结束。
⑤ 接着插入一个单词s(bin),首先将字符转换为数字,s[0]-‘a’=1,判断trie[1][1]=2,不为0,令p =2,沿第2个节点继续插入。
⑥ s[1]-‘a’=8,判断trie[2][8]=3,令p =3,沿第3个节点继续插入。
⑦ s[2]-‘a’=13,判断trie[3][13]为0,令trie[3][13]=6,end[6]=true。
⑧ 接着插入一个单词s(yes),首先将字符转换为数字,s[0]-‘a’=24,判断trie[1][24]为0,令trie[1][24]=7。
⑨ 继续插入s(yes)的后两个字符,end[9]=true,标记单词结束。
[算法代码]
void insert(string s){ // 将字符串s 插入字典树中int len = s.length() , p = 1;for(int i = 0 ; i < len ; i ++){int ch = s[i] - 'a'; //转换为数字if(!trie[p][ch]){trie[p][ch] = ++ tot; //记录下标}p = trie[p][ch];}end[p] = true; // 标记单词结束
}
[算法分析]
若单词的总长度为N ,字符的种类为k ,插入的字符串长度为n ,则创建Trie的复杂度为O (N ),空间复杂度为O (Nk ),插入字符串的时间复杂度均为O (n )。
【2】字典树的查找
若在字典树中查找该字符串是否存在,则和插入操作一样,首先将字符转换为数字,在字典树中查找,若查找的位置为0,则说明不存在,否则继续向下查找;在字符串处理完毕后,判断此处是否有单词结束标记,若有,则说明该字符串存在。
[ 举个栗子]
在字典树中查找单词s(bin)。
① 将字符转换为数字,s[0]-‘a’=1,判断trie[1][1],若为0,则查找失败;trie[1][1]=2,不为0,则令p =2,在第2个节点继续查找。
② s[1]-‘a’=8,判断trie[2][8],若为0,则查找失败;trie[2][8]=3,不为0,则令p =3,在第3个节点继续查找。
③ s[2]-‘a’=13,判断trie[3][13],若为0,则查找失败;trie[3][13]=6,不为0,则令p =6,在第6个节点继续查找。
此时字符串处理完毕,看6号节点是否有单词结束标记,若end[6]为真,则返回查找成功,否则返回查找失败。
[算法代码]
bool search(string s){ //在字典树中查找该字符串是否存在int len = s.length() , p = 1;for(int i = 0 ; i < len ; i ++){p = trie[p][s[i] - 'a'];if(!p){return false;}}return end[p];
}
[算法分析]
在字典树中查找一个关键字的时间与树中包含的节点数无关,只与关键字的字符数有关。若查找的字符串长度为n ,则查找的时间复杂度均为O (n )。
【3】字典树的应用
① 字符串检索。事先将已知的一些字符串(字典)的有关信息存储到Trie树里,查找一些字符串是否出现过、出现的频率和搜索引擎的热门查询。
② 前缀统计。统计一个串所有前缀单词的个数,只需统计从根到叶子路径上单词出现的个数,也可以判断一个单词是否为另一个单词的前缀。
③ 最长公共前缀。Trie树利用多个字符串的公共前缀来节省存储空间,反之,当把大量字符串都存储到一棵Trie树上时,可以快速得到某些字符串的公共前缀。对所有字符串都建立字典树,两个串的最长公共前缀的长度就是它们所在节点最近公共祖先的长度,于是转变为最近公共祖先问题。
④ 排序。利用字典树进行串排序。例如,给定N 个互不相同的仅由一个单词构成的英文名,将它们按字典序从小到大输出。采用数组方式创建字典树,这棵树每个节点的所有子节点都按照其字母大小排序。对字典树进行先序遍历,输出的相应字符串便是按字典序排序的结果。
⑤ 作为其他数据结构与算法的辅助结构,例如后缀树、AC自动机等。
字符串处理【字典树】 - 原理 字典树详解相关推荐
- 字符串处理【AC自动机】 - 原理 AC自动机详解
字符串处理[AC自动机] - 原理 AC自动机详解 AC自动机(Aho-Corasick automaton)在1975年产生于贝尔实验室,是著名的多模匹配算法. 学习AC自动机,要有KMP和Trie ...
- python字符串strip的作用_Python字符串函数strip()原理及用法详解
Python字符串函数strip()原理及用法详解 strip:用于移除字符串头尾指定的字符(默认为空格)或字符序列.注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符. 语法:str.s ...
- python读取json格式文件大量数据,以及python字典和列表嵌套用法详解
1.Python读取JSON报错:JSONDecodeError:Extra data:line 2 column 1 错误原因: JSON数据中数据存在多行,在读取数据时,不能够单单用open(), ...
- 托福字典:progressively托福考试详解
progressively是什么意思?progressively这个托福词汇在托福考试TPO中考题出现在了OG和TPO44当中,是什么意思呢?本文美联出国考试小编给大家整理了托福字典:progress ...
- DeepLearning tutorial(1)Softmax回归原理简介+代码详解
FROM: http://blog.csdn.net/u012162613/article/details/43157801 DeepLearning tutorial(1)Softmax回归原理简介 ...
- DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解
FROM:http://blog.csdn.net/u012162613/article/details/43221829 @author:wepon @blog:http://blog.csdn.n ...
- 【数据结构与算法】哈希算法的原理和应用详解!
在程序员的实际开发中,哈希算法常常能用得到,本文以哈希算法的原理和应用为核心,和大家详细讲解一下哈希算法的概念.常见算法以及原理.在信息安全的应用等等. 一.概念 哈希表就是一种以 键-值(key-i ...
- python的编程模式-Python设计模式之状态模式原理与用法详解
本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...
- Spark SQL原理及常用方法详解(二)
Spark SQL 一.Spark SQL基础知识 1.Spark SQL简介 (1)简单介绍 (2)Datasets & DataFrames (3)Spark SQL架构 (4)Spark ...
- Android Lint 原理及使用详解
Android Lint 原理及使用详解 Android Lint 是 ADT 16中引入的新工具,用于扫描 Android 项目源中的潜在错误. Lint 是 Android 提供的一个强大的,用于 ...
最新文章
- 伪激光雷达:无人驾驶的立体视觉
- oracle右对齐,Oracle 学习笔记(基础)
- 【转】Android编码规范建议18条
- MATLAB观察系统响应,基于MATLAB的系统的时域响应分析精选.doc
- Lucene.net站内搜索—5、搜索引擎第一版实现
- java https soap,Java Https Soap Server(Tomcat-Axis2)
- 计算机工程说课稿,人教版数学说课稿集合五篇
- SAP License:SAP增强应用实例
- Hive找出所有科目成绩都大于某一学科平均成绩的学生
- 使用Titan Framework搭建一个集群Demo
- android6自定义锁屏,Android编程之自定义锁屏实例分析
- 基于tp5的免费开源企业官网系统
- 单片机c语言基础知识,c语言必背100代码有哪些?
- 深度学习网络结构大全
- Android:ping
- 南京师范大学计算机专业考研分数,南京师范大学2021考研分数线已公布
- Best Time to Buy and Sell Stock III
- opencv手写数字识别(未完待续...)
- 实战中收藏已久的Linux命令
- 为什么ppt图形卡配置不正确_PPT:PowerPoint 检测到您的图形卡配置不正确,可能无法获得最佳幻灯片放映体验...
热门文章
- 钢琴软件c语言源代码,源代码.c · lijialong1313/C语言钢琴 - Gitee.com
- 高德地图组件在Android的应用以及Android与JavaScript的交互(一)
- 2、DSP TMS320F28335介绍
- 百度商桥是否需要升级
- 花开花落,终只能一个人欣赏。伤感文字分享。
- 2012年2月上旬我国网络不良与垃圾信息分析报告
- 股份与期权的分配示例
- 目标检测算法——车辆牌照识别数据集汇总 2(附下载链接)
- 多平台发布文章用什么软件?
- GitHub 发生重大改变!国内网友:Yellow居然不限制,瞧不起我?