From 7fc950aa3b34e2e16dce3a6b689df0eaae0d5380 Mon Sep 17 00:00:00 2001 From: nonstriater <510495266@qq.com> Date: Fri, 16 May 2014 20:18:24 +0800 Subject: [PATCH] =?UTF-8?q?trie=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 二叉树/README.md | 87 ++++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/二叉树/README.md b/二叉树/README.md index 65b5222..880bce3 100644 --- a/二叉树/README.md +++ b/二叉树/README.md @@ -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)