From 872290b14cded4a43cacb2f2db6a6a1be2d49444 Mon Sep 17 00:00:00 2001 From: nonstriater <410495266@qq.com> Date: Mon, 19 Oct 2015 10:56:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=8C=E5=8F=89=E6=A0=91re?= =?UTF-8?q?adme.md=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 二叉树/README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/二叉树/README.md b/二叉树/README.md index ddad6d0..990d2b3 100644 --- a/二叉树/README.md +++ b/二叉树/README.md @@ -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树,然后线序遍历整个树,就可以达到效果。