SlideShare a Scribd company logo
1 of 9
Download to read offline
A0조 이산치 수학
Project 보고서




          조장 : 송하윤
          조원 : 조부관
              홍진욱
              김무경
              김도형
              장진승
과제수행일지
  소속                                       조원
                         자료조사 및 보고서
  A0      조장 : 송하윤            작성 :         알고리즘 : 김도형                코딩 : 홍진욱
                         조부관,김무경,장진승
과제수행기간                                  5일 6시간
                               I. 계획의 작성
 연구제목    Group codes
         알파뱃을 이진수로 변환하여 압축하는 프로그램을 만들어 압축에 대한
 연구배경
         기본적인 원리를 알게 하는 것.


 참고자료     참고 URL       C로 쓴 자료구조론



                              II. 계획의 실행
 첫째 날                     2012년 6월 11일 월요일
오늘의 작업           조원의 업무 분담과 학습할 내용 및 과제에 대한 이해와 숙지
         조장 : 송하윤
         알고리즘 : 김도형
         자료조사 및 보고서 작성 : 김무경, 조부관, 장진승
         코딩 : 홍진욱
토의 내용

         프로젝트를 진행하기에 앞서 그룹코드에 대한 기본적인 이해를 돕기위해 각자 아는 부
         분에 대하여 논의 하고, 업무 분담을 통하여 부족한 부분에 대한 자료조사와 연구를 하
         기로함.
 둘째 날                             2012년 6월 13일 수요일
           트리 대해 조사해 온 자료 공유 및 회의, 서로 모르는 내용들에 대해 부가적으로
오늘의 작업   설명을 해주고 프로그램을 구현하는데 필요한 알고리즘에 대해서 조사해오기로 했다.
            트리 코딩 참고자료를 보면서 트리에 대한 특징과 구현방법을 익히도록 했다.
         알고리즘 설계 기법
         ■ 알고리즘 설계 기법
             •   간단히 효율적인 알고리즘을 구할 수 있는 경우도 있지만 많은 경우 주어진 문제를 해
                 결하는 알고리즘을 찾는 일이 쉽지 않은 경우가 대부분이다.
             •   일반적으로 알려져 있지 않은 새로운 알고리즘을 설계하기 위해서는 여러가지 기법을
                 동원하게 된다. 단순히 직감적으로 해를 알 수 있는 경우에는 직접 구현하겠지만 대개
                 의 경우 그렇게 하기는 거의 불가능하고, 설사 가능하다 하더라도 구현에 있어서는 비
토의 내용            효율적이기가 일쑤이다.
             •   일반적으로 적용가능한 알고리즘 설계 기법도 많지는 않으나 비교적 단순하면서도 널
                 리   사용가능한   기법으로     그리디방법(Greedy   method),   분할   정복(Divide   and
                 conquer) 그리고 동적 프로그래밍(Dynamic programming)과 선형 프로그래밍(Linear
                 programming)등이 있다.
                                      허프만코드 개념
         ■ 허프만코드 : 일종의 파일 압축 알고리즘
             •   텍스트에 나타나는 특정 문자에 대한 빈도수를 이용
•    자주 사용되는 문자는 짧은 코드를, 자주 사용하지 않는 문자는 긴 코드를 지정
               •    실제 평균 문자 코드 길이를 줄여 압축하는 방법
               •    파일에 사용되는 문자의 사용빈도가 높은 것은 이진 트리의 높은 위치에, 낮은 것은
                    이진트리의 낮은 위치에 놓아 코드화
               •    허프만 코드는 접두 코드를 회피하여 문자 표현 어떤 코드가 다른 코드의 접두사가 되
                    지 않으면 코드의 길이는 서로 달라도 문자를 표현하는데 지장 없음
               •    이진트리를 생성하여 트리의 왼쪽 종속트리로 갈 때에는 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;
}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);
void sorting(ALP *a, int size);
*/

/*1*/
//alpPrt(a, len);
/*2*/
setCnt(a, len);
//alpPrt(a, len);
/*3*/
alpSetAvg(a, len);
//alpPrt(a, len);
/*4*/
sorting(a, len);
//alpPrt(a, len);

