This commit is contained in:
nonstriater
2014-05-16 20:18:24 +08:00
parent da7877336c
commit 7fc950aa3b
+44 -43
View File
@@ -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)