哈弗曼编码

来源:互联网 发布:软件的鲁棒性 编辑:程序博客网 时间:2024/05/31 18:48

哈弗曼编码

  • 涉及哈弗曼树的建立

代码解决为,不断进行排序,选择最小的放在最前边,然后相加建立。

#include <stdio.h>#include <string.h>#include <stdlib.h>char str[2560];int book[2560];int tap[2560];int cmp(const void *a, const void *b){    return *(int *)a-*(int *)b;}int main(){    while(scanf("%s", str)!=EOF)    {        memset(book, 0, sizeof(book));        memset(tap, 0, sizeof(tap));        int la, lb=0;        la=strlen(str)*8;        int i;        for(i=0;i<la;i++)        {            book[str[i]]++;        }        int p=0;        //for(i=0;i<256;i++)        for(i=45;i<256;i++)        {            if(book[i]!=0)                tap[p++]=book[i];        }        //printf("\n");        qsort(tap, p, sizeof(tap[0]), cmp);        int sum=0;        int q=0;        while(q<p-1)        {            tap[q+1]+=tap[q];            sum+=tap[q+1];            qsort(tap, p, sizeof(tap[0]), cmp);            q++;        }        lb=sum;        printf("%d %d %.1lf\n", la, lb, 1.0*la/lb);    }    return 0;}

绝对不仅仅如此。

#include <stdio.h>#include <stdlib.h>int cmp(const void *a,const void *b){    return *(int *)a-*(int *)b;//这是从小到大排序,若是从大到小改成: return *(int *)b-*(int *)a;}int main(){    int a[100];    int n;    scanf("%d",&n);//n代表数组中有几个数字    int i;    for(i=1;i<=n;i++)        scanf("%d",&a[i-1]);    qsort(a,n,sizeof(a[0]),cmp);//(数组,需要排序的数字个数,单个数字所占内存大小,比较函数)     for(i=1;i<=n;i++)        printf("%d ",a[i-1]);    return 0;}