sum = sumofCnt(a, len);

/*Create Node*/
TEMPA tempa[sum];
//
TEMPA tempasort[sum];
//
initTemp(tempa,sum);
int tempindex = 0;
for(i = 0 ; i < len ; i++){
         if(97 <= (a+i)->c && (a+i)->c <= 122){
                   tempa[tempindex].c = (a+i)->c;
                   tempa[tempindex].avg = (a+i)->avg;
                   for(j = 0 ; j < M - 1; j++){
                            tempa[tempindex].a[j] = 2;
                   }
                   tempindex++;
         }
}
e();

for(i = 0 ; i < tempindex ; i++){
          printf("%ct%.2lf",tempa[i].c, tempa[i].avg);
          for(j = 0 ; j < M-1 ; j++){
    if(tempa[i].a[j] != 2)
                            printf("[%d]",tempa[i].a[j]);
          }e();
}e();
/*
*
*     솔팅 -> 트리 -> 루프
*
*/
int front,rear,sumavg,mid,k;
rear = tempindex - 1;
front = rear - 1;
mid = rear;

sumavg = tempa[i].avg + tempa[i-1].avg;
tempa[rear].avg = sumavg;
tempa[front].avg = sumavg;
for(i = tempindex - 1 ; i > 0 ; i--){
if(tempa[i].avg == tempa[i-1].avg){
                            for(j = front ; j < mid ; j++){
                            tempa[j].a[tempa[j].size] = 0;
                            }
                            for(j = mid ; j <= rear ; j++){
                 tempa[j].a[tempa[j].size] = 1;
                            }
                            for(j = front ; j <= rear ; j++){
                 tempa[j].size--;
                            }
                            mid = front;
                            front--;
                            sumavg = 0;
                            tempaSort(tempa, front, rear);
                            for(j = front ; j < rear ; j++){
                                      sumavg = sumavg + tempa[j].avg;
                            }
                            for(j = front ; j < rear ; j++){
                                      tempa[j].avg = sumavg;
                            }
                   }
           }
// 여기서 프린트하기전 일단 알파벳 순으로 정렬
int alpa, beta=0;
for(alpa=97;alpa<123;alpa++)
     for(i = 0 ; i < tempindex ; i++)
             if(tempa[i].c==(char)alpa)
                 tempasort[beta++]=tempa[i];//정렬부분
// 비정렬부분
           for(i = 0 ; i < tempindex ; i++){
                     printf("%ctcode =",tempa[i].c);
                     for(j = 0 ; j < M-1 ; j++){
                              if(tempa[i].a[j] != 2){
                                        printf("%d",tempa[i].a[j]);
                              }
                     }e();
           }
           printf("n");

//정렬한거 출력.
      for(i = 0 ; i < tempindex ; i++){
                printf("%ctcode =",tempasort[i].c);
                for(j = 0 ; j < M-1 ; j++){
                         if(tempasort[i].a[j] != 2){
                                  printf("%d",tempasort[i].a[j]);
                         }
                }e();
      }
      getch();
      return 0;
}

void tempaSort(TEMPA *t, int start, int size){
        int i,j;
        TEMPA tm;
        TEMPA *temp;
        temp = (TEMPA *)malloc(sizeof(TEMPA)*size);
temp = &tm;
         for(i = size ; i > 0 ; i--){
                   for(j = 0 ; j < i ; j++){
                            if((t+j)->avg < (t+j+1)->avg){
                 temp->avg = (t+j)->avg;
                 temp->c = (t+j)->c;

                (t+j)->avg = (t+j+1)->avg;
                (t+j)->c = (t+j+1)->c;

                (t+j+1)->avg = temp->avg;
                (t+j+1)->c = temp->c;
                          }
                  }
         }
}

