SlideShare a Scribd company logo
C1조 과제물 발표



       조장 : 09박구남
       조원 : 08민영지
           09정준용
           09최고봉
과제수행일지
                                                조원소개
                                      조장              박구남
소 속              C1 조                자료조사           정준용,민영지
                                    프로그래밍             최고봉
                                  주   제

연구제목    Group codes

        하프만 코드를 사용하여 압축
연구배경

                                 참 고 자 료
                                 과제의 수행
 첫째날                    2012   년        6 월        13   일     수요일
회의 주제                          조원 자기소개 및 역할분담, 과제 파악

        조장 : 박구남
        자료조사 : 정준용, 민영지
        프로그래밍 : 최고봉

        이상과 같이 이번 프로젝트의 역할분담을 실시했습니다.

        첫 수업시간에 문제 파악을 위해 토의를 진행 하면서 각자 역할 분담을 하였습니다.




                      허프만 코드 개념
         ■ 허프만코드 : 일종의 파일 압축 알고리즘

회의 내용   텍스트에 나타나는 특정 문자에 대한 빈도수를 이용
        자주 사용되는 문자는 짧은 코드를, 자주 사용하지 않는 문자는 긴 코드를 지정
        실제 평균 문자 코드 길이를 줄여 압축하는 방법
        파일에 사용되는 문자의 사용빈도가 높은 것은 이진 트리의 높은 위치에, 낮은 것은
        이진트리의 낮은 위치에 놓아 코드화
        허프만 코드는 접두 코드를 회피하여 문자 표현
        어떤 코드가 다른 코드의 접두사가 되지 않으면 코드의 길이는 서로 달라도 문자를
        표현하는데 지장 없음
        이진트리를 생성하여 트리의 왼쪽 종속트리로 갈 때에는 0, 오른쪽 종속트리로 갈 때에는
        1로 코드화
        허프만 코드는 가장 널리 쓰이는 압축 방법
        문자가 나타나는 빈도수에 따라 그 크기를 다르게 하는 것 : 빈도수 의존 코드 모음과 'L',
        'R', 'S', 'N', 'T' 등과 같이 자주 나타나는 문자들은 더 작은 비트를 할당
■ 허프만코드 예제

각각의 확률이 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 -
■ 초기 코드
   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 -
둘째날                2012 년      6 월       19 일   화요일
회의주제                 허프만 코드 알고리즘을 이용하여 프로그램 작성
회의내용   허프만 코드를 사용하여 Group Code를 만드는 방법.




                              - 4 -
결과 발표
          #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 -
input = fopen(argv[1],"r");


if (!input) {
fprintf(stderr,"Can not open a file. : %s n",argv[1]);
getch();
exit(1);
}
InitArr();
while ( !feof(input) ) {
tmp_c = fgetc(input);
printf("%c",tmp_c);
if( tmp_c >= 65 && tmp_c <= 90 )tmp_c += 32;
for( i = 0 ; i < a_size ; i++ ) {
if( arr[a_size-1]->ch != -1 )
ReInitArr();
if( arr[i]->ch == tmp_c ) {
arr[i]->freq++;
break
}
else if( arr[i]->ch == -1 ) {
arr[i]->ch = tmp_c;
arr[i]->freq++;
c_size++;
break
}
}
}
printf("n");
SortingArr(arr);
for( i = 0 ; i < c_size ; i++ )
*arr[i] = *a_temp[i];


InitCode();
Coding(h_code,1);


result = (Node **)malloc(c_size*sizeof(Node *));
for( i = 0 ; i < c_size ; i++ ) {
result[i] = (Node *)malloc(c_size*sizeof(Node));
result[i]->freq = 0;
result[i]->ch = -1;
}
MakeCode(h_code[0],result,0,1<<1);
for( i = 0, c[0] = 0 ; i < c_size ; i++ ) {
printf("%c",result[i]->ch);
while( result[i]->freq != 1 ) {
if( result[i]->freq & 1 ) {
result[i]->freq >>= 1;




                                      - 6 -
temp[0] = '1'
temp[1] = 0;
}
else {
result[i]->freq >>= 1;
temp[0] = '0'
temp[1] = 0;
}
strcat(temp,c);
strcpy(c,temp);
}


printf(" %sn",c);
for( j = 0 ; j < 32 ; j++ )
c[j] = 0;
}


