久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1877|回復: 0
打印 上一主題 下一主題
收起左側

哈夫曼編碼源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:205429 發表于 2017-5-27 17:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
// 哈夫曼編碼(算法)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef char *HuffmanCode;  //動態分配數組,存儲哈夫曼編碼
typedef struct
{
        unsigned int weight;  //用來存放各個結點的權值
        unsigned int parent,LChild,RChild;  //指向雙親、孩子結點的指針
} HTNode, *HuffmanTree;  //動態分配數組,存儲哈夫曼樹//選擇兩個parent為0,且weight最小的結點s1和s2
char alpha[53] = {'a','b','c','d','e','f','g','h','i','j','k','l','m',
                                  'n','o','p','q','r','s','t','u','v','w','x','y','z',
                  'A','B','C','D','E','F','G','H','I','J','K','L','M',
                                  'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
char alpha_1[53];
int num1[52] = {0};
int num2[52] = {0};
double num3[52] = {0};
int k = 0;
double add[52];
double HX = 0.0;
double MX = 0.0;
void Select(HuffmanTree *ht,int n,int *s1,int *s2)
{
        int i,min;
    for(i=1; i<=n; i++)
        {
         if((*ht).parent==0)
         {
             min=i;
       break;
           }
        }
    for(i=1; i<=n; i++)
        {
         if((*ht).parent==0)
         {
                   if((*ht).weight<(*ht)[min].weight)
                    min=i;
     }
    }
    *s1=min;
    for(i=1; i<=n; i++)
        {
           if((*ht).parent==0 && i!=(*s1))
           {
                   min=i;
        break;
       }
        }
    for(i=1; i<=n; i++)
          {
             if((*ht).parent==0 && i!=(*s1))
         {
                if((*ht).weight<(*ht)[min].weight)
                 min=i;
         }
        }
    *s2=min;
}//構造哈夫曼樹ht。w存放已知的n個權值
void CrtHuffmanTree(HuffmanTree *ht,int *w,int n)
{
int m,i,s1,s2;
    m=2*n-1;
    *ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
    for(i=1; i<=n; i++)  //1--n號存放葉子結點,初始化
        {
                  (*ht).weight=w;
        (*ht).LChild=0;
        (*ht).parent=0;
        (*ht).RChild=0;
        }
    for(i=n+1; i<=m; i++)
        {
                (*ht).weight=0;
        (*ht).LChild=0;
        (*ht).parent=0;
        (*ht).RChild=0;
        } //非葉子結點初始化
  //  printf("\nHuffmanTree: \n");
    for(i=n+1; i<=m; i++)   //創建非葉子結點,建哈夫曼樹
        {
  //在(*ht)[1]~(*ht)[i-1]的范圍內選擇兩個parent為0
        //且weight最小的結點,其序號分別賦值給s1、s2
        Select(ht,i-1,&s1,&s2);
        (*ht)[s1].parent=i;
        (*ht)[s2].parent=i;
        (*ht).LChild=s1;
        (*ht).RChild=s2;
        (*ht).weight=(*ht)[s1].weight+(*ht)[s2].weight;
   //     printf("%d (%d, %d)\n",(*ht).weight,(*ht)[s1].weight,(*ht)[s2].weight);
        }
    printf("\n");
} //哈夫曼樹建立完畢//從葉子結點到根,逆向求每個葉子結點對應的哈夫曼編碼
void CrtHuffmanCode(HuffmanTree *ht, HuffmanCode *hc, int n,char str[],double num[],double HX)
{
        int shu[n];
        char *cd;
    int i,start,p;
    unsigned int c;
    hc=(HuffmanCode *)malloc((n+1)*sizeof(char *));  //分配n個編碼的頭指針
    cd=(char *)malloc(n*sizeof(char));  //分配求當前編碼的工作空間
    cd[n-1]='\0';  //從右向左逐位存放編碼,首先存放編碼結束符
    for(i=1; i<=n; i++)  //求n個葉子結點對應的哈夫曼編碼
        {
          start=n-1;  //初始化編碼起始指針
    for(c=i,p=(*ht).parent; p!=0; c=p,p=(*ht)[p].parent)  //從葉子到根結點求編碼
           if( (*ht)[p].LChild==c)
            cd[--start]='1';  //左分支標0
    else
            cd[--start]='0';  //右分支標1
    hc=(char *)malloc((n-start)*sizeof(char));  //為第i個編碼分配空間
    strcpy(hc,&cd[start]);
        }
    free(cd);
    for(i=1; i<=n; i++)
          printf("HFMC  %c  is  %s\n",str,hc);
          for(i=1; i<=n; i++)
          {
              shu = strlen(hc);         //測出碼長
              MX += shu*num3;    //計算平均碼長
          }
              MX = HX/MX;//計算效率
          printf("\n編碼效率n     %f\n",MX);
    printf("\n");
}
int countchar(char str[],char a,int n_value)
{
    int n=0;
    int i = 0;
    while(i < n_value)
        {
        if((str) == a)
        n++;
        i++;
    }
    return n;
}
int main()
{
     HuffmanTree HT;
     HuffmanCode HC;
     int *w,i,wei,m,value = 0,count = 0,n1 = 0,n2 = 0,j = 0,n = 0;
     char data;
   
     FILE *fp=fopen("in.txt","r");
         if(!fp)
         {
                  printf("can't open file\n");
                  return -1;
         }
         while(!feof(fp))
         {
                  value++;
                 data=fgetc(fp);
              printf("%c",data);
              if(data>='a'&&data<='z'||data>='A'&&data<='Z')
                  n1++;
             else if(data>='0'&&data<='9')
                  n2++;
         }
         printf("\n字母:%d\n",n1);
         printf("\n");
         fclose(fp);
         char disbuf[value];
         FILE *fq=fopen("in.txt","r");
        if(!fq)
        {
           printf("can't open file\n");
           return -1;
        }
          while(count <= value)
    {
          fscanf(fq,"%c",&disbuf[count]);
          count++;
        }
    fclose(fq);
    printf("\n");
    for(j = 0; j < 52; j++)
    num1[j] += countchar(disbuf, alpha[j],n1);//找出各個字母的個數
   
    for( i = 0; i < 52; i++ ) //求每個字母的概率
    {
             add= double(num1)/double(n1);
    }
   
   
    for( i = 0,j = 1;i < 26; i++)
    {
        printf("字母%c\t\t數量%d\t概率%0.3f\t",alpha,num1,add);
             printf("字母%c\t\t數量%d\t概率%0.3f\t",alpha[i+26],num1[i+26],add[i+26]);
    }
   
   for(i = 0,j = 1; i < 52; i++)//把不為零的字母統計出來,統計他們的個數與符號
   {
            if(num1 != 0)
            {  
                    n++;
                    num2[j] = num1;
                    alpha_1[j] = alpha;
                    j++;
            }
   }
   for( i = 0,j = 1; i < 52; i++ ) //把不為零的字母概率挑選出來 ,計算信源熵
   {
     if(num1 != 0)
            {  
               HX += add*log10(add);
               num3[j] = add;        //挑選出有概率的字符和其概率;  
               j++;
            }
   }
    HX =  - HX/log10(2);        //計算信源熵  
        printf("\n信源熵H(X)    %f\n",HX);
       
    w=(int *)malloc((n+1)*sizeof(int));
    for(i=1; i<=n; i++)
        {
        w= num2 ;
        }
    CrtHuffmanTree(&HT,w,n);
    CrtHuffmanCode(&HT,&HC,n,alpha_1,num3,HX);
   

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 蜜桃传媒av | 国产精品日韩 | 青青草视频网 | 国产精品久久久久久久久免费软件 | 91精品久久久久久久久 | 国产区久久 | 欧美在线一级 | 国产在线网址 | 久久久久久久久久久久久9999 | 久久久免费毛片 | 在线观看成年视频 | 亚洲一区二区网站 | 久久69精品久久久久久国产越南 | 麻豆视频在线看 | 久草青青草 | 日本一本在线 | 精品亚洲一区二区三区四区五区高 | xxx视频| 亚洲成人久久久 | 亚洲欧美自拍偷拍视频 | 97超碰站| 精品99在线 | 天天操精品视频 | 欧美区在线观看 | 亚洲三级av | 国产午夜三级一区二区三 | 视频一区二区中文字幕 | 国产精品久久久久久婷婷天堂 | 涩涩视频在线观看 | 中文一区 | 午夜精品一区二区三区免费视频 | 国产亚洲精品a | 欧美日韩国产在线观看 | 做a的各种视频 | 成年人网站在线观看视频 | 91婷婷韩国欧美一区二区 | www.日韩| 国内自拍偷拍一区 | 秋霞电影一区二区三区 | 久久精品一区二区视频 | 国产精品一区在线 |