trie树
This commit is contained in:
+44
-43
@@ -10,7 +10,7 @@
|
||||
4. 没有键值相等的节点
|
||||
|
||||
|
||||
typedef int ElemType;
|
||||
```typedef int ElemType;
|
||||
typedef struct BiSearchTree{
|
||||
ElemType key;
|
||||
struct BiSearchTree *lChild;
|
||||
@@ -19,19 +19,19 @@
|
||||
BiSearchTree *bisearch_tree_insert(BiSearchTree *tree,ElemType node);
|
||||
int bisearch_tree_delete(BiSearchTree **tree,ElemType node);
|
||||
int bisearch_tree_search(BiSearchTree *tree,ElemType node);
|
||||
|
||||
```
|
||||
|
||||
|
||||
删除节点,需要重建排序树
|
||||
|
||||
1) 删除节点是叶子节点(分支为0),结构不破坏
|
||||
2)删除节点只有一个分支(分支为1),结构也不破坏
|
||||
3)删除节点有2个分支,此时删除节点
|
||||
1) 删除节点是叶子节点(分支为0),结构不破坏
|
||||
2)删除节点只有一个分支(分支为1),结构也不破坏
|
||||
3)删除节点有2个分支,此时删除节点
|
||||
|
||||
思路一: 选左子树的最大节点,或右子树最小节点替换
|
||||
思路一: 选左子树的最大节点,或右子树最小节点替换
|
||||
|
||||
|
||||
|
||||
|
||||
int bisearch_tree_delete(BiSearchTree **tree,ElemType node){
|
||||
|
||||
if (NULL==tree) {
|
||||
@@ -166,9 +166,10 @@ trie,又称为前缀树或字典树,是一种有序树,用于保存关联
|
||||
|
||||
最简单实现 ---- 26个字母表 a-z (没有考虑数字,大小写,其他字符)
|
||||
|
||||
子树用数组存储,浪费空间;如果系统中存在大量字符串,且这些字符串基本没有公共前缀,trie树将消耗大量内存
|
||||
如果用链表存储,查询时需要遍历链表,查询效率有所降低
|
||||
子树用数组存储,浪费空间;如果系统中存在大量字符串,且这些字符串基本没有公共前缀,trie树将消耗大量内存
|
||||
如果用链表存储,查询时需要遍历链表,查询效率有所降低
|
||||
|
||||
```
|
||||
define ALPHABET_NUM 26
|
||||
typedef struct Node{
|
||||
char value;
|
||||
@@ -179,59 +180,59 @@ int Trie_insert(Trie *trie,char *word); // 插入一个单词
|
||||
int Trie_search(Trie *trie,char *word);// 查找一个单词
|
||||
int Trie_delete(Trie *trie,char *word);// 删除一个单词
|
||||
|
||||
```
|
||||
|
||||
trie树的增加和删除都比较麻烦,但索引本身就是写少读多,是否考虑添加删除的复杂度上升,依靠具体场景决定
|
||||
trie树的增加和删除都比较麻烦,但索引本身就是写少读多,是否考虑添加删除的复杂度上升,依靠具体场景决定
|
||||
|
||||
|
||||
|
||||
|
||||
DATrie libdatrie 双数组可以减少内存的使用量
|
||||
double-array trie
|
||||
参考作者的这篇论文 http://linux.thai.net/~thep/datrie/datrie.html
|
||||
|
||||
DATrie libdatrie 双数组可以减少内存的使用量
|
||||
double-array trie 参考作者的这篇论文 http://linux.thai.net/~thep/datrie/datrie.html
|
||||
|
||||
|
||||
|
||||
### trie 问题
|
||||
|
||||
它的优点是:
|
||||
节省空间:利用字符串的公共前缀来节约存储空间
|
||||
最大限度地减少无谓的字符串比较
|
||||
它的优点是:
|
||||
节省空间:利用字符串的公共前缀来节约存储空间
|
||||
最大限度地减少无谓的字符串比较
|
||||
|
||||
|
||||
中文支持
|
||||
|
||||
查询效率比hash table 更优??
|
||||
中文支持
|
||||
|
||||
查询效率比hash table 更优??
|
||||
|
||||
|
||||
### trie应用
|
||||
|
||||
典型应用是:前缀查询 , 字符串查询,排序
|
||||
|
||||
用于统计,排序和保存大量的字符串(但不仅限于字符串)
|
||||
经常被搜索引擎系统用于文本词频统计
|
||||
排序大量字符串
|
||||
用于索引结构
|
||||
敏感词过滤
|
||||
|
||||
实际应用问题:
|
||||
给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位置
|
||||
分析:
|
||||
思路一:trie树 ,找到这个字符串查询操作就可以了,如何知道出现的第一个位置呢?我们可以在trie树中加一个字段来记录当前字符串第一次出现的位置。
|
||||
|
||||
典型应用是:前缀查询 , 字符串查询,排序
|
||||
|
||||
用于统计,排序和保存大量的字符串(但不仅限于字符串)
|
||||
经常被搜索引擎系统用于文本词频统计
|
||||
排序大量字符串
|
||||
用于索引结构
|
||||
敏感词过滤
|
||||
|
||||
实际应用问题:
|
||||
给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位置
|
||||
分析:
|
||||
思路一:trie树 ,找到这个字符串查询操作就可以了,如何知道出现的第一个位置呢?我们可以在trie树中加一个字段来记录当前字符串第一次出现的位置。
|
||||
|
||||
|
||||
已知n个由小写字母构成的平均长度为10的单词,判断其中是否存在某个串为另一个串的前缀子串
|
||||
分析:
|
||||
|
||||
给出N 个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
|
||||
分析:trie树查询单词的应用。先建立N个熟词的前缀树,然后按文章的单词一次查询。
|
||||
|
||||
分析:
|
||||
|
||||
给出N 个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
|
||||
分析:trie树查询单词的应用。先建立N个熟词的前缀树,然后按文章的单词一次查询。
|
||||
|
||||
给出一个词典,其中的单词为不良单词。单词均为小写字母。再给出一段文本,文本的每一行也由小写字母构成。判断文本中是否含有任何不良单词。例如,若rob是不良单词,那么文本problem含有不良单词。
|
||||
分析:先用不良单词建立trie树,然后过滤文本(每个单词都在trie树上查询,查询的复杂度O(1),效率非常高),这正是`敏感词过滤系统(或垃圾评论系统)`的原理。
|
||||
|
||||
分析:先用不良单词建立trie树,然后过滤文本(每个单词都在trie树上查询,查询的复杂度O(1),效率非常高),这正是`敏感词过滤系统(或垃圾评论系统)`的原理。
|
||||
|
||||
|
||||
给你N 个互不相同的仅由一个单词构成的英文名,让你将它们按字典序从小到大排序输出
|
||||
分析:这是trie树排序的典型应用,建立N个单词的trie树,然后线序遍历整个树,就可以达到效果。
|
||||
|
||||
分析:这是trie树排序的典型应用,建立N个单词的trie树,然后线序遍历整个树,就可以达到效果。
|
||||
|
||||
|
||||
## 后缀树(suffix tree)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user