printf("계°e속¼O하CI시½A려·A면¸e 아¾Æ무¹≪키A°나³ª 누´ⓒ르¸£세¼¼요¿a......");
getch();
}


void InitArr() {
int i;
a_size = 40;
arr = (Node **)malloc(a_size*sizeof(Node *));
a_temp = (Node **)malloc(a_size*sizeof(Node *));
for( i = 0 ; i < a_size ; i++ ) {
arr[i] = (Node *)malloc(sizeof(Node));
arr[i]->ch = -1;
arr[i]->freq = 0;
a_temp[i] = (Node *)malloc(a_size*sizeof(Node));
a_temp[i]->ch = -1;
a_temp[i]->freq = 0;
}
}


void ReInitArr() {
int i = a_size;
a_size += 5;
arr = (Node **)realloc(arr,a_size*sizeof(Node *));
for( ; i < a_size ; i++ ) {
arr[i] = (Node *)malloc(sizeof(Node));
arr[i]->ch = -1;
arr[i]->freq = 0;
}
}


void SortingArr(Node **Target) {




                                    - 7 -
int x,i;
Node *min;
min = (Node *)malloc(sizeof(Node));
for( x = 0 ; x < a_size ; x++ ) {
min->freq = 60000;
for( i = 0 ; i < a_size ; i++ ) {
if( Target[i]->ch == -1 )break
if( Target[i]->ch == -2 )continue
if( ( min->freq > Target[i]->freq ) ) {
min->ch = Target[i]->ch;
min->freq = Target[i]->freq;
}
}
if( min->freq != 60000 ) {
a_temp[x]->ch = min->ch;
a_temp[x]->freq = min->freq;
}
for( i = 0 ; i < a_size ; i++ ) {
if( min->ch == Target[i]->ch ) {
Target[i]->ch = -2;
Target[i]->freq = 60000;
}
}
}
}


void InitCode() {
int i;
h_code = (Code **)malloc(sizeof(Code *));
c_temp = (Code **)malloc(sizeof(Code *));
for( i = 0 ;i < c_size ; i++ ) {
h_code[i] = (Code *)malloc(sizeof(Code));
h_code[i]->ch = arr[i]->ch;
h_code[i]->num = -1;
h_code[i]->freq = arr[i]->freq;
h_code[i]->right = (Code *)malloc(sizeof(Code));
h_code[i]->reft = (Code *)malloc(sizeof(Code));
h_code[i]->right = NULL;
h_code[i]->reft = NULL;
c_temp[i] = (Code *)malloc(sizeof(Code));
c_temp[i]->num = -1;
c_temp[i]->ch = -1;
c_temp[i]->freq = 0;
c_temp[i]->reft = (Code *)malloc(sizeof(Code));
c_temp[i]->right = (Code *)malloc(sizeof(Code));
c_temp[i]->reft = NULL;
c_temp[i]->right = NULL;
}




                                      - 8 -
}


