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

What's hot

2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdfkd19h
 
이산치 과제7
이산치 과제7이산치 과제7
이산치 과제7mil23
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
Chris Ohk
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11흥배 최
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
Chris Ohk
 
자료구조 프로젝트
자료구조 프로젝트자료구조 프로젝트
자료구조 프로젝트
hyungoh kim
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)SeongHyun Ahn
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
Jongwook Choi
 
자료구조 05 최종 보고서
자료구조 05 최종 보고서자료구조 05 최종 보고서
자료구조 05 최종 보고서pkok15
 
Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungeescor7910
 
[devil's camp] - 알고리즘 대회와 STL (박인서)
[devil's camp] - 알고리즘 대회와 STL (박인서)[devil's camp] - 알고리즘 대회와 STL (박인서)
[devil's camp] - 알고리즘 대회와 STL (박인서)
NAVER D2
 
2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions
현정 김
 
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
Tae Young Lee
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
Chris Ohk
 
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
DongMin Choi
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터fefe7270
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017
Insuk (Chris) Cho
 
iOS 메모리관리
iOS 메모리관리iOS 메모리관리
iOS 메모리관리
Changwon National University
 
Tcpdump
TcpdumpTcpdump
Tcpdump
jeonghoon
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
Chris Ohk
 

What's hot (20)

2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 
이산치 과제7
이산치 과제7이산치 과제7
이산치 과제7
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
자료구조 프로젝트
자료구조 프로젝트자료구조 프로젝트
자료구조 프로젝트
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
자료구조 05 최종 보고서
자료구조 05 최종 보고서자료구조 05 최종 보고서
자료구조 05 최종 보고서
 
Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungee
 
[devil's camp] - 알고리즘 대회와 STL (박인서)
[devil's camp] - 알고리즘 대회와 STL (박인서)[devil's camp] - 알고리즘 대회와 STL (박인서)
[devil's camp] - 알고리즘 대회와 STL (박인서)
 
2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions
 
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017
 
iOS 메모리관리
iOS 메모리관리iOS 메모리관리
iOS 메모리관리
 
Tcpdump
TcpdumpTcpdump
Tcpdump
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
 

Similar to 이산수학07

2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdfjinwookhong
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
Jae-yeol Lee
 
7그룹 코드
7그룹 코드7그룹 코드
7그룹 코드
herojoon1378
 
자료구조05
자료구조05자료구조05
자료구조05
herojoon1378
 
Project#7 Group Codes Hwp
Project#7 Group Codes HwpProject#7 Group Codes Hwp
Project#7 Group Codes HwpKimjeongmoo
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서KimChangHoen
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013Esun Kim
 
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Ki-Hwan Kim
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee
 
이산치5보고서
이산치5보고서이산치5보고서
이산치5보고서KimChangHoen
 
2012 Ds A1 05
2012 Ds A1 052012 Ds A1 05
2012 Ds A1 05seonhyung
 
RNC C++ lecture_5 Array
RNC C++ lecture_5 ArrayRNC C++ lecture_5 Array
RNC C++ lecture_5 Array
itlockit
 
1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)fmbvbfhs
 
RNC C++ lecture_4 While, For
RNC C++ lecture_4 While, ForRNC C++ lecture_4 While, For
RNC C++ lecture_4 While, For
itlockit
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의
Kwangyoun Jung
 
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
tcaesvk
 
객체지향 정리. Part1
객체지향 정리. Part1객체지향 정리. Part1
객체지향 정리. Part1
kim HYUNG JIN
 

Similar to 이산수학07 (20)

2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
7그룹 코드
7그룹 코드7그룹 코드
7그룹 코드
 
자료구조05
자료구조05자료구조05
자료구조05
 
자료구조05
자료구조05자료구조05
자료구조05
 
Project#7 Group Codes Hwp
Project#7 Group Codes HwpProject#7 Group Codes Hwp
Project#7 Group Codes Hwp
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
 
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
이산치5보고서
이산치5보고서이산치5보고서
이산치5보고서
 
2012 Ds A1 05
2012 Ds A1 052012 Ds A1 05
2012 Ds A1 05
 
자구2번
자구2번자구2번
자구2번
 
RNC C++ lecture_5 Array
RNC C++ lecture_5 ArrayRNC C++ lecture_5 Array
RNC C++ lecture_5 Array
 
1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)
 
RNC C++ lecture_4 While, For
RNC C++ lecture_4 While, ForRNC C++ lecture_4 While, For
RNC C++ lecture_4 While, For
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의
 
2012 Ds 01
2012 Ds 012012 Ds 01
2012 Ds 01
 
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
 
객체지향 정리. Part1
객체지향 정리. Part1객체지향 정리. Part1
객체지향 정리. Part1
 

More from JeongJunYong

More from JeongJunYong (10)

자료구조01
자료구조01자료구조01
자료구조01
 
자료구조06
자료구조06자료구조06
자료구조06
 
자료구조03
자료구조03자료구조03
자료구조03
 
자료구조02
자료구조02자료구조02
자료구조02
 
자료구조01
자료구조01자료구조01
자료구조01
 
이산수학06
이산수학06이산수학06
이산수학06
 
이산수학05
이산수학05이산수학05
이산수학05
 
이산수학04
이산수학04이산수학04
이산수학04
 
이산수학03
이산수학03이산수학03
이산수학03
 
이산수학02
이산수학02이산수학02
이산수학02
 

이산수학07

  • 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 -