更新二叉树readme.md排版
This commit is contained in:
+15
-15
@@ -2,7 +2,7 @@
|
||||
|
||||
## 二叉查找树
|
||||
|
||||
二叉查找树(Binary search tree),也叫有序二叉树(Ordered binary tree),排序二叉树(Sorted binary tree)。是指一个空树或者具有下列性质的二叉树:
|
||||
二叉查找树(Binary search tree),也叫`有序二叉树(Ordered binary tree)`,`排序二叉树(Sorted binary tree)`。是指一个空树或者具有下列性质的二叉树:
|
||||
|
||||
1. 若任意节点的左子树不为空,则左子树上所有的节点值小于它的根节点值
|
||||
2. 若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值
|
||||
@@ -111,9 +111,9 @@ int bisearch_tree_delete(BiSearchTree **tree,ElemType node){
|
||||
|
||||
## 伸展树 (splay tree)
|
||||
|
||||
是一种自平衡的二叉排序树。为什么需要这些自平衡的二叉排序树?
|
||||
伸展树是一种自平衡的二叉排序树。为什么需要这些自平衡的二叉排序树?
|
||||
|
||||
n个节点的完全二叉树,其查找,删除的复杂度都是O(logN),但是如果频繁的插入删除,导致二叉树退化成一个n个节点的单链表,也就是插入,查找复杂度趋于O(N),为了克服这个缺点,出现了很多二叉查找树的变形,如AVL树,红黑树,以及接下来介绍的 伸展树(splay tree)
|
||||
n个节点的完全二叉树,其查找,删除的复杂度都是O(logN),但是如果频繁的插入删除,导致二叉树退化成一个n个节点的单链表,也就是`插入,查找复杂度趋于O(N)`,为了克服这个缺点,出现了很多二叉查找树的变形,如AVL树,红黑树,以及接下来介绍的 伸展树(splay tree)。
|
||||
|
||||
|
||||
|
||||
@@ -135,20 +135,22 @@ huffman编码:
|
||||
|
||||
###存储结构和基本操作
|
||||
|
||||
```
|
||||
struct node{
|
||||
char *huffCode; // 叶子节点的huff编码
|
||||
int weight;
|
||||
struct node *left,right;
|
||||
}
|
||||
```
|
||||
|
||||
*构建赫夫曼树*
|
||||
###构建赫夫曼树
|
||||
|
||||
原则:出现频率越多的会在越上层,编码也越短,出现频率越少的在越下层,编码也越长。
|
||||
不存在某一个编码是另一个编码的前缀,字符都在叶节点上,所以不会存在一个编码是另一个编码的前缀
|
||||
二叉树每个节点要么是叶子节点,要么是双分支节点(且左分支编码为0,右分支编码为1)
|
||||
|
||||
|
||||
*压缩*
|
||||
###压缩
|
||||
|
||||
1. 扫描输入文件,统计各个字符出现的次数,对结构排序 (hash统计每个字符出现的次数)
|
||||
2. 根据排序结构,构建赫夫曼树 (贪心策略,每次选频率值最低的2个节点合并,需要优先队列帮组(priority queue,又叫最小堆))
|
||||
@@ -159,7 +161,7 @@ struct node{
|
||||
被编码的文本长度 unsigned int size
|
||||
字符频率表 unsigned char freqs[NUM_CHARS]
|
||||
|
||||
*解压缩*
|
||||
###解压缩
|
||||
|
||||
1. 读取文件头
|
||||
2. 遍历编码后的bits,从赫夫曼树的根节点出发,遇到0,进入左子树,遇到1进入右子树,直到叶节点
|
||||
@@ -230,23 +232,21 @@ double-array trie 参考作者的这篇论文 http://linux.thai.net/~thep/datri
|
||||
用于索引结构
|
||||
敏感词过滤
|
||||
|
||||
实际应用问题:
|
||||
给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位置
|
||||
分析:
|
||||
思路一:trie树 ,找到这个字符串查询操作就可以了,如何知道出现的第一个位置呢?我们可以在trie树中加一个字段来记录当前字符串第一次出现的位置。
|
||||
### 实际应用问题
|
||||
1. 给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位置
|
||||
分析思路一:trie树 ,找到这个字符串查询操作就可以了,如何知道出现的第一个位置呢?我们可以在trie树中加一个字段来记录当前字符串第一次出现的位置。
|
||||
|
||||
|
||||
已知n个由小写字母构成的平均长度为10的单词,判断其中是否存在某个串为另一个串的前缀子串
|
||||
2. 已知n个由小写字母构成的平均长度为10的单词,判断其中是否存在某个串为另一个串的前缀子串
|
||||
分析:
|
||||
|
||||
给出N 个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
|
||||
3. 给出N 个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
|
||||
分析:trie树查询单词的应用。先建立N个熟词的前缀树,然后按文章的单词一次查询。
|
||||
|
||||
给出一个词典,其中的单词为不良单词。单词均为小写字母。再给出一段文本,文本的每一行也由小写字母构成。判断文本中是否含有任何不良单词。例如,若rob是不良单词,那么文本problem含有不良单词。
|
||||
4. 给出一个词典,其中的单词为不良单词。单词均为小写字母。再给出一段文本,文本的每一行也由小写字母构成。判断文本中是否含有任何不良单词。例如,若rob是不良单词,那么文本problem含有不良单词。
|
||||
分析:先用不良单词建立trie树,然后过滤文本(每个单词都在trie树上查询,查询的复杂度O(1),效率非常高),这正是`敏感词过滤系统(或垃圾评论系统)`的原理。
|
||||
|
||||
|
||||
给你N 个互不相同的仅由一个单词构成的英文名,让你将它们按字典序从小到大排序输出
|
||||
5. 给你N 个互不相同的仅由一个单词构成的英文名,让你将它们按字典序从小到大排序输出
|
||||
分析:这是trie树排序的典型应用,建立N个单词的trie树,然后线序遍历整个树,就可以达到效果。
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user