void Coding(Code **Target,int n) {
Code *tmp;
int i;
if( n >= c_size )return
tmp = (Code *)malloc(sizeof(Code));
tmp->reft = (Code *)malloc(sizeof(Code));
tmp->right = (Code *)malloc(sizeof(Code));
tmp->num = n;
tmp->ch = -3;
tmp->freq = Target[0]->freq + Target[1]->freq;
tmp->reft->ch = Target[0]->ch;
tmp->reft->freq = Target[0]->freq;
tmp->reft->num = Target[0]->num;
tmp->reft->reft = Target[0]->reft;
tmp->reft->right = Target[0]->right;
tmp->right->ch = Target[1]->ch;
tmp->right->freq = Target[1]->freq;
tmp->right->num = Target[1]->num;
tmp->right->reft = Target[1]->reft;
tmp->right->right = Target[1]->right;
*Target[0] = *tmp;
Target[1]->num = -2;
Target[1]->ch = -2;
Target[1]->freq = 60000;
Target[1]->reft = NULL;
Target[1]->right = NULL;
SortingCode(Target);
for( i = 0 ; i < c_size ; i++ ) {
*Target[i] = *c_temp[i];
c_temp[i]->num = -1;
c_temp[i]->ch = -1;
c_temp[i]->freq = 0;
c_temp[i]->reft = NULL;
c_temp[i]->right = NULL;
}
free(tmp);
Coding(Target,++n);
}


void SortingCode(Code **Target) {
int x,i;
Code *min;
min = (Code *)malloc(sizeof(Code));
for( x = 0 ; x < c_size ; x++ ) {
min->freq = 60000;
for( i = 0 ; i < c_size ; i++ ) {




                                      - 9 -
if( Target[i]->ch == -1 )break
if( Target[i]->ch == -2 && Target[i]->num == -2 )continue
if( ( min->freq > Target[i]->freq ) ) {
min->num = Target[i]->num;
min->ch = Target[i]->ch;
min->freq = Target[i]->freq;
min->reft = Target[i]->reft;
min->right = Target[i]->right;
}
}
if( min->freq != 60000 ) {
c_temp[x]->num = min->num;
c_temp[x]->ch = min->ch;
c_temp[x]->freq = min->freq;
c_temp[x]->reft = min->reft;
c_temp[x]->right = min->right;
}
for( i = 0 ; i < c_size ; i++ ) {
if( min->ch == Target[i]->ch && min->num == Target[i]->num ) {
Target[i]->num = -2;
Target[i]->ch = -2;
Target[i]->freq = 60000;
Target[i]->reft = NULL;
Target[i]->right = NULL;
}
}
}
}


int MakeCode(Code *Target,Node **k,int i,int n) {


if( Target->reft == NULL && Target->right == NULL ) {
k[i]->ch = Target->ch;
k[i]->freq = (n>>1);
i++;
n = 1;
n <<= 1;
}
else {
i = MakeCode(Target->reft,k,i,n<<1);
i = MakeCode(Target->right,k,i,(n+1)<<1);
}
return i;
}




                                    - 10 -
최종 반성




        - 11 -

More Related Content

PDF
이산수학07
JeongJunYong
 
PDF
2012 Ds B1 01
seonhyung
 
PPTX
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Isaac Jeon
 
PDF
자료구조 그래프 보고서
mil23
 
PPTX
C++ 11 에 대해서 쉽게 알아봅시다 1부
Gwangwhi Mah
 
PDF
2012 Dm 07
Jungyerin
 
PPTX
강의자료 2
Young Wook Kim
 
PPTX
[KGC 2011]Boost 라이브러리와 C++11
흥배 최
 
이산수학07
JeongJunYong
 
2012 Ds B1 01
seonhyung
 
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Isaac Jeon
 
자료구조 그래프 보고서
mil23
 
C++ 11 에 대해서 쉽게 알아봅시다 1부
Gwangwhi Mah
 
2012 Dm 07
Jungyerin
 
강의자료 2
Young Wook Kim
 
[KGC 2011]Boost 라이브러리와 C++11
흥배 최
 

What's hot (20)

PDF
[C++ Korea 2nd Seminar] C++17 Key Features Summary
Chris Ohk
 
PDF
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
Chris Ohk
 
PDF
2012 Dm A0 07 Pdf
kd19h
 
PDF
이산치 과제7
mil23
 
PDF
자료구조 05 최종 보고서
pkok15
 
PDF
Cpp 0x kimRyungee
scor7910
 
