Skip to content

Commit

Permalink
【添加】:哈夫曼树和哈夫曼编码基础知识
Browse files Browse the repository at this point in the history
  • Loading branch information
SummerGift committed May 27, 2018
1 parent 778c83b commit d692788
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 2 deletions.
17 changes: 16 additions & 1 deletion Lectures/Lecture-4.2-哈夫曼树与哈夫曼编码.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,19 @@

## 基础知识

- 链表是非常基本的数据结构,根据链的个数分为单链表、双链表,根据是否循环分为单向链表和循环链表。
- 标准的 ASCII 字符集由大约100个可打印字符组成。为了把这些字符区分开来,需要 log^100 = 7个比特。但是7个比特可以表示128个字符,因此ASCII字符还可以再加上一些其他的非打印字符。我们加上第8个比特位作为奇偶校验位。不过重要的问题在于,如果字符集的大小是C,那么在标准的编码中就需要 log^C 个比特。

- 在现实中,文件可能是相当大的,许多非常大的文件是某个程序的输出数据,而在使用频率最大和最小字符之间通常存在很大的差别。那么能否有一种更好的编码降低总的所需的比特数。

- 答案是肯定的,一种简单的策略可以使一般的大型文件节省25%,而使许多大型的数据文件节省多达 50%~60%。这种一般的策略就是让代码的长度从字符到字符是变化不等的,同时保证经常出现的字符其代码短。注意,如果所有的字符都以相同的,那么要节省空间是不可能的。

- 满树:所有的结点或者是树叶,或者是树叶,或者有两个儿子。一种最优的编码将总具有这个性质,否则具有一个儿子的结点可以向上移动一层。

- 如果字符都只放在树叶上,那么任何比特序列总能够被毫无歧义地译码。这些字符编码的长度是否不同并不要紧,只要没有字符代码是别的字符代码的前缀即可。这种编码叫做前缀码(character code)。相反,如果一个字符放在非树叶结点上,那就不再能够保证译码没有二义性。

- 所以基本问题在于找到总价值最小的满二叉树,其中所有的字符都位于树叶上。

## 哈夫曼算法

- 假设字符的个数为C,那么哈夫曼算法可以描述如下:算法对一个由树组成的森林进行。一棵树的权等于他的树叶的频率的和。任意选取最小权的两棵树 T1 和 T2 ,并任意形成以 T1 和 T2 为子树的新数,将这样的过程进行 C-1 次。在算法的开始,存在C棵单节点树——每个字符一棵。在算法结束时得到一棵树,这棵树就是最优哈夫曼树。

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ ___
- [x] [Lecture 3.4 - AVL树](./Lectures/Lecture-3.4-AVL树.md)
#### 第四章:优先队列(堆)
- [x] [Lecture 4.1 - 堆](./Lectures/Lecture-4.1-堆.md)
- [ ] [Lecture 4.2 - 哈夫曼树与哈夫曼编码](./Lectures/Lecture-4.2-哈夫曼树与哈夫曼编码.md)
- [x] [Lecture 4.2 - 哈夫曼树与哈夫曼编码](./Lectures/Lecture-4.2-哈夫曼树与哈夫曼编码.md)
- [ ] [Lecture 4.3 - 不相交集 ADT](./Lectures/Lecture-4.3-不相交集ADT.md)
#### 第五章:图论算法
#### 第六章:排序
Expand Down

0 comments on commit d692788

Please sign in to comment.