SlideShare une entreprise Scribd logo
1  sur  7
Télécharger pour lire hors ligne
Group Code




                     D0조


             20113281 김정무
             20113623 김슬기
             20113315 정민정
             20113283 김종진
             20093534 허규준
팀명    D0

연구제목   Group Code


연구목표   호프만 알고리즘의 개념과 사용법을 안다


 일정    ① 06.13 수요일


       ① 자료조사 : 허규준 김종진
 역할    ② 프로그램작성 : 김슬기 정민정
       ③ 조장 : 김정무

       2012. 06. 13 수요일

       프로그램은 문자를 입력받으면 단어 빈도수대로 정렬을 한 후 빈도수가 같
       거나 비슷한 단어를 묶어서 이진트리로 만드는 호프만 알고리즘을 사용하기
회의내용
       로 하였다.




       #include <stdio.h>
       #include <string.h>
       #include <stdlib.h>
       #include <windows.h>


       #define MAX 256


       int freq[MAX];
       static char sen[MAX]
       ="ABCDEABCABC"

최종소스
       typedef struct _huf
       {
       int count;
       char data;
       struct _huf *left,*right;
       } huf;


       huf *head[MAX];
       int nhead;
       huf *huf_head;
       unsigned code[256];
       int len[256];
void get_freq(void){
int i;
for(i=0;i<MAX;i++)
freq[i]=0;
for(i=0;i<MAX;i++)
if(sen[i]!='0')
freq[sen[i]]++;
}


int find_minimum(void){
int mindex,i;
mindex=0;
for(i=1;i<nhead;i++)
{
if(head[i]->count < head[mindex]->count)
mindex=i;
}
return mindex;
}


void construct_tree(void){
int i,m;
huf *h,*h1,*h2;


for(i=nhead=0;i<MAX;i++)
{
if(freq[i]!=0)
{
if((h=(huf *)malloc(sizeof(huf))) == NULL)
{
printf("nError : out of memory.");
exit(1);
}
h->count=freq[i];
h->data=i;
h->left=h->right=NULL;
head[nhead++]=h;
}
}


while(nhead>1)
{
m=find_minimum();
h1=head[m];
head[m]=head[--nhead];
m=find_minimum();
h2=head[m];
if((h=(huf*)malloc(sizeof(huf))) == NULL)
{
printf("nError : out of memory.");
exit(1);
}


h->count=h1->count+h2->count;
h->data=0;
h->left=h1;
h->right=h2;
head[m]=h;
}
huf_head=head[0];
}



void show_freq(void){
int i;
for(i=0 ; i<MAX ; i++)
{
if(freq[i]==0)
continue
printf("t %c t %dn",i,freq[i]);
}
}


void _make_code(huf *h,unsigned c, int l){
if(h->left != NULL || h->right !=NULL)
{
c<<=1;
l++;
_make_code(h->left,c,l);
c|=1u;
_make_code(h->right,c,l);
c >>= 1;
l--;
}
else
{
code[h->data]=c;
len[h->data]=l;
}
}


void make_code(void){
int i;
for(i=0;i<256;i++)
code[i]=len[i]=0;
_make_code(huf_head,0u,0);
}


#define bi_max_code 14


int code_leng(void){
int i,max=0;
for(i=0 ; i<MAX ; i++)
if(max<len[i])
max=len[i];
return max;
}


void huffman_comp(){
char ch;
int i,j,bi_code[bi_max_code],temp,max;



get_freq();
construct_tree();
make_code();
max=code_leng();


printf("빈도수n");
show_freq();



printf("t문자t코드t코드의 길이n");
for(i=0 ; i<MAX ; i++)
{
if(len[i]!=0)
{
temp=code[i];
for(j=1 ; j<=len[i]; j++)
       {
       bi_code[len[i]-j]=temp%2;
       temp/=2;
       }
       printf("t %ct",i);
       if(max>len[i])
       for(j=0;j<max-len[i];j++)
       printf(" ");
       for(j=0 ; j<len[i];j++)
       printf("%d",bi_code[j]);
       printf("t       %dn",len[i]);
       }
       }
       }


       void main(void){
       int a;
       int sen_leng = strlen(sen);
       huffman_comp();
       scanf("%d",&a);
       }


