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)
{
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