Group Code




                     D0조


             20113281 김정무
             20113623 김슬기
             20113315 정민정
             20113283 김종진
             20093534 허규준
팀명    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];
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)
{
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)
continue
printf("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
{
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 14


int 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];
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의 접두어가 되므로 적합하지가 않다. 이러한 특성을 이용하
       여 최소 개의 코드로써 정확하게 송신할 수 있으며 수신된 코드를 정확하게
       코드화할 수 있다. 이렇게 구현한 것을 허프만 알고리즘이라고 한다.


       허프만 알고리즘 순서
       ① 가장 낮은 빈도를 갖는 두 문자를 선택하여 가상의 다른 문자로 대치한
       다. 다른 문자가 나타날 빈도수는 합하여진 두 문자의 빈도 합이다.
② 위의 과정을 반복하여 최종 빈도수가 전체의 합과 같을 때 까지 계속한
         다.
         ③    최종적인 트리가 완성되면 각 서브트리의 왼쪽에는 0을 부여하고 오른
         쪽에는 1을 각각 부여하여 각 문자의 코드를 결정한다.
참고 url

7그룹 코드

  • 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]]++; } intfind_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) continue printf("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); } #definebi_max_code 14 int 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