Group Code                     D0조             20113281 김정무             20113623 김슬기             20113315 정민정             ...
팀명    D0연구제목   Group Code연구목표   호프만 알고리즘의 개념과 사용법을 안다 일정    ① 06.13 수요일       ① 자료조사 : 허규준 김종진 역할    ② 프로그램작성 : 김슬기 정민정   ...
void get_freq(void){int i;for(i=0;i<MAX;i++)freq[i]=0;for(i=0;i<MAX;i++)if(sen[i]!=0)freq[sen[i]]++;}int find_minimum(void...
m=find_minimum();h1=head[m];head[m]=head[--nhead];m=find_minimum();h2=head[m];if((h=(huf*)malloc(sizeof(huf))) == NULL){pr...
{code[h->data]=c;len[h->data]=l;}}void make_code(void){int i;for(i=0;i<256;i++)code[i]=len[i]=0;_make_code(huf_head,0u,0);...
for(j=1 ; j<=len[i]; j++)       {       bi_code[len[i]-j]=temp%2;       temp/=2;       }       printf("t %ct",i);       if...
위의 과정을 반복하여 최종 빈도수가 전체의 합과 같을 때 까지 계속한         다.              최종적인 트리가 완성되면 각 서브트리의 왼쪽에는 0을 부여하고 오른         쪽에는 1을 각각 부여하...
Upcoming SlideShare
Loading in...5
×

Project#7 Group Codes Hwp

154

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
154
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Project#7 Group Codes Hwp"

  1. 1. Group Code D0조 20113281 김정무 20113623 김슬기 20113315 정민정 20113283 김종진 20093534 허규준
  2. 2. 팀명 D0연구제목 Group Code연구목표 호프만 알고리즘의 개념과 사용법을 안다 일정 ① 06.13 수요일 ① 자료조사 : 허규준 김종진 역할 ② 프로그램작성 : 김슬기 정민정 ③ 조장 : 김정무 2012. 06. 13 수요일 프로그램은 문자를 입력받으면 단어 빈도수대로 정렬을 한 후 빈도수가 같 거나 비슷한 단어를 묶어서 이진트리로 만드는 호프만 알고리즘을 사용하기회의내용 로 하였다. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <windows.h> #define MAX 256 int freq[MAX]; static char sen[MAX] ="ABCDEABCABC"최종소스 typedef struct _huf { int count; char data; struct _huf *left,*right; } huf; huf *head[MAX]; int nhead; huf *huf_head; unsigned code[256]; int len[256];
  3. 3. void get_freq(void){int i;for(i=0;i<MAX;i++)freq[i]=0;for(i=0;i<MAX;i++)if(sen[i]!=0)freq[sen[i]]++;}int find_minimum(void){int mindex,i;mindex=0;for(i=1;i<nhead;i++){if(head[i]->count < head[mindex]->count)mindex=i;}return mindex;}void construct_tree(void){int i,m;huf *h,*h1,*h2;for(i=nhead=0;i<MAX;i++){if(freq[i]!=0){if((h=(huf *)malloc(sizeof(huf))) == NULL){printf("nError : out of memory.");exit(1);}h->count=freq[i];h->data=i;h->left=h->right=NULL;head[nhead++]=h;}}while(nhead>1){
  4. 4. m=find_minimum();h1=head[m];head[m]=head[--nhead];m=find_minimum();h2=head[m];if((h=(huf*)malloc(sizeof(huf))) == NULL){printf("nError : out of memory.");exit(1);}h->count=h1->count+h2->count;h->data=0;h->left=h1;h->right=h2;head[m]=h;}huf_head=head[0];}void show_freq(void){int i;for(i=0 ; i<MAX ; i++){if(freq[i]==0)continueprintf("t %c t %dn",i,freq[i]);}}void _make_code(huf *h,unsigned c, int l){if(h->left != NULL || h->right !=NULL){c<<=1;l++;_make_code(h->left,c,l);c|=1u;_make_code(h->right,c,l);c >>= 1;l--;}else
  5. 5. {code[h->data]=c;len[h->data]=l;}}void make_code(void){int i;for(i=0;i<256;i++)code[i]=len[i]=0;_make_code(huf_head,0u,0);}#define bi_max_code 14int code_leng(void){int i,max=0;for(i=0 ; i<MAX ; i++)if(max<len[i])max=len[i];return max;}void huffman_comp(){char ch;int i,j,bi_code[bi_max_code],temp,max;get_freq();construct_tree();make_code();max=code_leng();printf("빈도수n");show_freq();printf("t문자t코드t코드의 길이n");for(i=0 ; i<MAX ; i++){if(len[i]!=0){temp=code[i];
  6. 6. for(j=1 ; j<=len[i]; j++) { bi_code[len[i]-j]=temp%2; temp/=2; } printf("t %ct",i); if(max>len[i]) for(j=0;j<max-len[i];j++) printf(" "); for(j=0 ; j<len[i];j++) printf("%d",bi_code[j]); printf("t %dn",len[i]); } } } void main(void){ int a; int sen_leng = strlen(sen); huffman_comp(); scanf("%d",&a); }문제점 허프만 코드는 문자들을 가변 길이의 비트 스트링으로 표현하는 것으로, 아 스키 코드나 다른 고정 길이 코드들에 대한 대안을 제공한다. 기본 개념은 많이 사용되는 문자들을 표현하기 위해서는 짧은 길이의 비트 스트링을 사 용하고, 적게 사용되는 글자들에 대해서는 긴 길이의 비트 스트링을 사용하 는 것이다. 이런 식으로 하면, 일반적으로 텍스트와 프로그램과 같은 문자열 들을 표현하는데 있어서 아스키 코드를 사용하는 것보다 적은 공간을 사용 할 수 있다. 알파벳의 열로서 이루어진 메시지가 있고 각 메시지의 영문자가 각각 독립 적이고 위치에 관계없이 어떤 정해진 빈도수로 나타내면 우리는 그것을 가조사자료 지고 0과 1의 열로서 코드화할 수 있다. 어느 영문자의 코드도 다른 어떤 문자의 코드의 접두어로 표현되어서는 안 된다. 예를 들어 a가 01이고 b가 010이면 a는 b의 접두어가 되므로 적합하지가 않다. 이러한 특성을 이용하 여 최소 개의 코드로써 정확하게 송신할 수 있으며 수신된 코드를 정확하게 코드화할 수 있다. 이렇게 구현한 것을 허프만 알고리즘이라고 한다. 허프만 알고리즘 순서 가장 낮은 빈도를 갖는 두 문자를 선택하여 가상의 다른 문자로 대치한 다. 다른 문자가 나타날 빈도수는 합하여진 두 문자의 빈도 합이다.
  7. 7. 위의 과정을 반복하여 최종 빈도수가 전체의 합과 같을 때 까지 계속한 다. 최종적인 트리가 완성되면 각 서브트리의 왼쪽에는 0을 부여하고 오른 쪽에는 1을 각각 부여하여 각 문자의 코드를 결정한다.참고 url

×