문제점
       허프만 코드는 문자들을 가변 길이의 비트 스트링으로 표현하는 것으로, 아
       스키 코드나 다른 고정 길이 코드들에 대한 대안을 제공한다. 기본 개념은
       많이 사용되는 문자들을 표현하기 위해서는 짧은 길이의 비트 스트링을 사
       용하고, 적게 사용되는 글자들에 대해서는 긴 길이의 비트 스트링을 사용하
       는 것이다. 이런 식으로 하면, 일반적으로 텍스트와 프로그램과 같은 문자열
       들을 표현하는데 있어서 아스키 코드를 사용하는 것보다 적은 공간을 사용
       할 수 있다.
       알파벳의 열로서 이루어진 메시지가 있고 각 메시지의 영문자가 각각 독립
       적이고 위치에 관계없이 어떤 정해진 빈도수로 나타내면 우리는 그것을 가
조사자료
       지고 0과 1의 열로서 코드화할 수 있다. 어느 영문자의 코드도 다른 어떤
       문자의 코드의 접두어로 표현되어서는 안 된다. 예를 들어 a가 01이고 b가
       010이면 a는 b의 접두어가 되므로 적합하지가 않다. 이러한 특성을 이용하
       여 최소 개의 코드로써 정확하게 송신할 수 있으며 수신된 코드를 정확하게
       코드화할 수 있다. 이렇게 구현한 것을 허프만 알고리즘이라고 한다.


       허프만 알고리즘 순서
            가장 낮은 빈도를 갖는 두 문자를 선택하여 가상의 다른 문자로 대치한
       다. 다른 문자가 나타날 빈도수는 합하여진 두 문자의 빈도 합이다.
위의 과정을 반복하여 최종 빈도수가 전체의 합과 같을 때 까지 계속한
         다.
              최종적인 트리가 완성되면 각 서브트리의 왼쪽에는 0을 부여하고 오른
         쪽에는 1을 각각 부여하여 각 문자의 코드를 결정한다.
참고 url

Contenu connexe

Tendances

4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터Hoyoung Jung
 
2 swift 상수_변수_튜플
2 swift 상수_변수_튜플2 swift 상수_변수_튜플
2 swift 상수_변수_튜플Changwon National University
 
이산치수학 Project7
이산치수학 Project7이산치수학 Project7
이산치수학 Project7KoChungWook
 
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)단어 의미 중의성 해소, Word Sense Disambiguation(WSD)
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)찬희 이
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장HolyTak
 

Tendances (8)

4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터
 
3.포인터
3.포인터3.포인터
3.포인터
 
2 swift 상수_변수_튜플
2 swift 상수_변수_튜플2 swift 상수_변수_튜플
2 swift 상수_변수_튜플
 
이산치수학 Project7
이산치수학 Project7이산치수학 Project7
이산치수학 Project7
 
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)단어 의미 중의성 해소, Word Sense Disambiguation(WSD)
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장
 
Java standard(8~13)
Java standard(8~13)Java standard(8~13)
Java standard(8~13)
 
9. pointer
9. pointer9. pointer
9. pointer
 

Similaire à Project#7 Group Codes Hwp

이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7pkok15
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdfkd19h
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdfjinwookhong
 
이산치 과제7
이산치 과제7이산치 과제7
이산치 과제7mil23
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Jaejin Yun
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여iamprogrammerofficial
 
델파이와 유니코드
델파이와 유니코드델파이와 유니코드
델파이와 유니코드Devgear
 
자료구조 Project6
자료구조 Project6자료구조 Project6
자료구조 Project6KoChungWook
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01seonhyung
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍준혁 이
 
깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)Jay Park
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부JiHyung Lee
 
프로그래밍 및 실습 Chap2
프로그래밍 및 실습 Chap2프로그래밍 및 실습 Chap2
프로그래밍 및 실습 Chap2dktm
 
Clean code(02)
Clean code(02)Clean code(02)
Clean code(02)규열 김
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의Kwangyoun Jung
 

Similaire à Project#7 Group Codes Hwp (20)

이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7
 
이산수학07
이산수학07이산수학07
이산수학07
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 
이산치 과제7
이산치 과제7이산치 과제7
이산치 과제7
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
 
델파이와 유니코드
델파이와 유니코드델파이와 유니코드
델파이와 유니코드
 
자료구조 Project6
자료구조 Project6자료구조 Project6
자료구조 Project6
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
 
깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부
 
프로그래밍 및 실습 Chap2
프로그래밍 및 실습 Chap2프로그래밍 및 실습 Chap2
프로그래밍 및 실습 Chap2
 
2012 Ds 01
2012 Ds 012012 Ds 01
2012 Ds 01
 
자구2번
자구2번자구2번
자구2번
 
Clean code(02)
Clean code(02)Clean code(02)
Clean code(02)
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의
 

Plus de Kimjeongmoo

