Red de conocimientos turísticos - Información de alquiler - ¿Qué es el algoritmo de Huffman?

¿Qué es el algoritmo de Huffman?

Existe una estructura de árbol llamada árbol de Huffman, y el algoritmo que utiliza el método del árbol de Huffman para resolver problemas de programación se llama algoritmo de Huffman. De hecho, no existe ningún nombre como algoritmo de Huffman. Si me preguntas, te diré esto. . El código que genera

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

typedef char ElemType;

typedef struct

{

Typedef struct

El algoritmo de Huffman se llama algoritmo de Huffman.

p>

{

ElemType elem;

unsigned int m_weight

unsigned int parent,lchild,rchild;

}HTNode,*HuffmanTree;

typedef char** HuffmanCode;

typedef int Estado

typedef estructura peso

{

char elem;

unsigned int m_weight;

}Peso; // Guardar información del símbolo

void HuffmanCoding(HuffmanTree * ,HuffmanCode *,Peso *,int);

void Select( HuffmanTree,int,int *,int *);

void OutputHuffmanCode(HuffmanTree,HuffmanCode,int);

p>

Estado principal(nulo)

{

HuffmanTree HT;

HuffmanCode HC

Peso *w; /p>

char c; // los símbolos;

int i,n; // el número de elementos

int wei.

printf("ingrese el número de tatuaje del árbol Huffman:" );

scanf("%d",&n

w=(Weight *)malloc(n* ) tamaño de (Peso);

w=(Peso *)malloc(n*)tamaño de (Peso));

for(i=0;i

{

printf("ingrese el elemento y su peso: "); >

p>

scanf("%1s%d",&c,& wei

w[i].elem=c

w[); i].m_weight =wei;

}

HuffmanCoding(&HT,&HC,w,n);

SalidaHuffmanCode(HT,HC ,n); /p>

return 1;

}

void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,Weight *w,int n)

{

int i,m,s1,s2,start, c,f

char *cd

HuffmanTree p; if(n< =1)

return

m=2*n-1

(*HT)=(HuffmanTree)malloc((m +1)* tamaño de(HTNode));

for(i=1;i<

=n;++i)

{

(*HT)[i].

(*HT)[i].elem=w[i -1].elem;

(*HT)[i].m_weight=w[i-1].p> (*HT)[i].parent=(*HT)[i]. lchild=(*HT)[i].rchild=0;

}

for(;i<=m;++i)

{

(*HT)[i].elem='0';

(*HT)[ i].m_weight=(*HT)[i].parent=(*HT )[i].lchild=(*HT)[i].rchild=0

}

}

for(i=n+1; i<=m;++i)

{

Seleccionar(*HT,i-1,& amp;s1,&s2); HT)[s1].parent=i; (*HT)[s2].parent=i

(*HT)[i].lchild=s1; =s2;

(*HT)[i].m_peso = (*HT)[s1].m_peso+(*HT)[s2].m_peso; >

(*HC)=(HuffmanCode)malloc(n*sizeof(char*));

cd=(char*)malloc(n*sizeof(char));

cd[n-1]='\0';

for(i=1;i<=n;++i)

{

inicio=n-1;

for(c=i,f=(*HT)[i].parent;f!=0;c=f,f=(*HT)[f ].parent)

{

if((*HT)[f].lchild==c) cd[--start]='0'; p> else cd[--start]='1'

}

(*HC)[i]=(char *)malloc((n-start)*sizeof (char));

strcpy((*HC)[i],&cd[inicio]

}

}

}

}

void Select(HuffmanTree HT,int n,int *s1,int *s2)

{

int yo;

(*s1)=(*s2)=0

para(i=1;i<=n;i++)

{

if(HT[i].m_weight

{

if(HT[i].m_peso

{

(*s2)=(*s1) ;

(*s1)=i

}

En caso contrario (*s2)=i;

if(((*s1)==0||(*s2)==0)&&HT[i].parent==0)

{

if( (*

s1)==0) (*s1)=i;

si((*s2)==0)

{

if(HT[ i].m_peso

{

(*s2)=(*s1); )=i;

}

else (*s2)=i

}// fin si

}// if fin

} // fin de for

}// fin de for

if((*s1)>(*s2))

{

i=(*s1);

(*s1)=(*s2);

}

Retorno;

}

void OutputHuffmanCode(HuffmanTree HT,HuffmanCode HC,int n)

{

int i;

printf("\nnúmero-- -elemento---peso---código huffman\n"); (i=1;i<=n;i++)

printf("%d %c %d %s\n",i,HT[i].elem,HT[i].m_weight, HC[i]);