12
Project #7: Project #7: Group codes Group codes 조 : D3 조조 : 2011 최최최 조조 : 2008 최최최 2009 최최최 2011 최최최 2011 최최최

이산치수학 Project7

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: 이산치수학 Project7

Project #7: Project #7:

Group codesGroup codes

조 : D3

조장 : 2011 최보은

조원 : 2008 고충욱

2009 김시백

2011 안영준

2011 정진아

차 례

Page 2: 이산치수학 Project7

1. 프로젝트 설명

2. 일 정

3. 업무분담

4. 소 스

5. 회의록

1. 프로젝트 설명

허프만 코드(Huffman code)허프만 부호화, 허프만 압축, 허프만 알고리즘등으로 불리우는 이 알고리즘은 문자들의 빈도수에 따라

서로 다른 길이의 부호를 부여하여 압축하는 방식으로, 1952 년 당시 박사과정 학생이던 데이비드

허프만이 A Method for the Construction of Minimum-Redundancy Codes 란 제목의 논문으로 처음

Page 3: 이산치수학 Project7

발표했습니다.허프만 알고리즘은 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 위의 결과를 빈도수에 따라 오름차순으로 정렬을 합니다.

이제 이 값들을 이용하여 이진트리를 생성합니다.먼저 가장 작은 빈도수의 값을 두개 선택해서

리프노드를 두개 만들고 두 노드의 가중치를 더해서 부모노드를 만듭니다. 그리고 정렬된 리스트에서

선택된 두개의 노드를 삭제하고 부모노드를 추가 시킵니다.

Page 4: 이산치수학 Project7

위의 과정을 리스트에 노드가 1.0 하나만 남을 때까지 반복합니다. (모든 빈도수 확률을 더하면 1.0 이

되기 때문에)

===============================================================================

===========

===============================================================================

===========

Page 5: 이산치수학 Project7

===============================================================================

===========

===============================================================================

===========

Page 6: 이산치수학 Project7

===============================================================================

===========

이렇게 완성된 이진트리를 루트노드부터 왼쪽은 0, 오른쪽은 1 을 부가해줍니다.

Page 7: 이산치수학 Project7

데이터 치환될 비트

A 00

B 0110

C 0111

D 010

E 10

F 11

이렇게 완성된 허프만 트리를 가지고 각 문자에 대한 비트를 부가합니다.A 의 경우는 루트노드에서

왼쪽으로 한번 갔다가 다시 한번 왼쪽으로 갔기 때문에 00 이 됩니다.마찬가지로 B 는 0110 이

되겠지요.이것을 정리하면 아래의 표와 같습니다.이 표를 보고 눈치채신 분도 있으실텐데 허프만

알고리즘의 핵심은 바로 이 표에 있습니다.가장 많은 빈도수의 데이터는 적은 비트, 상대적으로 적은

빈도수의 데이터들은 더 긴 비트를 서로 접두어가 겹치지 않도록 부가하여 압축하는 것입니다.즉,

비트의 앞에서부터 순서대로 탐색했을 때 유일의 리프노드로 갈 수 있도록 비트의 등장 순서를

유일하도록 해주는 것입니다.그런데 위의 경우는 같은 빈도수의 노드들이 몇개 있기 때문에 다른

모양의 트리로 만들어질 수도 있습니다. 같은 노드가 존재할 때 어떤 순서로 트리에 추가하느냐나

트리의 왼쪽, 오른쪽 어느쪽에 붙이느냐에 따라 조금 달라질 수도 있습니다. 하지만 결과적으로

부가되는 비트의 개수는 같기때문에 압축율은 같습니다.이제 처음에 압축하려고 했던 데이터를

압축하면 다음과 같아질 것입니다.

데이터: ACABFEAFDE 압축된 데이터: 0001110001101110001101010

Page 8: 이산치수학 Project7

처음의 데이터는 10 글자이므로 10 바이트 = 80 비트 입니다. 압축된 데이터는 25 글자이지만

비트데이터이므로 25 비트 입니다. 25 / 80 * 100 = 31.25% 의 압축율을 보이는 군요.물론 위의 예는

텍스트 문서일 때이고, 다른 종류의 파일이라면 약간 달라질 수 도 있습니다. 실제로는 트리정보에

대한 헤더도 추가해야되고 하니 조금 더 늘어나겠지만, 그래도 꽤 괜찮은 압축율을 보입니다.압축을

해제하는 것은 아주 쉽습니다.비트데이터를 허프만 트리에 넣고 루트노드부터 탐색해서 리프노드가

나오면 치환해주고, 다시 루트부터 탐색하는 식으로 데이터를 끝까지 읽으면 됩니다.

2. 일 정

일 정 내 용

‘12. 6.

13

프로젝트 진행방향 토의 후 팀원의 임무분담을 정함.

알고리즘 구상, 소스 구현 및 프로젝트 관련 자료 수집

‘12. 6.

20

소스의 문제점 토의 후 해결책 제시

최종보고서 작성 후 검토

3. 업무분담

이 름 분 담 내 용

최보은 조장임무 및 자료조사

고충욱 알고리즘 구성 및 자료조사

김시백 보고서작성 및 자료조사

안영준 알고리즘을 바탕으로 한 소스구성

Page 9: 이산치수학 Project7

정진아 알고리즘 구성 및 자료조사

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++;

}

}

Page 10: 이산치수학 Project7

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. 다음 일정 계획

회의내용 내 용 비 고

Page 11: 이산치수학 Project7

1. 프로젝트 파악

: 압축하는 프로그램에 관한 내용으로 이번 프로젝트 주요 내용

말고 도 다른 압축하는 알고리즘이 있는지 토의.

조교님의 설명요지 파악

2. 호프만 코드(Huffman code)관한 회의

: 꼭 트리로 표현하여 0,1 을 매겨야만 원하는 값이 나오는지,

다른방 법은 없는지 회의.

3. 업무분담

: 조장 : 최보은

자료조사 : 김시백, 정진아

알고리즘 구상 : 고충욱, 안영준

4. 다음 일정 계획

: 주말까지 자료조사 완료

각자 호프만 코드에 대해 완전히 숙지해 오기.

<2 차>

회의일시 2012 년 06월 19-20 일 조 D3 작성자 11 최보은

참석자 08 고충욱 09 김시백 11 안영준 11 정진아

회의안건

1. 호프만 코드

2. 알고리즘 회의

3. 최종 보고서 작성

4. 발표 후 회의

회의내용 내 용 비 고

Page 12: 이산치수학 Project7

1. 자료조사

: 자료조사를 통해 조원끼리 호프만 코드에 대해 의논을 하여

완전히 숙지를 하였다.

2. 알고리즘 회의

: 입력 후 빈도수대로 출력하는 것과 이를 두 개씩 묶어 최후엔

하나 의 노드까지 남게 하는 것 까진 하겠으나 그 뒤 이를 한

트리로 구 현하는 것부터 문제가 됨. 어떻게 해결할 것인지 토의

3. 최종 보고서 작성

: 현재 상태를 기점으로 보고서를 작성

4. 발표 후 회의

: 처음 a 를 010 으로 지정했는데 그다음 파일에선 a 가 011

이 나온다면 그때마다 값이 다르게 나오기 때문에 분별하기

어렵다. 이를 해결할 방법이 없는지 조원끼리 의논했지만 답이

나오지 않았다.