Algoritmo Greedy (resolvendo problemas de otimização) e sua aplicação de codificação Huffman

1. Processo de solução de algoritmo ganancioso:
normalmente projeto de cima para baixo: faça uma escolha (faça uma escolha ótima local) e, em seguida, resolva o subproblema restante semelhante ao problema original.
Insira a descrição da imagem aqui
2. Etapas do projeto do algoritmo ganancioso:
Insira a descrição da imagem aqui
3. Problema da mochila 0-1 e problema da mochila da pontuação:
0-1 problema da mochila: [programação dinâmica] 01 problema da mochila (fácil de entender, explicação super básica)
problema da mochila pontuação: algoritmo ganancioso, ver algoritmo Introdução Seção 16.2

4. Codificação de Huffman: Objetivo: a frequência de caracteres é alta e o número de dígitos binários é pequeno.
Para dados como caracteres, de acordo com sua frequência de aparecimento,O código de prefixo ideal (representação binária) do personagem é construído pelo algoritmo guloso de Huffman, reduzindo assim o espaço ocupado.
Código de prefixo: nenhuma palavra-código é o prefixo de outras palavras-código.
A árvore correspondente ao código de prefixo ideal tem N nós folha (o número de caracteres) e há exatamente N-1 nós internos.

4.1 Processo de construção da codificação binária de Huffman:
a) O algoritmo constrói a árvore binária T correspondente à codificação ótima de baixo para cima, partindo de N nós folha, realizando N-1 operações de fusão para criar a árvore binária final.
b) O algoritmo usa a fila de menor prioridade Q com a frequência de ocorrência de caracteres como palavra-chave para identificar os dois objetos com a frequência mais baixa e mesclá-los.
c) A nova frequência de objeto obtida quando os dois objetos são mesclados é definida como a soma das frequências dos dois objetos originais.
O fluxograma é o seguinte:
Insira a descrição da imagem aqui
4.2. Codificação binária de Huffman para construir o código C ++:
Suponha que um determinado caractere e sua frequência de aparecimento formem uma matriz de estruturanodeArr

#include <queue>
struct node{
    
    
	int num; // 字符出现频率
	char c; //字符
	node* left;
	node* right;
	node(int x,char y):num(x),c(y),left(null),right(null){
    
    }
	node():num(0),c('0'),left(null),right(null){
    
    }
	bool operator< (const node& a){
    
    
		return num>a.num; //从小到大排列
	}
}
node* nodeArr[10]; // 假设已经给定,且存储在动态内存

priority_queue<node*> q; // 按字符出现频率由小到大排列
for(int i = 0;i<10;i++){
    
    
	q.push(nodeArr[i]);
}
for(int i = 0;i<9;i++){
    
     // 10个节点9条边
	node* z = new node;
	node* tmp1 = q.front();
	q.pop();
	node* tmp2 = q.front();
	q.pop();
	z->left = tmp1;
	z->right = tmp2;
	z->num = tmp1->num +tmp2->num;
	q.push(z);
}
node* root =  q.front(); //树的根节点

Resumindo:

1. No processo de construção da codificação de Huffman, coloque o nó esquerdo com baixa frequência e coloque o nó direito com alta frequência.
2. A codificação de Huffman usa alguns bits binários para representar os caracteres com alta frequência, reduzindo assim o espaço usado e realizando a codificação de compressão.

Acho que você gosta

Origin blog.csdn.net/qq_33726635/article/details/106001138
Recomendado
Clasificación