这个贪心算法就是普通的数据结构书都会介绍,就是根据出现频率每次选择两个最短的建立huffman树,消除两个插入一个,知道只能一个供选择为止!
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
struct{
int w;
int p;
int l;
int r;
}ASC[60];
int main()
{
char ch[100000];
int hash[35];
int i,j,k;
int lenght;
while(cin>>ch,strcmp(ch,"END")!=0)
{
memset(hash,0,sizeof(hash));
lenght=strlen(ch);
for(i=0;i<lenght;i++)
{
hash[ch[i]-64]++;
}
for(i=1,j=1;i<35;i++)
{
if(hash[i]!=0)
{
ASC[j].w=hash[i];
ASC[j].p=ASC[j].l=ASC[j].r=0;
j++;
}
}
j--;
for(i=j+1;i<j*2;i++)
ASC[i].p=ASC[i].l=ASC[i].r=0;
for(i=j+1;i<j*2;i++)
{
int m1,m2;
m1=m2=999999;
int x1,x2;
for(k=1;k<i;k++)
{
if(ASC[k].w<m1&&ASC[k].p==0)
{
m2=m1;
x2=x1;
m1=ASC[k].w;
x1=k;
}
else if(ASC[k].w<m2&&ASC[k].p==0)
{
m2=ASC[k].w;
x2=k;
}
}
ASC[i].w=m1+m2;
ASC[i].r=x1;
ASC[i].l=x2;
ASC[x1].p=i;
ASC[x2].p=i;
}
int sum=0;
int cnt;
for(i=1;i<j+1;i++)
{
k=i;
cnt=0;
while(ASC[k].p!=0)
{
k=ASC[k].p;
cnt++;
}
sum+=cnt*ASC[i].w;
}
if(j==1)
sum=lenght;
float ratio;
ratio=float(lenght*8)/sum;
printf("%d %d %.1f\n",lenght*8,sum,ratio);
}
return 0;
}
本文探讨了贪心算法在构建Huffman树过程中的应用,详细介绍了算法的具体实现步骤,包括如何根据字符频率选取最短的两个元素进行合并,直到形成单一的树结构。同时,通过实例展示了如何利用此算法进行字符编码优化。
3560

被折叠的 条评论
为什么被折叠?