PPTX
빠르게 활용하는 파이썬3 스터디(ch1~4)
SeongHyun Ahn
 
PDF
Python vs Java @ PyCon Korea 2017
Insuk (Chris) Cho
 
PDF
프로그래밍 대회: C++11 이야기
Jongwook Choi
 
PDF
2013 C++ Study For Students #1
Chris Ohk
 
PDF
C++17 Key Features Summary - Ver 2
Chris Ohk
 
PDF
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
Tae Young Lee
 
PPTX
[devil's camp] - 알고리즘 대회와 STL (박인서)
NAVER D2
 
PPTX
C++정리 스마트포인터
fefe7270
 
PPT
Tcpdump
jeonghoon
 
PPTX
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
DongMin Choi
 
PDF
2018 Ajou Programming Contest solutions
현정 김
 
PDF
자료구조 프로젝트
hyungoh kim
 
PDF
6장 표현식 및 문장
재정 이
 
PPTX
불어오는 변화의 바람, From c++98 to c++11, 14
명신 김
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
Chris Ohk
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
Chris Ohk
 
2012 Dm A0 07 Pdf
kd19h
 
이산치 과제7
mil23
 
자료구조 05 최종 보고서
pkok15
 
Cpp 0x kimRyungee
scor7910
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
SeongHyun Ahn
 
Python vs Java @ PyCon Korea 2017
Insuk (Chris) Cho
 
프로그래밍 대회: C++11 이야기
Jongwook Choi
 
2013 C++ Study For Students #1
Chris Ohk
 
C++17 Key Features Summary - Ver 2
Chris Ohk
 
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
Tae Young Lee
 
[devil's camp] - 알고리즘 대회와 STL (박인서)
NAVER D2
 
C++정리 스마트포인터
fefe7270
 
Tcpdump
jeonghoon
 
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
DongMin Choi
 
2018 Ajou Programming Contest solutions
현정 김
 
자료구조 프로젝트
hyungoh kim
 
6장 표현식 및 문장
재정 이
 
불어오는 변화의 바람, From c++98 to c++11, 14
명신 김
 
Ad

Viewers also liked (20)

PDF
Discussion continuum - Rewolucja biotechnologiczna
Xplore Health
 
PDF
2012 Dm A0 04 Pdf
jinwookhong
 
PDF
Fontes de Recurso do Terceiro Setor - Novembro
Portal Voluntários Online
 
PDF
Gcdについて?
Shun Nakahara
 
PPS
2012.06.28_商業周刊
ERA Taiwan Master Franchise ,Inc.
 
PPT
Kebijakan ppald limbah domestik
Ruruh Wisona
 
PDF
โครงการฟิสิกส์รุ่นเยาว์
krunok2555
 
DOCX
B3 Πρωτεΐνες
gymzosim
 
PPT
24年6月版事業紹介
Nozomi Ichikawa
 
PPTX
Día #16
agustinfernandezcolon
 
DOC
Chto takoe veb_2_0
Лилия Кухоренко
 
PDF
Gestão de Projetos 2012 - Módulo 1: O Terceiro Setor
Portal Voluntários Online
 
PDF
My profile
smile_tamonwan
 
PDF
Upsr canang 2 k 1 2010
SELVAM PERUMAL
 
PPTX
Presentatie Argentum
slise
 
PDF
Libraries, patron, and e-books 2012 Estudo da Pew Internet (22 de Junho 2012)
lerparaviver
 
PDF
Neupert Siker Akadémia
Attila Neupert
 
PPT
Your fm magazine №53
Universal Media Group (UMG)
 
Discussion continuum - Rewolucja biotechnologiczna
Xplore Health
 
2012 Dm A0 04 Pdf
jinwookhong
 
Fontes de Recurso do Terceiro Setor - Novembro
Portal Voluntários Online
 
Gcdについて?
Shun Nakahara
 
2012.06.28_商業周刊
ERA Taiwan Master Franchise ,Inc.
 
Kebijakan ppald limbah domestik
Ruruh Wisona
 
โครงการฟิสิกส์รุ่นเยาว์
krunok2555
 
B3 Πρωτεΐνες
gymzosim
 
24年6月版事業紹介
Nozomi Ichikawa
 
Chto takoe veb_2_0
Лилия Кухоренко
 
Gestão de Projetos 2012 - Módulo 1: O Terceiro Setor
Portal Voluntários Online
 
My profile
smile_tamonwan
 
Upsr canang 2 k 1 2010
SELVAM PERUMAL
 
Presentatie Argentum
slise
 
Libraries, patron, and e-books 2012 Estudo da Pew Internet (22 de Junho 2012)
lerparaviver
 
Neupert Siker Akadémia
Attila Neupert
 
Your fm magazine №53
Universal Media Group (UMG)
 
Ad

Similar to 이산수학 C1 프로젝트 7 (20)

PDF
2012 Dm A0 07 Pdf
jinwookhong
 
PDF
이산치5보고서
KimChangHoen
 
PDF
Project#7 Group Codes Hwp
Kimjeongmoo
 
PDF
7그룹 코드
herojoon1378
 
PDF
2012 Ds A1 05
seonhyung
 
PDF
Project#3 How Fast Can We Sort Hwp
Kimjeongmoo
 
PDF
자료구조 02 최종 보고서
pkok15
 
PDF
3콤비네이션
herojoon1378
 
PDF
Project#5 통신망에서 길 찾기 Hwp
Kimjeongmoo
 
PDF
5통신망에서 길 찾기
herojoon1378
 
DOCX
자료구조 Project6
KoChungWook
 
PDF
이산치7보고서
KimChangHoen
 
PDF
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
HYUNJEONG KIM
 
PDF
자료구조05
JeongJunYong
 
PDF
자료구조05
herojoon1378
 
PDF
이산수학03
JeongJunYong
 
PDF
2012 Dm C2 03
seonhyung
 
PDF
자료구조02
JeongJunYong
 
PPTX
C review
Young Wook Kim
 
PDF
이산수학 C1 프로젝트 3
pkok15
 
2012 Dm A0 07 Pdf
jinwookhong
 
이산치5보고서
KimChangHoen
 
Project#7 Group Codes Hwp
Kimjeongmoo
 
7그룹 코드
herojoon1378
 
2012 Ds A1 05
seonhyung
 
Project#3 How Fast Can We Sort Hwp
Kimjeongmoo
 
자료구조 02 최종 보고서
pkok15
 
3콤비네이션
herojoon1378
 
Project#5 통신망에서 길 찾기 Hwp
Kimjeongmoo
 
5통신망에서 길 찾기
herojoon1378
 
자료구조 Project6
KoChungWook
 
이산치7보고서
KimChangHoen
 
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
HYUNJEONG KIM
 
자료구조05
JeongJunYong
 
자료구조05
herojoon1378
 
이산수학03
JeongJunYong
 
2012 Dm C2 03
seonhyung
 
자료구조02
JeongJunYong
 
C review
Young Wook Kim
 
이산수학 C1 프로젝트 3
pkok15
 

More from pkok15 (9)

PDF
자료구조 06 최종 보고서
pkok15
 
PDF
이산수학 C1 프로젝트 5
pkok15
 
PDF
이산수학 C1 프로젝트 4
pkok15
 
PDF
이산수학 C1 프로젝트 6
pkok15
 
PDF
이산수학 D1 프로젝트 1
pkok15
 
PDF
이산수학 D1 프로젝트 2
pkok15
 
PDF
자료구조 01 최종 보고서
pkok15
 
PDF
자료구조 03 최종 보고서
pkok15
 
PDF
자료구조 04 최종 보고서
pkok15
 
자료구조 06 최종 보고서
pkok15
 
이산수학 C1 프로젝트 5
pkok15
 
이산수학 C1 프로젝트 4
pkok15
 
이산수학 C1 프로젝트 6
pkok15
 
이산수학 D1 프로젝트 1
pkok15
 
이산수학 D1 프로젝트 2
pkok15
 
자료구조 01 최종 보고서
pkok15
 
자료구조 03 최종 보고서
pkok15
 
자료구조 04 최종 보고서
pkok15
 

이산수학 C1 프로젝트 7

  • 1. C1조 과제물 발표 조장 : 09박구남 조원 : 08민영지 09정준용 09최고봉
  • 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 -
  • 7. input = fopen(argv[1],"r"); if (!input) { fprintf(stderr,"Can not open a file. : %s n",argv[1]); getch(); exit(1); } InitArr(); while ( !feof(input) ) { tmp_c = fgetc(input); printf("%c",tmp_c); if( tmp_c >= 65 && tmp_c <= 90 )tmp_c += 32; for( i = 0 ; i < a_size ; i++ ) { if( arr[a_size-1]->ch != -1 ) ReInitArr(); if( arr[i]->ch == tmp_c ) { arr[i]->freq++; break } else if( arr[i]->ch == -1 ) { arr[i]->ch = tmp_c; arr[i]->freq++; c_size++; break } } } printf("n"); SortingArr(arr); for( i = 0 ; i < c_size ; i++ ) *arr[i] = *a_temp[i]; InitCode(); Coding(h_code,1); result = (Node **)malloc(c_size*sizeof(Node *)); for( i = 0 ; i < c_size ; i++ ) { result[i] = (Node *)malloc(c_size*sizeof(Node)); result[i]->freq = 0; result[i]->ch = -1; } MakeCode(h_code[0],result,0,1<<1); for( i = 0, c[0] = 0 ; i < c_size ; i++ ) { printf("%c",result[i]->ch); while( result[i]->freq != 1 ) { if( result[i]->freq & 1 ) { result[i]->freq >>= 1; - 6 -
  • 8. temp[0] = '1' temp[1] = 0; } else { result[i]->freq >>= 1; temp[0] = '0' temp[1] = 0; } strcat(temp,c); strcpy(c,temp); } printf(" %sn",c); for( j = 0 ; j < 32 ; j++ ) c[j] = 0; } printf("계°e속¼O하CI시½A려·A면¸e 아¾Æ무¹≪키A°나³ª 누´ⓒ르¸£세¼¼요¿a......"); getch(); } void InitArr() { int i; a_size = 40; arr = (Node **)malloc(a_size*sizeof(Node *)); a_temp = (Node **)malloc(a_size*sizeof(Node *)); for( i = 0 ; i < a_size ; i++ ) { arr[i] = (Node *)malloc(sizeof(Node)); arr[i]->ch = -1; arr[i]->freq = 0; a_temp[i] = (Node *)malloc(a_size*sizeof(Node)); a_temp[i]->ch = -1; a_temp[i]->freq = 0; } } void ReInitArr() { int i = a_size; a_size += 5; arr = (Node **)realloc(arr,a_size*sizeof(Node *)); for( ; i < a_size ; i++ ) { arr[i] = (Node *)malloc(sizeof(Node)); arr[i]->ch = -1; arr[i]->freq = 0; } } void SortingArr(Node **Target) { - 7 -
  • 9. int x,i; Node *min; min = (Node *)malloc(sizeof(Node)); for( x = 0 ; x < a_size ; x++ ) { min->freq = 60000; for( i = 0 ; i < a_size ; i++ ) { if( Target[i]->ch == -1 )break if( Target[i]->ch == -2 )continue if( ( min->freq > Target[i]->freq ) ) { min->ch = Target[i]->ch; min->freq = Target[i]->freq; } } if( min->freq != 60000 ) { a_temp[x]->ch = min->ch; a_temp[x]->freq = min->freq; } for( i = 0 ; i < a_size ; i++ ) { if( min->ch == Target[i]->ch ) { Target[i]->ch = -2; Target[i]->freq = 60000; } } } } void InitCode() { int i; h_code = (Code **)malloc(sizeof(Code *)); c_temp = (Code **)malloc(sizeof(Code *)); for( i = 0 ;i < c_size ; i++ ) { h_code[i] = (Code *)malloc(sizeof(Code)); h_code[i]->ch = arr[i]->ch; h_code[i]->num = -1; h_code[i]->freq = arr[i]->freq; h_code[i]->right = (Code *)malloc(sizeof(Code)); h_code[i]->reft = (Code *)malloc(sizeof(Code)); h_code[i]->right = NULL; h_code[i]->reft = NULL; c_temp[i] = (Code *)malloc(sizeof(Code)); c_temp[i]->num = -1; c_temp[i]->ch = -1; c_temp[i]->freq = 0; c_temp[i]->reft = (Code *)malloc(sizeof(Code)); c_temp[i]->right = (Code *)malloc(sizeof(Code)); c_temp[i]->reft = NULL; c_temp[i]->right = NULL; } - 8 -
  • 10. } void Coding(Code **Target,int n) { Code *tmp; int i; if( n >= c_size )return tmp = (Code *)malloc(sizeof(Code)); tmp->reft = (Code *)malloc(sizeof(Code)); tmp->right = (Code *)malloc(sizeof(Code)); tmp->num = n; tmp->ch = -3; tmp->freq = Target[0]->freq + Target[1]->freq; tmp->reft->ch = Target[0]->ch; tmp->reft->freq = Target[0]->freq; tmp->reft->num = Target[0]->num; tmp->reft->reft = Target[0]->reft; tmp->reft->right = Target[0]->right; tmp->right->ch = Target[1]->ch; tmp->right->freq = Target[1]->freq; tmp->right->num = Target[1]->num; tmp->right->reft = Target[1]->reft; tmp->right->right = Target[1]->right; *Target[0] = *tmp; Target[1]->num = -2; Target[1]->ch = -2; Target[1]->freq = 60000; Target[1]->reft = NULL; Target[1]->right = NULL; SortingCode(Target); for( i = 0 ; i < c_size ; i++ ) { *Target[i] = *c_temp[i]; c_temp[i]->num = -1; c_temp[i]->ch = -1; c_temp[i]->freq = 0; c_temp[i]->reft = NULL; c_temp[i]->right = NULL; } free(tmp); Coding(Target,++n); } void SortingCode(Code **Target) { int x,i; Code *min; min = (Code *)malloc(sizeof(Code)); for( x = 0 ; x < c_size ; x++ ) { min->freq = 60000; for( i = 0 ; i < c_size ; i++ ) { - 9 -
  • 11. if( Target[i]->ch == -1 )break if( Target[i]->ch == -2 && Target[i]->num == -2 )continue if( ( min->freq > Target[i]->freq ) ) { min->num = Target[i]->num; min->ch = Target[i]->ch; min->freq = Target[i]->freq; min->reft = Target[i]->reft; min->right = Target[i]->right; } } if( min->freq != 60000 ) { c_temp[x]->num = min->num; c_temp[x]->ch = min->ch; c_temp[x]->freq = min->freq; c_temp[x]->reft = min->reft; c_temp[x]->right = min->right; } for( i = 0 ; i < c_size ; i++ ) { if( min->ch == Target[i]->ch && min->num == Target[i]->num ) { Target[i]->num = -2; Target[i]->ch = -2; Target[i]->freq = 60000; Target[i]->reft = NULL; Target[i]->right = NULL; } } } } int MakeCode(Code *Target,Node **k,int i,int n) { if( Target->reft == NULL && Target->right == NULL ) { k[i]->ch = Target->ch; k[i]->freq = (n>>1); i++; n = 1; n <<= 1; } else { i = MakeCode(Target->reft,k,i,n<<1); i = MakeCode(Target->right,k,i,(n+1)<<1); } return i; } - 10 -
  • 12. 최종 반성 - 11 -