forked from SummerGift/DataStructure
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
5a490fb
commit 7b2a568
Showing
1 changed file
with
148 additions
and
140 deletions.
There are no files selected for viewing
288 changes: 148 additions & 140 deletions
288
eclipse/DataStructuresCode/src/05_9_Huffman_Codes.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,140 +1,148 @@ | ||
/* | ||
* 05_9_Huffman_Codes.cpp | ||
* | ||
* Created on: 2018年5月27日 | ||
* Author: SummerGift | ||
*/ | ||
/* | ||
05-树9 Huffman Codes(30 分) | ||
In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redundancy Codes", | ||
and hence printed his name in the history of computer science. | ||
As a professor who gives the final exam problem on Huffman codes, | ||
I am encountering a big problem: the Huffman codes are NOT unique. | ||
For example, given a string "aaaxuaxz", we can observe that the frequencies of the characters 'a', 'x', 'u' and 'z' are 4, 2, 1 and 1, | ||
respectively. We may either encode the symbols as {'a'=0, 'x'=10, 'u'=110, 'z'=111}, or in another way as {'a'=1, 'x'=01, 'u'=001, 'z'=000}, | ||
both compress the string into 14 bits. | ||
Another set of code can be given as {'a'=0, 'x'=11, 'u'=100, 'z'=101}, | ||
but {'a'=0, 'x'=01, 'u'=011, 'z'=001}is NOT correct since "aaaxuaxz" and "aazuaxax" can both be decoded from the code 00001011001001. | ||
The students are submitting all kinds of codes, and I need a computer program to help me determine which ones are correct and which ones are not. | ||
Input Specification: | ||
Each input file contains one test case. For each case, | ||
the first line gives an integer N (2≤N≤63), then followed by a line that contains all the N distinct characters and their frequencies in the following format: | ||
c[1] f[1] c[2] f[2] ... c[N] f[N] | ||
where c[i] is a character chosen from {'0' - '9', 'a' - 'z', 'A' - 'Z', '_'}, | ||
and f[i] is the frequency of c[i] and is an integer no more than 1000. | ||
The next line gives a positive integer M (≤1000), then followed by M student submissions. | ||
Each student submission consists of N lines, each in the format: | ||
c[i] code[i] | ||
where c[i] is the i-th character and code[i] is an non-empty string of no more than 63 '0's and '1's. | ||
Output Specification: | ||
For each test case, print in each line either "Yes" if the student's submission is correct, or "No" if not. | ||
Note: The optimal solution is not necessarily generated by Huffman algorithm. | ||
Any prefix code with code length being optimal is considered correct. | ||
Sample Input: | ||
7 | ||
A 1 B 1 C 1 D 3 E 3 F 6 G 6 | ||
4 | ||
A 00000 | ||
B 00001 | ||
C 0001 | ||
D 001 | ||
E 01 | ||
F 10 | ||
G 11 | ||
A 01010 | ||
B 01011 | ||
C 0100 | ||
D 011 | ||
E 10 | ||
F 11 | ||
G 00 | ||
A 000 | ||
B 001 | ||
C 010 | ||
D 011 | ||
E 100 | ||
F 101 | ||
G 110 | ||
A 00000 | ||
B 00001 | ||
C 0001 | ||
D 001 | ||
E 00 | ||
F 10 | ||
G 11 | ||
Sample Output: | ||
Yes | ||
Yes | ||
No | ||
No | ||
这道题的意思是给出一组字符和出现的频率,让我们构造他们的哈夫曼编码。 | ||
由于哈夫曼编码不唯一,所以编码方式有多种。然后有M个同学给出了他们的编码方式, | ||
让我们判断他们的编码是否正确。正确输出Yes,错误输出No | ||
问题可以分成两部分: | ||
1.构造N个字符的哈夫曼编码,计算带权路径长度WPL,判断每个同学的编码带权路径长度是否 | ||
等于之前计算出来的WPL. | ||
2.判断是否有某一个字符的编码是另一个字符的前缀码。 | ||
*/ | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <unistd.h> | ||
#include <string.h> | ||
|
||
#define MAX_N 64 | ||
#define YES 1 | ||
#define NO 0 | ||
#define MIN_DATA -1 | ||
#define QUEUE_SIZE 100 | ||
|
||
struct tree_node { | ||
int weight; | ||
struct tree_node* left, right; | ||
}; | ||
typedef struct tree_node *tree_node_t; | ||
|
||
//构建最小堆 | ||
struct heap_struct { | ||
tree_node_t data; | ||
int size; | ||
int capacity; | ||
}; | ||
typedef struct heap_struct *min_heap_t; | ||
|
||
struct queue_node { | ||
tree_node_t data[QUEUE_SIZE]; | ||
int rear; | ||
int front; | ||
}; | ||
typedef struct queue_node *queue_node_t; | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/* | ||
* 05_9_Huffman_Codes.cpp | ||
* | ||
* Created on: 2018年5月27日 | ||
* Author: SummerGift | ||
*/ | ||
/* | ||
05-树9 Huffman Codes(30 分) | ||
In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redundancy Codes", | ||
and hence printed his name in the history of computer science. | ||
As a professor who gives the final exam problem on Huffman codes, | ||
I am encountering a big problem: the Huffman codes are NOT unique. | ||
For example, given a string "aaaxuaxz", we can observe that the frequencies of the characters 'a', 'x', 'u' and 'z' are 4, 2, 1 and 1, | ||
respectively. We may either encode the symbols as {'a'=0, 'x'=10, 'u'=110, 'z'=111}, or in another way as {'a'=1, 'x'=01, 'u'=001, 'z'=000}, | ||
both compress the string into 14 bits. | ||
Another set of code can be given as {'a'=0, 'x'=11, 'u'=100, 'z'=101}, | ||
but {'a'=0, 'x'=01, 'u'=011, 'z'=001}is NOT correct since "aaaxuaxz" and "aazuaxax" can both be decoded from the code 00001011001001. | ||
The students are submitting all kinds of codes, and I need a computer program to help me determine which ones are correct and which ones are not. | ||
Input Specification: | ||
Each input file contains one test case. For each case, | ||
the first line gives an integer N (2≤N≤63), then followed by a line that contains all the N distinct characters and their frequencies in the following format: | ||
c[1] f[1] c[2] f[2] ... c[N] f[N] | ||
where c[i] is a character chosen from {'0' - '9', 'a' - 'z', 'A' - 'Z', '_'}, | ||
and f[i] is the frequency of c[i] and is an integer no more than 1000. | ||
The next line gives a positive integer M (≤1000), then followed by M student submissions. | ||
Each student submission consists of N lines, each in the format: | ||
c[i] code[i] | ||
where c[i] is the i-th character and code[i] is an non-empty string of no more than 63 '0's and '1's. | ||
Output Specification: | ||
For each test case, print in each line either "Yes" if the student's submission is correct, or "No" if not. | ||
Note: The optimal solution is not necessarily generated by Huffman algorithm. | ||
Any prefix code with code length being optimal is considered correct. | ||
Sample Input: | ||
7 | ||
A 1 B 1 C 1 D 3 E 3 F 6 G 6 | ||
4 | ||
A 00000 | ||
B 00001 | ||
C 0001 | ||
D 001 | ||
E 01 | ||
F 10 | ||
G 11 | ||
A 01010 | ||
B 01011 | ||
C 0100 | ||
D 011 | ||
E 10 | ||
F 11 | ||
G 00 | ||
A 000 | ||
B 001 | ||
C 010 | ||
D 011 | ||
E 100 | ||
F 101 | ||
G 110 | ||
A 00000 | ||
B 00001 | ||
C 0001 | ||
D 001 | ||
E 00 | ||
F 10 | ||
G 11 | ||
Sample Output: | ||
Yes | ||
Yes | ||
No | ||
No | ||
这道题的意思是给出一组字符和出现的频率,让我们构造他们的哈夫曼编码。 | ||
由于哈夫曼编码不唯一,所以编码方式有多种。然后有M个同学给出了他们的编码方式, | ||
让我们判断他们的编码是否正确。正确输出Yes,错误输出No | ||
问题可以分成两部分: | ||
1.构造N个字符的哈夫曼编码,计算带权路径长度WPL,判断每个同学的编码带权路径长度是否 | ||
等于之前计算出来的WPL. | ||
2.判断是否有某一个字符的编码是另一个字符的前缀码。 | ||
*/ | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <unistd.h> | ||
#include <string.h> | ||
|
||
#define MAX_N 64 | ||
#define YES 1 | ||
#define NO 0 | ||
#define MIN_DATA -1 | ||
#define QUEUE_SIZE 100 | ||
|
||
struct tree_node { | ||
int weight; | ||
struct tree_node* left, right; | ||
}; | ||
typedef struct tree_node *tree_node_t; | ||
|
||
//构建最小堆 | ||
struct heap_struct { | ||
tree_node_t data; | ||
int size; | ||
int capacity; | ||
}; | ||
typedef struct heap_struct *min_heap_t; | ||
|
||
struct queue_node { | ||
tree_node_t data[QUEUE_SIZE]; | ||
int rear; | ||
int front; | ||
}; | ||
typedef struct queue_node *queue_node_t; | ||
|
||
//创建最小堆 | ||
tree_node_t create_min_heap(int max_size) | ||
{ | ||
min_heap_t h = (min_heap_t)malloc(sizeof(struct heap_struct)); | ||
h->data = malloc(sizeof(struct tree_node)*(max_size + 1)); | ||
h->size = 0; | ||
h->capacity = max_size; | ||
h->data[0].weight = MIN_DATA; | ||
return h; | ||
} | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|