Project#6 오탈자 검사 D0 Hwp
Project#6 오탈자 검사 D0 HwpProject#6 오탈자 검사 D0 Hwp
Project#6 오탈자 검사 D0 HwpKimjeongmoo
 
Project#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpProject#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpKimjeongmoo
 
Project#4상호참조 생성기 Hwp
Project#4상호참조 생성기 HwpProject#4상호참조 생성기 Hwp
Project#4상호참조 생성기 HwpKimjeongmoo
 
Project#3다항식의연산 Hwp
Project#3다항식의연산 HwpProject#3다항식의연산 Hwp
Project#3다항식의연산 HwpKimjeongmoo
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 HwpKimjeongmoo
 
Project#1파스칼 삼각형
Project#1파스칼 삼각형Project#1파스칼 삼각형
Project#1파스칼 삼각형Kimjeongmoo
 
Project#6 2 비트 덧셈기 Hwp
Project#6 2 비트 덧셈기 HwpProject#6 2 비트 덧셈기 Hwp
Project#6 2 비트 덧셈기 HwpKimjeongmoo
 
Project#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpProject#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpKimjeongmoo
 
Project#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages HwpProject#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages HwpKimjeongmoo
 
Project#3 How Fast Can We Sort Hwp
Project#3 How Fast Can We Sort HwpProject#3 How Fast Can We Sort Hwp
Project#3 How Fast Can We Sort HwpKimjeongmoo
 
Project#2 데이터베이스 시스템 Hwp
Project#2 데이터베이스 시스템 HwpProject#2 데이터베이스 시스템 Hwp
Project#2 데이터베이스 시스템 HwpKimjeongmoo
 
Project#1 지식 기반 시스템 Hwp
Project#1 지식 기반 시스템 HwpProject#1 지식 기반 시스템 Hwp
Project#1 지식 기반 시스템 HwpKimjeongmoo
 

Plus de Kimjeongmoo (12)

Project#6 오탈자 검사 D0 Hwp
Project#6 오탈자 검사 D0 HwpProject#6 오탈자 검사 D0 Hwp
Project#6 오탈자 검사 D0 Hwp
 
Project#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpProject#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 Hwp
 
Project#4상호참조 생성기 Hwp
Project#4상호참조 생성기 HwpProject#4상호참조 생성기 Hwp
Project#4상호참조 생성기 Hwp
 
Project#3다항식의연산 Hwp
Project#3다항식의연산 HwpProject#3다항식의연산 Hwp
Project#3다항식의연산 Hwp
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 
Project#1파스칼 삼각형
Project#1파스칼 삼각형Project#1파스칼 삼각형
Project#1파스칼 삼각형
 
Project#6 2 비트 덧셈기 Hwp
Project#6 2 비트 덧셈기 HwpProject#6 2 비트 덧셈기 Hwp
Project#6 2 비트 덧셈기 Hwp
 
Project#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpProject#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 Hwp
 
Project#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages HwpProject#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages Hwp
 
Project#3 How Fast Can We Sort Hwp
Project#3 How Fast Can We Sort HwpProject#3 How Fast Can We Sort Hwp
Project#3 How Fast Can We Sort Hwp
 
Project#2 데이터베이스 시스템 Hwp
Project#2 데이터베이스 시스템 HwpProject#2 데이터베이스 시스템 Hwp
Project#2 데이터베이스 시스템 Hwp
 
Project#1 지식 기반 시스템 Hwp
Project#1 지식 기반 시스템 HwpProject#1 지식 기반 시스템 Hwp
Project#1 지식 기반 시스템 Hwp
 