void sorting(ALP *a, int size){
         int i,j;
         ALP t;
         ALP *temp;
         temp = (ALP *)malloc(sizeof(ALP)*M);
         temp = &t;
         for(i = size ; i > 0 ; i--){
                   for(j = 0 ; j < i ; j++){
                            if((a+j)->avg < (a+j+1)->avg){
                                       /*change*/
                                       temp->ascii = (a+j)->ascii;
                                       temp->avg = (a+j)->avg;
                                       temp->c = (a+j)->c;
                                       temp->cnt = (a+j)->cnt;

                                     (a+j)->ascii = (a+j+1)->ascii;
                                     (a+j)->avg = (a+j+1)->avg;
                                     (a+j)->c = (a+j+1)->c;
                                     (a+j)->cnt = (a+j+1)->cnt;

                                     (a+j+1)->ascii = temp->ascii;
                                     (a+j+1)->avg = temp->avg;
                                     (a+j+1)->c = temp->c;
                                     (a+j+1)->cnt = temp->cnt;
                            }
                  }
         }
}

/*average alpha*/
void alpSetAvg(ALP *a,int size){
         int i;
         for(i = 0 ; i < size ; i++){
                  (a+i)->avg = (double)(a+i)->cnt/(double)size;
         }
}
/*Set alpha*/
void setCnt(ALP *a,int size){
         int i,j;
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){
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. 결과




최종 프로그램
소스와 설명

More Related Content

What's hot

파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) Tae Young Lee
 
2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdfkd19h
 
자료구조 트리 보고서
자료구조 트리 보고서자료구조 트리 보고서
자료구조 트리 보고서mil23
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석용 최
 
Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungeescor7910
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01seonhyung
 
파이썬 데이터 분석 3종세트
파이썬 데이터 분석 3종세트파이썬 데이터 분석 3종세트
파이썬 데이터 분석 3종세트itproman35
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Jaejin Yun
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Insuk (Chris) Cho
 
자료구조 Project5
자료구조 Project5자료구조 Project5
자료구조 Project5KoChungWook
 
자료구조 그래프 보고서
자료구조 그래프 보고서자료구조 그래프 보고서
자료구조 그래프 보고서mil23
 

What's hot (18)

파이썬으로 익히는 딥러닝
파이썬으로 익히는 딥러닝파이썬으로 익히는 딥러닝
파이썬으로 익히는 딥러닝
 
Erlang
ErlangErlang
Erlang
 
Python basic
Python basicPython basic
Python basic
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
 
2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf
 
Python - Module
Python - ModulePython - Module
Python - Module
 
자료구조 트리 보고서
자료구조 트리 보고서자료구조 트리 보고서
자료구조 트리 보고서
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석
 
Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungee
 
2012 Ds 06
2012 Ds 062012 Ds 06
2012 Ds 06
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01
 
파이썬 데이터 분석 3종세트
파이썬 데이터 분석 3종세트파이썬 데이터 분석 3종세트
파이썬 데이터 분석 3종세트
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017
 
자료구조 Project5
자료구조 Project5자료구조 Project5
자료구조 Project5
 
자료구조 그래프 보고서
자료구조 그래프 보고서자료구조 그래프 보고서
자료구조 그래프 보고서
 
2012 Dm 07
2012 Dm 072012 Dm 07
2012 Dm 07
 
3콤비네이션
3콤비네이션3콤비네이션
3콤비네이션
 

Viewers also liked

IEEE TISP Boot Camp 2014
IEEE TISP Boot Camp 2014IEEE TISP Boot Camp 2014
IEEE TISP Boot Camp 2014Bibin Thomas
 
EU celtic-plus seminar in Oslo at Telenor 3 march 2014: Future Internet
EU celtic-plus seminar in Oslo at Telenor 3 march 2014: Future InternetEU celtic-plus seminar in Oslo at Telenor 3 march 2014: Future Internet
EU celtic-plus seminar in Oslo at Telenor 3 march 2014: Future InternetHans A. Kielland Aanesen
 
The Temple Part 1: The Biography of a Place
The Temple Part 1: The Biography of a PlaceThe Temple Part 1: The Biography of a Place
The Temple Part 1: The Biography of a PlaceDigitalSojourner
 
Marriott management philosophy
Marriott management philosophyMarriott management philosophy
Marriott management philosophyFawad Akhtar
 
