2. 과제수행일지
조원소개
조장 박구남
소 속 C1 조 자료조사 정준용,민영지
프로그래밍 최고봉
주 제
연구제목 Group codes
하프만 코드를 사용하여 압축
연구배경
참 고 자 료
과제의 수행
첫째날 2012 년 6 월 13 일 수요일
회의 주제 조원 자기소개 및 역할분담, 과제 파악
조장 : 박구남
자료조사 : 정준용, 민영지
프로그래밍 : 최고봉
이상과 같이 이번 프로젝트의 역할분담을 실시했습니다.
첫 수업시간에 문제 파악을 위해 토의를 진행 하면서 각자 역할 분담을 하였습니다.
허프만 코드 개념
■ 허프만코드 : 일종의 파일 압축 알고리즘
회의 내용 텍스트에 나타나는 특정 문자에 대한 빈도수를 이용
자주 사용되는 문자는 짧은 코드를, 자주 사용하지 않는 문자는 긴 코드를 지정
실제 평균 문자 코드 길이를 줄여 압축하는 방법
파일에 사용되는 문자의 사용빈도가 높은 것은 이진 트리의 높은 위치에, 낮은 것은
이진트리의 낮은 위치에 놓아 코드화
허프만 코드는 접두 코드를 회피하여 문자 표현
어떤 코드가 다른 코드의 접두사가 되지 않으면 코드의 길이는 서로 달라도 문자를
표현하는데 지장 없음
이진트리를 생성하여 트리의 왼쪽 종속트리로 갈 때에는 0, 오른쪽 종속트리로 갈 때에는
1로 코드화
허프만 코드는 가장 널리 쓰이는 압축 방법
문자가 나타나는 빈도수에 따라 그 크기를 다르게 하는 것 : 빈도수 의존 코드 모음과 'L',
'R', 'S', 'N', 'T' 등과 같이 자주 나타나는 문자들은 더 작은 비트를 할당
3. ■ 허프만코드 예제
각각의 확률이 0.5, 0.3, 0.15, 0.05인 4개의 값 x1, ..., x4가 있다고 가정
만일 x1, ..., x4값 각각을 나타내기 위해 코드 값 00, 01, 10, 11을 사용한다면 X값을
전송하기 위해 2비트가 필요
그러나 만일 x1을 나타내기 위해 0, x2를 나타내기 위해 10, x3을 나타내기 위해 110,
x4를 나타내기 위해 111을 사용한다면, 평균 0.5*1 + 0.3*2 + 0.15*3 + 0.05 * 3 =
1.7비트가 필요
■ 허프만코드 생성 방법
① 단 하나의 노드만을 가지고 있는 이진 트리와 각 문자를 매핑
② 각 트리에 문자들의 빈도수를 할당 : 트리의 가중치(weight) - 내림차순으로 정렬
③ 두 개의 가장 작은 가중치를 가지고 있는 트리를 찾아 하나의 트리로 합치고 새로운
루트 노드를 만들어 냄 (이 새 트리의 가중치는 합쳐진 두 트리의 가중치의 합)
④ 마지막으로 하나의 트리가 남을 때까지 이 과정을 반복
⑤ 이 과정이 끝났을 때 원래 노드들의 각각은 마지막 이진 트리의 말단 노드(leaf)가 됨
⑥ 이진 트리에서 루트로부터 말단 노드에 이르는 유일한 길(path)이 있게 되고 이 길이
허프만 코드가 됨 ( 각 왼쪽 자식 포인터에 0을 할당하고, 오른쪽 자식 포인터에 1을
할당해서 결정)
- 2 -
4. ■ 초기 코드
Character Code Frequency Total Bits
a 000 10 30
e 001 15 45
i 010 12 36
s 011 3 9
t 100 4 12
space 101 13 39
new line 110 1 3
Total 3 Bits 58 회 174 Bits
■ 초기 코드의 이진트리 표현
- 3 -
5. 둘째날 2012 년 6 월 19 일 화요일
회의주제 허프만 코드 알고리즘을 이용하여 프로그램 작성
회의내용 허프만 코드를 사용하여 Group Code를 만드는 방법.
- 4 -
6. 결과 발표
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
char ch;
int freq;
}Node;
typedef struct Code {
int num;
char ch;
int freq;
struct Code *right;
struct Code *reft;
}Code;
Node **arr;
int a_size;
Node **a_temp;
Code **h_code;
int c_size = 0;
Code **c_temp;
프로그램 소스
void InitArr();
void ReInitArr();
void SortingArr(Node **Target);
void InitCode();
void Coding(Code **Target,int n);
void SortingCode(Code **Target);
int MakeCode(Code *Target,Node **k,int i,int n);
int main( int argc , char* argv[] ) {
FILE*input;
char tmp_c;
int i,j;
Node **result;
char c[32];
char temp[32];
if ( argc != 2 || strlen(argv[1]) == 0) {
printf("Usage : %s filenamen" , argv[0]);
getch();
return 0;
}
- 5 -