Upload
kochungwook
View
488
Download
0
Embed Size (px)
DESCRIPTION
Citation preview
Project #7: Project #7:
Group codesGroup codes
조 : D3
조장 : 2011 최보은
조원 : 2008 고충욱
2009 김시백
2011 안영준
2011 정진아
차 례
1. 프로젝트 설명
2. 일 정
3. 업무분담
4. 소 스
5. 회의록
1. 프로젝트 설명
허프만 코드(Huffman code)허프만 부호화, 허프만 압축, 허프만 알고리즘등으로 불리우는 이 알고리즘은 문자들의 빈도수에 따라
서로 다른 길이의 부호를 부여하여 압축하는 방식으로, 1952 년 당시 박사과정 학생이던 데이비드
허프만이 A Method for the Construction of Minimum-Redundancy Codes 란 제목의 논문으로 처음
발표했습니다.허프만 알고리즘은 JPEG 이나 MPEG 같은 영상처리에서 많이 사용되고 있으며 우리가
많이 쓰는 알집 역시 허프만 알고리즘으로 한번 압축을 한 다음에 Lempel 이라는 알고리즘으로 압축을
합니다.허프만 알고리즘은 그렇게 어렵지 않은 알고리즘이면서도 꽤 괜찮은 압축율을 보입니다.이번
포스팅에서는 허프만 알고리즘의 원리와 절차에 대해서 알아보고 다음 포스팅 쯤에서 실제로
구현해보도록 하겠습니다.===========================================================
===============================허프만 부호화로 위키에서 검색을 해보면 간략한 설명과 함께
아래와 같은 간략한 절차가 나와 있습니다.
1. 초기화 : 모든 기호를 출현 빈도수에 따라 나열한다.
1. 단 한 가지 기호가 남을 때까지 아래 단계를 반복한다.
1. 목록으로부터 가장 빈도가 낮은 것을 2 개 고른다.
1. 그 다음 허프만이 두가지 기호를 부모 노드를 가지는 부트리를 구성하고
자식노드를 생성한다. 부모 노드 단 기호들의 빈도수를 더하여 주 노드에
할당하고 목록의 순서에 맞도록 목록에 삽입한다.
1. 목록에서 부모노드에 포함된 기호를 제거한다.
데이터 빈도수 등장확률(가중치)
A 3 0.3
B 1 0.1
C 1 0.1
D 1 0.1
E 2 0.2
F 2 0.2
문서를 허프만 알고리즘으로 압축하기 위해서는 먼저 문서 안에 포함된 문자들의 빈도수를 조사하여
정렬하는 절차가 필요합니다.만약 다음과 같은 데이터가 있다고 한다면 다음과 같은 빈도수를 줄 수
있습니다.데이터: ACABFEAFDE 위의 결과를 빈도수에 따라 오름차순으로 정렬을 합니다.
이제 이 값들을 이용하여 이진트리를 생성합니다.먼저 가장 작은 빈도수의 값을 두개 선택해서
리프노드를 두개 만들고 두 노드의 가중치를 더해서 부모노드를 만듭니다. 그리고 정렬된 리스트에서
선택된 두개의 노드를 삭제하고 부모노드를 추가 시킵니다.
위의 과정을 리스트에 노드가 1.0 하나만 남을 때까지 반복합니다. (모든 빈도수 확률을 더하면 1.0 이
되기 때문에)
===============================================================================
===========
===============================================================================
===========
===============================================================================
===========
===============================================================================
===========
===============================================================================
===========
이렇게 완성된 이진트리를 루트노드부터 왼쪽은 0, 오른쪽은 1 을 부가해줍니다.
데이터 치환될 비트
A 00
B 0110
C 0111
D 010
E 10
F 11
이렇게 완성된 허프만 트리를 가지고 각 문자에 대한 비트를 부가합니다.A 의 경우는 루트노드에서
왼쪽으로 한번 갔다가 다시 한번 왼쪽으로 갔기 때문에 00 이 됩니다.마찬가지로 B 는 0110 이
되겠지요.이것을 정리하면 아래의 표와 같습니다.이 표를 보고 눈치채신 분도 있으실텐데 허프만
알고리즘의 핵심은 바로 이 표에 있습니다.가장 많은 빈도수의 데이터는 적은 비트, 상대적으로 적은
빈도수의 데이터들은 더 긴 비트를 서로 접두어가 겹치지 않도록 부가하여 압축하는 것입니다.즉,
비트의 앞에서부터 순서대로 탐색했을 때 유일의 리프노드로 갈 수 있도록 비트의 등장 순서를
유일하도록 해주는 것입니다.그런데 위의 경우는 같은 빈도수의 노드들이 몇개 있기 때문에 다른
모양의 트리로 만들어질 수도 있습니다. 같은 노드가 존재할 때 어떤 순서로 트리에 추가하느냐나
트리의 왼쪽, 오른쪽 어느쪽에 붙이느냐에 따라 조금 달라질 수도 있습니다. 하지만 결과적으로
부가되는 비트의 개수는 같기때문에 압축율은 같습니다.이제 처음에 압축하려고 했던 데이터를
압축하면 다음과 같아질 것입니다.
데이터: ACABFEAFDE 압축된 데이터: 0001110001101110001101010
처음의 데이터는 10 글자이므로 10 바이트 = 80 비트 입니다. 압축된 데이터는 25 글자이지만
비트데이터이므로 25 비트 입니다. 25 / 80 * 100 = 31.25% 의 압축율을 보이는 군요.물론 위의 예는
텍스트 문서일 때이고, 다른 종류의 파일이라면 약간 달라질 수 도 있습니다. 실제로는 트리정보에
대한 헤더도 추가해야되고 하니 조금 더 늘어나겠지만, 그래도 꽤 괜찮은 압축율을 보입니다.압축을
해제하는 것은 아주 쉽습니다.비트데이터를 허프만 트리에 넣고 루트노드부터 탐색해서 리프노드가
나오면 치환해주고, 다시 루트부터 탐색하는 식으로 데이터를 끝까지 읽으면 됩니다.
2. 일 정
일 정 내 용
‘12. 6.
13
프로젝트 진행방향 토의 후 팀원의 임무분담을 정함.
알고리즘 구상, 소스 구현 및 프로젝트 관련 자료 수집
‘12. 6.
20
소스의 문제점 토의 후 해결책 제시
최종보고서 작성 후 검토
3. 업무분담
이 름 분 담 내 용
최보은 조장임무 및 자료조사
고충욱 알고리즘 구성 및 자료조사
김시백 보고서작성 및 자료조사
안영준 알고리즘을 바탕으로 한 소스구성
정진아 알고리즘 구성 및 자료조사
4. 소 스#include <stdio.h>
int main()
{
char arr[26],brr[13],crr[7],drr[4],err[2],frr[1];
int aar[26];
char ch,chc[26];
int chi[26],chi2[26];
int chs[6];//좌표
int ar=0;//입력받은수
int a,b;//for 용
int in;
int zung;
int dai=9999;//최대
int sun;
for(;;){
zung=0;
scanf("%c",&ch);
if(ch=='\n'){
break
}
for(a=0;a<=ar;a++){
if(chc[a]==ch){
chi[a]++;
chi2[a]++;
zung++;
}
}
if(zung==0){
chc[ar]=ch;
chi[ar]=1;
chi2[ar]=1;
ar++;
}
}
for(b=0;b<=ar-1;b++){
dai=9999;
for(a=0;a<=ar-1;a++){
if(chi2[a]<dai){
dai=chi2[a];
sun=a;
}
}
arr[b]=chc[sun];
aar[b]=dai;
chi2[sun]=10000;
}
for(a=0;a<=ar-1;a++){
printf("%c %d\n",arr[a],aar[a]);
}
scanf("%d",in);
}
->최종 소스 실패(입력).
5. 회 의 록
<1 차>
회의일시 2012 년 06월 13 일 조 D3 작성자 11 최보은
참석자 08 고충욱 09 김시백 11 안영준 11 정진아
회의안건
1. 프로젝트 파악
2. 호프만 코딩 관한 회의
3. 업무분담
4. 다음 일정 계획
회의내용 내 용 비 고
1. 프로젝트 파악
: 압축하는 프로그램에 관한 내용으로 이번 프로젝트 주요 내용
말고 도 다른 압축하는 알고리즘이 있는지 토의.
조교님의 설명요지 파악
2. 호프만 코드(Huffman code)관한 회의
: 꼭 트리로 표현하여 0,1 을 매겨야만 원하는 값이 나오는지,
다른방 법은 없는지 회의.
3. 업무분담
: 조장 : 최보은
자료조사 : 김시백, 정진아
알고리즘 구상 : 고충욱, 안영준
4. 다음 일정 계획
: 주말까지 자료조사 완료
각자 호프만 코드에 대해 완전히 숙지해 오기.
<2 차>
회의일시 2012 년 06월 19-20 일 조 D3 작성자 11 최보은
참석자 08 고충욱 09 김시백 11 안영준 11 정진아
회의안건
1. 호프만 코드
2. 알고리즘 회의
3. 최종 보고서 작성
4. 발표 후 회의
회의내용 내 용 비 고
1. 자료조사
: 자료조사를 통해 조원끼리 호프만 코드에 대해 의논을 하여
완전히 숙지를 하였다.
2. 알고리즘 회의
: 입력 후 빈도수대로 출력하는 것과 이를 두 개씩 묶어 최후엔
하나 의 노드까지 남게 하는 것 까진 하겠으나 그 뒤 이를 한
트리로 구 현하는 것부터 문제가 됨. 어떻게 해결할 것인지 토의
3. 최종 보고서 작성
: 현재 상태를 기점으로 보고서를 작성
4. 발표 후 회의
: 처음 a 를 010 으로 지정했는데 그다음 파일에선 a 가 011
이 나온다면 그때마다 값이 다르게 나오기 때문에 분별하기
어렵다. 이를 해결할 방법이 없는지 조원끼리 의논했지만 답이
나오지 않았다.