Introduction to Unix-like systems (Part I-IV)
Introduction to Unix-like systems (Part I-IV)Introduction to Unix-like systems (Part I-IV)
Introduction to Unix-like systems (Part I-IV)hildenjohannes
 
Bio Diversity Worksheet 2 (EcoSlate - 2014)
Bio Diversity Worksheet 2 (EcoSlate - 2014)Bio Diversity Worksheet 2 (EcoSlate - 2014)
Bio Diversity Worksheet 2 (EcoSlate - 2014)i-dream
 
글자맞추기
글자맞추기글자맞추기
글자맞추기Bora Na
 
Psychology Education And Training In The United States
Psychology Education And Training In The United StatesPsychology Education And Training In The United States
Psychology Education And Training In The United StatesMarco Peña
 
[KR, 한국어]Share job postings; 채용 공고 공유하기
[KR, 한국어]Share job postings; 채용 공고 공유하기[KR, 한국어]Share job postings; 채용 공고 공유하기
[KR, 한국어]Share job postings; 채용 공고 공유하기Jungmi Choi
 
Social Fresh West Content Marketing: Good To Great
Social Fresh West Content Marketing: Good To Great Social Fresh West Content Marketing: Good To Great
Social Fresh West Content Marketing: Good To Great Zena Weist
 

Viewers also liked (15)

The Scool of Our Dreams - made by students of Inova
The Scool of Our Dreams - made by students of InovaThe Scool of Our Dreams - made by students of Inova
The Scool of Our Dreams - made by students of Inova
 
EnMS-Doc_Profile-7.0
EnMS-Doc_Profile-7.0EnMS-Doc_Profile-7.0
EnMS-Doc_Profile-7.0
 
Microorganisms (3) (2)
Microorganisms (3) (2)Microorganisms (3) (2)
Microorganisms (3) (2)
 
PROforma QUALITY FIRST
PROforma QUALITY FIRSTPROforma QUALITY FIRST
PROforma QUALITY FIRST
 
IEEE TISP Boot Camp 2014
IEEE TISP Boot Camp 2014IEEE TISP Boot Camp 2014
IEEE TISP Boot Camp 2014
 
EU celtic-plus seminar in Oslo at Telenor 3 march 2014: Future Internet
EU celtic-plus seminar in Oslo at Telenor 3 march 2014: Future InternetEU celtic-plus seminar in Oslo at Telenor 3 march 2014: Future Internet
EU celtic-plus seminar in Oslo at Telenor 3 march 2014: Future Internet
 
The Temple Part 1: The Biography of a Place
The Temple Part 1: The Biography of a PlaceThe Temple Part 1: The Biography of a Place
The Temple Part 1: The Biography of a Place
 
Marriott management philosophy
Marriott management philosophyMarriott management philosophy
Marriott management philosophy
 
Introduction to Unix-like systems (Part I-IV)
Introduction to Unix-like systems (Part I-IV)Introduction to Unix-like systems (Part I-IV)
Introduction to Unix-like systems (Part I-IV)
 
Bio Diversity Worksheet 2 (EcoSlate - 2014)
Bio Diversity Worksheet 2 (EcoSlate - 2014)Bio Diversity Worksheet 2 (EcoSlate - 2014)
Bio Diversity Worksheet 2 (EcoSlate - 2014)
 
글자맞추기
글자맞추기글자맞추기
글자맞추기
 
Psychology Education And Training In The United States
Psychology Education And Training In The United StatesPsychology Education And Training In The United States
Psychology Education And Training In The United States
 
4 pom kc 13 sep. 2010
4 pom kc 13 sep. 20104 pom kc 13 sep. 2010
4 pom kc 13 sep. 2010
 
[KR, 한국어]Share job postings; 채용 공고 공유하기
[KR, 한국어]Share job postings; 채용 공고 공유하기[KR, 한국어]Share job postings; 채용 공고 공유하기
[KR, 한국어]Share job postings; 채용 공고 공유하기
 
Social Fresh West Content Marketing: Good To Great
Social Fresh West Content Marketing: Good To Great Social Fresh West Content Marketing: Good To Great
Social Fresh West Content Marketing: Good To Great
 

