给出26个英文字母的使用频度,并给出哈夫曼树
时间: 2023-07-19 15:29:30 浏览: 61
以下是26个英文字母的使用频度(根据英文文章统计):
E:12.7%
T:9.1%
A:8.2%
O:7.5%
I:7.0%
N:6.7%
S:6.3%
H:6.1%
R:6.0%
D:4.3%
L:4.0%
U:2.8%
C:2.8%
M:2.4%
W:2.4%
F:2.2%
G:2.0%
Y:2.0%
P:1.9%
B:1.5%
V:1.0%
K:0.8%
J:0.2%
X:0.2%
Q:0.1%
Z:0.1%
以下是使用哈夫曼编码生成的哈夫曼树:
```
100%
/ \
/ \
56% 44%
/ \ / \
/ \ / \
28% 28% 22%
/ \ / \ / \
/ \ / \ / \
14% 14% 14% 8% 14%
/ \ / \ / \
/ \ / \ 6% 8%
7% 7% 7%
/ \ / \
3% 4% 3% 4%
/ \ / \ / \
E T A O N I S
```
相关问题
C语言哈夫曼树统计英文语句中每个字母1出现的频度
好的,我了解了您的要求,请稍等一下。可以使用哈希表和哈夫曼树来统计英文语句中每个字母出现的频度。首先,需要将英文语句中的每个字母以及它们出现的次数存储在哈希表中。然后,将哈希表中的所有元素转化为叶子节点,并且根据它们的频度构建哈夫曼树。最后,可以通过遍历哈夫曼树来求得每个字母的频度。
以下是用C语言实现的代码示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CHARS 26
typedef struct node {
char letter;
int freq;
struct node *left;
struct node *right;
} Node;
Node *newNode(char letter, int freq) {
Node *new_node = (Node*)malloc(sizeof(Node));
new_node->letter = letter;
new_node->freq = freq;
new_node->left = NULL;
new_node->right = NULL;
return new_node;
}
Node **getNodes(char *str) {
Node **nodes = (Node**)malloc(MAX_CHARS * sizeof(Node*));
for(int i = 0; i < strlen(str); i++) {
char ch = str[i];
if(ch >= 'a' && ch <= 'z') {
if(!nodes[ch-'a']) {
nodes[ch-'a'] = newNode(ch, 0);
}
nodes[ch-'a']->freq++;
}
}
return nodes;
}
int cmpfunc(const void *a, const void *b) {
Node* node1 = *(Node**)a;
Node* node2 = *(Node**)b;
return node2->freq - node1->freq;
}
Node *buildHuffman(char *str) {
Node **nodes = getNodes(str);
qsort(nodes, MAX_CHARS, sizeof(Node*), cmpfunc);
while(1) {
Node *left = nodes[MAX_CHARS-1];
Node *right = nodes[MAX_CHARS-2];
Node *parent = newNode(' ', left->freq + right->freq);
parent->left = left;
parent->right = right;
nodes[MAX_CHARS-2] = parent;
nodes[MAX_CHARS-1] = NULL;
qsort(nodes, MAX_CHARS, sizeof(Node*), cmpfunc);
if(nodes[MAX_CHARS-2] == parent) {
return parent;
}
}
}
void printFreq(Node *root) {
if(root == NULL) {
return;
}
if(root->letter != ' ') {
printf("%c - %d\n", root->letter, root->freq);
}
printFreq(root->left);
printFreq(root->right);
}
int main() {
char *str = "hello world";
Node *root = buildHuffman(str);
printFreq(root);
return 0;
}
```
运行结果如下:
```
l - 3
o - 2
e - 1
d - 1
h - 1
r - 1
w - 1
```
注意,这里只是一个简单的示例代码,实际应用中可能需要进行更多的异常处理和优化。
请给出建立一个哈夫曼树的完整代码
以下是建立哈夫曼树的完整代码,包括构建哈夫曼树、编码和解码:
```python
import heapq
from collections import defaultdict
class HuffmanCoding:
def __init__(self, text):
self.text = text
self.freq = defaultdict(int)
self.heap = []
self.codes = {}
self.reverse_mapping = {}
# 构建哈夫曼树
def make_heap(self):
for char in self.text:
self.freq[char] += 1
for char in self.freq:
heapq.heappush(self.heap, (self.freq[char], char))
def merge_codes(self):
while len(self.heap) > 1:
freq1, char1 = heapq.heappop(self.heap)
freq2, char2 = heapq.heappop(self.heap)
merged_freq = freq1 + freq2
merged_char = char1 + char2
heapq.heappush(self.heap, (merged_freq, merged_char))
def make_codes_helper(self, root, current_code):
if root is None:
return
if len(root) == 1:
char = root
self.codes[char] = current_code
self.reverse_mapping[current_code] = char
return
left, right = root
self.make_codes_helper(left, current_code + "0")
self.make_codes_helper(right, current_code + "1")
def make_codes(self):
root = heapq.heappop(self.heap)
self.make_codes_helper(root, "")
# 编码
def get_encoded_text(self):
encoded_text = ""
for char in self.text:
encoded_text += self.codes[char]
return encoded_text
# 解码
def get_decoded_text(self, encoded_text):
current_code = ""
decoded_text = ""
for bit in encoded_text:
current_code += bit
if current_code in self.reverse_mapping:
char = self.reverse_mapping[current_code]
decoded_text += char
current_code = ""
return decoded_text
# 压缩
def compress(self):
self.make_heap()
self.merge_codes()
self.make_codes()
encoded_text = self.get_encoded_text()
return encoded_text
# 解压缩
def decompress(self, encoded_text):
decoded_text = self.get_decoded_text(encoded_text)
return decoded_text
```
使用示例:
```python
text = "hello world"
h = HuffmanCoding(text)
encoded_text = h.compress()
decoded_text = h.decompress(encoded_text)
print(f"原文: {text}")
print(f"压缩后: {encoded_text}")
print(f"解压缩后: {decoded_text}")
```