Algoritmo codicioso (resolución de problemas de optimización) y su aplicación Codificación Huffman

1. Proceso de solución de algoritmos codiciosos:
generalmente diseño de arriba hacia abajo: haga una elección (elija una opción local óptima) y luego resuelva el subproblema restante similar al problema original.
Inserte la descripción de la imagen aquí
2. Pasos del diseño del algoritmo codicioso:
Inserte la descripción de la imagen aquí
3. Problema de mochila 0-1 y problema de mochila de puntuación: problema de mochila
0-1: [programación dinámica] Problema de mochila 01 (fácil de entender, explicación súper básica)
problema de mochila de puntuación: algoritmo codicioso, ver algoritmo Introducción Sección 16.2

4. Codificación de Huffman: Objetivo: la frecuencia de caracteres es alta y la cantidad de dígitos binarios es pequeña.
Para datos como caracteres, de acuerdo con su frecuencia de aparición,El código de prefijo óptimo (representación binaria) del personaje es construido por el algoritmo codicioso de Huffman, reduciendo así el espacio ocupado.
Código de prefijo: ninguna palabra de código es el prefijo de otras palabras de código.
El árbol correspondiente al código de prefijo óptimo tiene N nodos hoja (el número de caracteres) y hay exactamente N-1 nodos internos.

4.1 Proceso de construcción de codificación binaria de Huffman:
a) El algoritmo construye el árbol binario T correspondiente a la codificación óptima de abajo hacia arriba, partiendo de N nodos hoja, realizando N-1 operaciones de fusión para crear el árbol binario final.
b) El algoritmo utiliza la cola de prioridad más pequeña Q con la frecuencia de aparición de caracteres como palabra clave para identificar los dos objetos con la frecuencia más baja y fusionarlos.
c) La nueva frecuencia de objeto obtenida cuando los dos objetos se fusionan se establece en la suma de las frecuencias de los dos objetos originales.
El diagrama de flujo es el siguiente:
Inserte la descripción de la imagen aquí
4.2. Codificación binaria de Huffman para construir código C ++:
suponga que un carácter dado y su frecuencia de aparición forman una matriz de estructuranodeArr

#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(); //树的根节点

para resumir:

1. En el proceso de construcción de la codificación Huffman, coloque el nodo izquierdo con baja frecuencia y coloque el nodo derecho con alta frecuencia.
2. La codificación de Huffman utiliza unos pocos bits binarios para representar los caracteres con alta frecuencia, reduciendo así el espacio utilizado y realizando codificación de compresión.

Supongo que te gusta

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