Similar to 이산치 과제7

2012 Ds B2 02
2012 Ds B2 022012 Ds B2 02
2012 Ds B2 02chl132435
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서KimChangHoen
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서KimChangHoen
 
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
 
이산치6보고서
이산치6보고서이산치6보고서
이산치6보고서KimChangHoen
 
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요Yongho Ha
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요KTH
 
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호KTH, 케이티하이텔
 
이산치수학 Project7
이산치수학 Project7이산치수학 Project7
이산치수학 Project7KoChungWook
 
Project#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpProject#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpKimjeongmoo
 
자료구조5보고서
자료구조5보고서자료구조5보고서
자료구조5보고서KimChangHoen
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 HwpKimjeongmoo
 
이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4KoChungWook
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfjinwookhong
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfkd19h
 
Project#7 Group Codes Hwp
Project#7 Group Codes HwpProject#7 Group Codes Hwp
Project#7 Group Codes HwpKimjeongmoo
 

Similar to 이산치 과제7 (20)

2012 Ds B2 02
2012 Ds B2 022012 Ds B2 02
2012 Ds B2 02
 
2012 Ds 01
2012 Ds 012012 Ds 01
2012 Ds 01
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서
 
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
 
이산치6보고서
이산치6보고서이산치6보고서
이산치6보고서
 
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요
 
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
 
7그룹 코드
7그룹 코드7그룹 코드
7그룹 코드
 
이산치수학 Project7
이산치수학 Project7이산치수학 Project7
이산치수학 Project7
 
자료구조02
자료구조02자료구조02
자료구조02
 
Project#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpProject#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 Hwp
 
자료구조5보고서
자료구조5보고서자료구조5보고서
자료구조5보고서
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 
이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
이산치2번
이산치2번이산치2번
이산치2번
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
Project#7 Group Codes Hwp
Project#7 Group Codes HwpProject#7 Group Codes Hwp
Project#7 Group Codes Hwp
 

More from mil23

이산치수학 데이터베이스
이산치수학 데이터베이스이산치수학 데이터베이스
이산치수학 데이터베이스mil23
 
이산치보고서
이산치보고서이산치보고서
이산치보고서mil23
 
길찾기
길찾기길찾기
길찾기mil23
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3mil23
 
프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서mil23
 
파스칼삼각형
파스칼삼각형파스칼삼각형
파스칼삼각형mil23
 
보고서1
보고서1보고서1
보고서1mil23
 
말의여행
말의여행말의여행
말의여행mil23
 

More from mil23 (8)

이산치수학 데이터베이스
이산치수학 데이터베이스이산치수학 데이터베이스
이산치수학 데이터베이스
 
이산치보고서
이산치보고서이산치보고서
이산치보고서
 
길찾기
길찾기길찾기
길찾기
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3
 
프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서프로젝트#6 (오탈자 검사)보고서
프로젝트#6 (오탈자 검사)보고서
 
파스칼삼각형
파스칼삼각형파스칼삼각형
파스칼삼각형
 
보고서1
보고서1보고서1
보고서1
 
말의여행
말의여행말의여행
말의여행
 

