Your SlideShare is downloading. ×
Project#7 Group Codes Hwp
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Project#7 Group Codes Hwp

142
views

Published on


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

  • Be the first to like this

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

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Group Code D0조 20113281 김정무 20113623 김슬기 20113315 정민정 20113283 김종진 20093534 허규준
  • 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. 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. 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. {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. 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. 위의 과정을 반복하여 최종 빈도수가 전체의 합과 같을 때 까지 계속한 다. 최종적인 트리가 완성되면 각 서브트리의 왼쪽에는 0을 부여하고 오른 쪽에는 1을 각각 부여하여 각 문자의 코드를 결정한다.참고 url

×