Project#7 Group Codes Hwp

  • 1. Group Code D0조 20113281 김정무 20113623 김슬기 20113315 정민정 20113283 김종진 20093534 허규준
  • 2. 팀명 D0 연구제목 Group Code 연구목표 호프만 알고리즘의 개념과 사용법을 안다 일정 ① 06.13 수요일 ① 자료조사 : 허규준 김종진 역할 ② 프로그램작성 : 김슬기 정민정 ③ 조장 : 김정무 2012. 06. 13 수요일 프로그램은 문자를 입력받으면 단어 빈도수대로 정렬을 한 후 빈도수가 같 거나 비슷한 단어를 묶어서 이진트리로 만드는 호프만 알고리즘을 사용하기 회의내용 로 하였다. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <windows.h> #define MAX 256 int freq[MAX]; static char sen[MAX] ="ABCDEABCABC" 최종소스 typedef struct _huf { int count; char data; struct _huf *left,*right; } huf; huf *head[MAX]; int nhead; huf *huf_head; unsigned code[256]; int len[256];
  • 3. void get_freq(void){ int i; for(i=0;i<MAX;i++) freq[i]=0; for(i=0;i<MAX;i++) if(sen[i]!='0') freq[sen[i]]++; } int find_minimum(void){ int mindex,i; mindex=0; for(i=1;i<nhead;i++) { if(head[i]->count < head[mindex]->count) mindex=i; } return mindex; } void construct_tree(void){ int i,m; huf *h,*h1,*h2; for(i=nhead=0;i<MAX;i++) { if(freq[i]!=0) { if((h=(huf *)malloc(sizeof(huf))) == NULL) { printf("nError : out of memory."); exit(1); } h->count=freq[i]; h->data=i; h->left=h->right=NULL; head[nhead++]=h; } } while(nhead>1) {
  • 4. m=find_minimum(); h1=head[m]; head[m]=head[--nhead]; m=find_minimum(); h2=head[m]; if((h=(huf*)malloc(sizeof(huf))) == NULL) { printf("nError : out of memory."); exit(1); } h->count=h1->count+h2->count; h->data=0; h->left=h1; h->right=h2; head[m]=h; } huf_head=head[0]; } void show_freq(void){ int i; for(i=0 ; i<MAX ; i++) { if(freq[i]==0) continue printf("t %c t %dn",i,freq[i]); } } void _make_code(huf *h,unsigned c, int l){ if(h->left != NULL || h->right !=NULL) { c<<=1; l++; _make_code(h->left,c,l); c|=1u; _make_code(h->right,c,l); c >>= 1; l--; } else
  • 5. { code[h->data]=c; len[h->data]=l; } } void make_code(void){ int i; for(i=0;i<256;i++) code[i]=len[i]=0; _make_code(huf_head,0u,0); } #define bi_max_code 14 int code_leng(void){ int i,max=0; for(i=0 ; i<MAX ; i++) if(max<len[i]) max=len[i]; return max; } void huffman_comp(){ char ch; int i,j,bi_code[bi_max_code],temp,max; get_freq(); construct_tree(); make_code(); max=code_leng(); printf("빈도수n"); show_freq(); printf("t문자t코드t코드의 길이n"); for(i=0 ; i<MAX ; i++) { if(len[i]!=0) { temp=code[i];
  • 6. for(j=1 ; j<=len[i]; j++) { bi_code[len[i]-j]=temp%2; temp/=2; } printf("t %ct",i); if(max>len[i]) for(j=0;j<max-len[i];j++) printf(" "); for(j=0 ; j<len[i];j++) printf("%d",bi_code[j]); printf("t %dn",len[i]); } } } void main(void){ int a; int sen_leng = strlen(sen); huffman_comp(); scanf("%d",&a); } 문제점 허프만 코드는 문자들을 가변 길이의 비트 스트링으로 표현하는 것으로, 아 스키 코드나 다른 고정 길이 코드들에 대한 대안을 제공한다. 기본 개념은 많이 사용되는 문자들을 표현하기 위해서는 짧은 길이의 비트 스트링을 사 용하고, 적게 사용되는 글자들에 대해서는 긴 길이의 비트 스트링을 사용하 는 것이다. 이런 식으로 하면, 일반적으로 텍스트와 프로그램과 같은 문자열 들을 표현하는데 있어서 아스키 코드를 사용하는 것보다 적은 공간을 사용 할 수 있다. 알파벳의 열로서 이루어진 메시지가 있고 각 메시지의 영문자가 각각 독립 적이고 위치에 관계없이 어떤 정해진 빈도수로 나타내면 우리는 그것을 가 조사자료 지고 0과 1의 열로서 코드화할 수 있다. 어느 영문자의 코드도 다른 어떤 문자의 코드의 접두어로 표현되어서는 안 된다. 예를 들어 a가 01이고 b가 010이면 a는 b의 접두어가 되므로 적합하지가 않다. 이러한 특성을 이용하 여 최소 개의 코드로써 정확하게 송신할 수 있으며 수신된 코드를 정확하게 코드화할 수 있다. 이렇게 구현한 것을 허프만 알고리즘이라고 한다. 허프만 알고리즘 순서 가장 낮은 빈도를 갖는 두 문자를 선택하여 가상의 다른 문자로 대치한 다. 다른 문자가 나타날 빈도수는 합하여진 두 문자의 빈도 합이다.
  • 7. 위의 과정을 반복하여 최종 빈도수가 전체의 합과 같을 때 까지 계속한 다. 최종적인 트리가 완성되면 각 서브트리의 왼쪽에는 0을 부여하고 오른 쪽에는 1을 각각 부여하여 각 문자의 코드를 결정한다. 참고 url