이산치 과제7

  • 1. A0조 이산치 수학 Project 보고서 조장 : 송하윤 조원 : 조부관 홍진욱 김무경 김도형 장진승
  • 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);
  • 5. void sorting(ALP *a, int size); */ /*1*/ //alpPrt(a, len); /*2*/ setCnt(a, len); //alpPrt(a, len); /*3*/ alpSetAvg(a, len); //alpPrt(a, len); /*4*/ sorting(a, len); //alpPrt(a, len); sum = sumofCnt(a, len); /*Create Node*/ TEMPA tempa[sum]; // TEMPA tempasort[sum]; // initTemp(tempa,sum); int tempindex = 0; for(i = 0 ; i < len ; i++){ if(97 <= (a+i)->c && (a+i)->c <= 122){ tempa[tempindex].c = (a+i)->c; tempa[tempindex].avg = (a+i)->avg; for(j = 0 ; j < M - 1; j++){ tempa[tempindex].a[j] = 2; } tempindex++; } } e(); for(i = 0 ; i < tempindex ; i++){ printf("%ct%.2lf",tempa[i].c, tempa[i].avg); for(j = 0 ; j < M-1 ; j++){ if(tempa[i].a[j] != 2) printf("[%d]",tempa[i].a[j]); }e(); }e(); /* * * 솔팅 -> 트리 -> 루프 * */ int front,rear,sumavg,mid,k; rear = tempindex - 1; front = rear - 1; mid = rear; sumavg = tempa[i].avg + tempa[i-1].avg; tempa[rear].avg = sumavg; tempa[front].avg = sumavg; for(i = tempindex - 1 ; i > 0 ; i--){
  • 6. if(tempa[i].avg == tempa[i-1].avg){ for(j = front ; j < mid ; j++){ tempa[j].a[tempa[j].size] = 0; } for(j = mid ; j <= rear ; j++){ tempa[j].a[tempa[j].size] = 1; } for(j = front ; j <= rear ; j++){ tempa[j].size--; } mid = front; front--; sumavg = 0; tempaSort(tempa, front, rear); for(j = front ; j < rear ; j++){ sumavg = sumavg + tempa[j].avg; } for(j = front ; j < rear ; j++){ tempa[j].avg = sumavg; } } } // 여기서 프린트하기전 일단 알파벳 순으로 정렬 int alpa, beta=0; for(alpa=97;alpa<123;alpa++) for(i = 0 ; i < tempindex ; i++) if(tempa[i].c==(char)alpa) tempasort[beta++]=tempa[i];//정렬부분 // 비정렬부분 for(i = 0 ; i < tempindex ; i++){ printf("%ctcode =",tempa[i].c); for(j = 0 ; j < M-1 ; j++){ if(tempa[i].a[j] != 2){ printf("%d",tempa[i].a[j]); } }e(); } printf("n"); //정렬한거 출력. for(i = 0 ; i < tempindex ; i++){ printf("%ctcode =",tempasort[i].c); for(j = 0 ; j < M-1 ; j++){ if(tempasort[i].a[j] != 2){ printf("%d",tempasort[i].a[j]); } }e(); } getch(); return 0; } void tempaSort(TEMPA *t, int start, int size){ int i,j; TEMPA tm; TEMPA *temp; temp = (TEMPA *)malloc(sizeof(TEMPA)*size);
  • 7. temp = &tm; for(i = size ; i > 0 ; i--){ for(j = 0 ; j < i ; j++){ if((t+j)->avg < (t+j+1)->avg){ temp->avg = (t+j)->avg; temp->c = (t+j)->c; (t+j)->avg = (t+j+1)->avg; (t+j)->c = (t+j+1)->c; (t+j+1)->avg = temp->avg; (t+j+1)->c = temp->c; } } } } void sorting(ALP *a, int size){ int i,j; ALP t; ALP *temp; temp = (ALP *)malloc(sizeof(ALP)*M); temp = &t; for(i = size ; i > 0 ; i--){ for(j = 0 ; j < i ; j++){ if((a+j)->avg < (a+j+1)->avg){ /*change*/ temp->ascii = (a+j)->ascii; temp->avg = (a+j)->avg; temp->c = (a+j)->c; temp->cnt = (a+j)->cnt; (a+j)->ascii = (a+j+1)->ascii; (a+j)->avg = (a+j+1)->avg; (a+j)->c = (a+j+1)->c; (a+j)->cnt = (a+j+1)->cnt; (a+j+1)->ascii = temp->ascii; (a+j+1)->avg = temp->avg; (a+j+1)->c = temp->c; (a+j+1)->cnt = temp->cnt; } } } } /*average alpha*/ void alpSetAvg(ALP *a,int size){ int i; for(i = 0 ; i < size ; i++){ (a+i)->avg = (double)(a+i)->cnt/(double)size; } } /*Set alpha*/ void setCnt(ALP *a,int size){ int i,j;
  • 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. 결과 최종 프로그램 소스와 설명