2. 과제수행일지
소속 조원
자료조사 및 보고서
A0 조장 : 송하윤 작성 : 알고리즘 : 김도형 코딩 : 홍진욱
조부관,김무경,장진승
과제수행기간 5일 6시간
I. 계획의 작성
연구제목 Group codes
알파뱃을 이진수로 변환하여 압축하는 프로그램을 만들어 압축에 대한
연구배경
기본적인 원리를 알게 하는 것.
참고자료 참고 URL C로 쓴 자료구조론
II. 계획의 실행
첫째 날 2012년 6월 11일 월요일
오늘의 작업 조원의 업무 분담과 학습할 내용 및 과제에 대한 이해와 숙지
조장 : 송하윤
알고리즘 : 김도형
자료조사 및 보고서 작성 : 김무경, 조부관, 장진승
코딩 : 홍진욱
토의 내용
프로젝트를 진행하기에 앞서 그룹코드에 대한 기본적인 이해를 돕기위해 각자 아는 부
분에 대하여 논의 하고, 업무 분담을 통하여 부족한 부분에 대한 자료조사와 연구를 하
기로함.
둘째 날 2012년 6월 13일 수요일
트리 대해 조사해 온 자료 공유 및 회의, 서로 모르는 내용들에 대해 부가적으로
오늘의 작업 설명을 해주고 프로그램을 구현하는데 필요한 알고리즘에 대해서 조사해오기로 했다.
트리 코딩 참고자료를 보면서 트리에 대한 특징과 구현방법을 익히도록 했다.
알고리즘 설계 기법
■ 알고리즘 설계 기법
• 간단히 효율적인 알고리즘을 구할 수 있는 경우도 있지만 많은 경우 주어진 문제를 해
결하는 알고리즘을 찾는 일이 쉽지 않은 경우가 대부분이다.
• 일반적으로 알려져 있지 않은 새로운 알고리즘을 설계하기 위해서는 여러가지 기법을
동원하게 된다. 단순히 직감적으로 해를 알 수 있는 경우에는 직접 구현하겠지만 대개
의 경우 그렇게 하기는 거의 불가능하고, 설사 가능하다 하더라도 구현에 있어서는 비
토의 내용 효율적이기가 일쑤이다.
• 일반적으로 적용가능한 알고리즘 설계 기법도 많지는 않으나 비교적 단순하면서도 널
리 사용가능한 기법으로 그리디방법(Greedy method), 분할 정복(Divide and
conquer) 그리고 동적 프로그래밍(Dynamic programming)과 선형 프로그래밍(Linear
programming)등이 있다.
허프만코드 개념
■ 허프만코드 : 일종의 파일 압축 알고리즘
• 텍스트에 나타나는 특정 문자에 대한 빈도수를 이용
3. • 자주 사용되는 문자는 짧은 코드를, 자주 사용하지 않는 문자는 긴 코드를 지정
• 실제 평균 문자 코드 길이를 줄여 압축하는 방법
• 파일에 사용되는 문자의 사용빈도가 높은 것은 이진 트리의 높은 위치에, 낮은 것은
이진트리의 낮은 위치에 놓아 코드화
• 허프만 코드는 접두 코드를 회피하여 문자 표현 어떤 코드가 다른 코드의 접두사가 되
지 않으면 코드의 길이는 서로 달라도 문자를 표현하는데 지장 없음
• 이진트리를 생성하여 트리의 왼쪽 종속트리로 갈 때에는 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을 할당해서
결정)
자료조사를 토대로 트리에 대한 개념에 대해 조원별로 토의 하였다. 이 성질을 이용하
과제준비에서
여 상호참조 생성기를 어떻게 구현할 것인지 크게 구성을 짰으며, 이를 토대로 초안을
느낀 점
작성해 오기로 했다.
셋째 날 2012년 6월 18일 월요일
작성한 초안에 대한 설명을 듣고 내용을 숙지한 다음, 문제점을 파악한다. 코딩을
오늘의 작업
완성하여 수정하는 과정을 거친다.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
Group
#define M 20
codes
typedef struct{
소스 char c;
int ascii;
int cnt;
double avg;
4. }ALP;
typedef struct{
char c;
double avg;
int a[M-1];
int size;
}TEMPA;
/*Function define*/
void initAlp(ALP *a);
void alpPrt(ALP *a, int size);
int alpLen(ALP *a);
void setCnt(ALP *a, int size);
void alpSetAvg(ALP *a,int size);
void sorting(ALP *a, int size);
int sumofCnt(ALP *a, int size);
void initTemp(TEMPA *temp, int size);
void tempaSort(TEMPA *t, int start, int size);
void e();
int main(){
int scanfIndex = 0;
int len = 0, sum = 0;
int i = 0 , j = 0;
/*dynamic alloc*/
ALP *a;
a = (ALP *)malloc(sizeof(ALP)*M);
/*dynamic alloc*/
initAlp(a);
/*initialized root*/
while(1){
(a+scanfIndex)->c = getchar();
(a+scanfIndex)->cnt = 1;
if((a+scanfIndex)->c == 10)
break;
scanfIndex++;
}
/*table length*/
len = alpLen(a);
//printf("%dn",len);
/* Node Functions
NODE* createNode(NODE *node);
NODE intoNode(NODE *r,NODE *l);
void treePrt(NODE *root);
*/
/*ALP Functions
void initAlp(ALP *a);
void alpPrt(ALP *a);
int alpLen(ALP *a);
void setCnt(ALP *a, int size);
void alpSetAvg(ALP *a,int size);
8. for(i = 0 ; i < size - 1 ; i++){
for(j = i + 1 ; j < size ; j++){
if((a+i)->c == (a+j)->c){
(a+i)->cnt++;
(a+j)->c = '0';
(a+j)->avg = 0;
(a+j)->ascii = 0;
}
}
}
}
/*Length of alpha*/
int alpLen(ALP *a){
int i = 0, ct = 0;
char temp;
temp = (a+i)->c;
while(temp){
if(97 <= temp && temp <= 122){
ct++;
}
i++;
temp = (a+i)->c;
}
return ct;
}
/*initialized*/
void initTemp(TEMPA *temp, int size){
int i,j;
for(i = 0 ; i < size ; i++){
(temp+i)->c = '0';
(temp+i)->avg = 0;
for(j = 0 ; j < size ; j++){
(temp+i)->size = M-2;
}
}
}
void initAlp(ALP *a){
int i = 0;
for(i = 0 ; i < M ; i++){
(a+i)->ascii = 0;
(a+i)->c = '0';
(a+i)->cnt = 0;
(a+i)->avg = 0;
}
}
/*Alpha's value*/
int sumofCnt(ALP *a, int size){
int i, result = 0;
for(i = 0 ; i < size ; i++){
if(97 <= (a+i)->c && (a+i)->c <= 122){
result++;
}
}
return result;
}
/*Print*/
void alpPrt(ALP *a, int size){
9. int i = 0;
while(i != size){
if(97 <= (a+i)->c && (a+i)->c <= 122)
printf("%ct%dt%.2lfn",(a+i)->c,(a+i)->cnt,(a+i)->avg);
i++;
}
}
void e(){
printf("n");
}
III. 결과
최종 프로그램
소스와 설명