SlideShare uma empresa Scribd logo
1 de 14
Baixar para ler offline
REPORT
      Project #4: 상호참조 생성기




C1
김무경
박태원
김정훈
김슬기
김종진
목 차


  1. 프 로 젝 트 개 요

      2. 전 체 일 정

         3. 회 의 록

       4. 조 사 자 료

       5. 알 고 리 즘

      6. 결 과 소 스
1. 프로젝트 개요

1) 목표
자료구조에서 트리의 사용법을 알 수 있다.

2) 과제
① 파일을 읽어서 그 안에 있는 모든 문자를 다음과 같은 형식으로 알파벳 순으로 출력합니다.

                                             단어가 나타난
                     단어            단어의 빈도수
                                              줄 번호

② 우리가 만드는 상호참조 생성기는 대소문자를 구별하지 않습니다. 따라서 Did, did는 같은
      문자로 취급합니다.
③ 예를들어 다음과 같은 문장 두 줄이 들어있는 파일을 상호참조 생성기로 돌린 결과는 다음과
      같습니다.
ex)
입력:
1. Twas brilling and the slithy toves
2. Did gyre and gimble in the qabe
출력:
       Word        Count           Lines
        and          2               1 2
      brilling       1                1
         did         1                2
      gimble         1                2
        gyre         1                2
          in         1                2
       slithy        1                1
         the         2               1 2
       toves         1                1
        twas         1                2
       wabe          1                2
       Total         11

④ 프로그램을 만들기 위해서 어떠한 트리를 사용해도 됨
⑤ 파일을 파싱할 동안에 파일의 상호참조를 작성하기 위해서 트리를 사용하라.
2. 전체 일정

           일 정                        내 용

     2012. 05. 01 화     조원별 업무 분담 및 계획작성

     ~ 2012. 05. 08 화   자료조사 내용 발표 및 개념정리

     ~ 2012. 05. 10 목   AVL트리에 관해 토의 및 필요한 알고리즘 내용 토의

     ~ 2012. 05. 15 화   알고리즘 정리 및 소스 검토

     ~ 2012. 05. 18 금   최종 보고서 검토, 보충 및 제출




3. 회 의 록



                         Project #4: 1st
일   시 2012. 05. 01 화           장   소 창원대 55110
       프로젝트에 대한 문제파악
       -트리를 사용하여 파일을 읽어 단어를 알파벳순으로 정렬하고
       단어의 빈도수를 출력하고 단어가 나타난 줄의 번호를 출력한다.
       어떠한 종류의 트리를 사용할건지에 대하여 토의


       각자가 공부해 올 내용에 대하여 회의(업무분담)
회의내용
       - 파일을 읽어오는 방법
       - 트리에 대한 기본개념 & 프로젝트 수행에 적절한 트리 형태 선별
       - 트리의 구현, 문자열 입력 방법 조사
       - 입력받은 문자열의 우선순위를 비교할 수 있는 함수 조사
       - 입력받은 문자열의 위치(라인넘버)를 표현할 수 있는 수단 조사
       - 밸런스드 트리와 관련된 프로그램 소스&정보 조사

참 석 자 김무경, 박태원, 김정훈, 김슬기, 김종진
Project #4: 2nd
일   시 2012. 05. 08 화       장     소 창원대 55516
       프로젝트에 필요한 문자열함수에 대해 조사해온 내용 발표


       -Strcmp : 두 개의 문자열의 사전식 순서를 비교한다.
       -strcpy : 문자열을 NULL문자가 나올 때까지 복사하는 함수입니다.
       -strcat : 문자열끼리 연결하는 함수
       -cgets : 문자열을 입력받아 문자 배열 str에 저장하는 함수


       트리에 관련된 용어와 개념정리


       노드 : 트리를 구성하는 요소
       근 노드 : 최상위 노드
회의내용
       디그리 : 노드가 가지고 있는 가지의 수
       레벨 : 최상위 노드에서 최하위 노드까지 가는데 거쳐가는 노드의 수
       부모노드 : 임의의 노드의 상위노드
       자식노드 : 임의의 노도의 하위노드
       형제노드 : 동일한 부모를 가지는 노드들
       전이진트리 : 단말노드를 제외한 모든 노드의 자식노드가 두 개
       포화이진트리 : 전 이진 트리 중에서도 단말 노드의 레벨이 모두 같다.
       완전 이진트리 : 포화이진트리에서 왼쪽에서 오른쪽으로 번호를 붙이고 지워지고
       남은번호가 연속한다면 남은 노드로 이루어진 트리는 완전이진트리입니다.
       변질트리 : 변질 트리는 단말 노드를 제외한 모든 노드의 자식이 하나 밖에 없는
       노드

참 석 자 김무경, 박태원, 김정훈, 김슬기, 김종진

                       Project #4: 3rd
일   시 2012. 05. 10 목       장     소 창원대 55516
       배열트리를 이용한 힙정렬에 대해 논의
       - 배열트리를 이용한 힙정렬을 이용해 문자를 배열할 수 있으나 문자열의 정렬에
        걸리는 시간이 오래 걸리기 때문에 기각.


       각각의 문자열에 라인넘버를 매기기 위해 텍스트 파일을 한줄씩 읽어오는 함수 뒤
       로 라인 카운터를 올리기로 함.( -> 배포된 소스에 들어가 있는 내용)
회의내용
       밸런스드 트리를 만들기 위한 토의
       - 교수님이 언급하신 AVL트리에 대해 공부하고 각각의 정렬 알고리즘(LL, RR,
        RL ,LR)을 구현하는 방법에 대해 논의


       그 외에 필요하다고 언급된 내용들의 알고리즘에 대해 논의
참 석 자 김무경, 박태원, 김정훈, 김슬기, 김종진
Project #4: 4th
 일   시 2012. 05. 10 목                  장      소 창원대 55516
           배열트리를 이용한 힙정렬에 대해 논의
           - 배열트리를 이용한 힙정렬을 이용해 문자를 배열할 수 있으나 문자열의 정렬에
             걸리는 시간이 오래 걸리기 때문에 기각.


           각각의 문자열에 라인넘버를 매기기 위해 텍스트 파일을 한줄씩 읽어오는 함수 뒤
           로 라인 카운터를 올리기로 함.( -> 배포된 소스에 들어가 있는 내용)
 회의내용
           밸런스드 트리를 만들기 위한 토의
           - 교수님이 언급하신 AVL트리에 대해 공부하고 각각의 정렬 알고리즘(LL, RR,
             RL ,LR)을 구현하는 방법에 대해 논의


           그 외에 필요하다고 언급된 내용들의 알고리즘에 대해 논의

 참 석 자 김무경, 박태원, 김정훈, 김슬기, 김종진

                              Project #4: 5th
 일   시 2012. 05. 15 화                  장      소 창원대 55516

           알고리즘 정리
 회의내용
           배포된 소스에 대해 공부해온 내용 정리


 참 석 자 김무경, 박태원, 김정훈, 김슬기, 김종진


4. 조 사 자 료

1) 이 진 트 리
이진트리(BinaryTree)
이진트리(BinaryTree)
 - 일반적인 트리는 한 노드가 N개의 자식을 가질 수 있지만 이진트리의 경우 한 노드가 최대 2개의 자식만 가
질 수 있다.
 - 다양한 분야에 활용되는 자료구조이다. 수식을 트리 형태로 표현하여 계산하게 하는 수식 이진 트리(Expression
Binary Tree),
   아주 빠른 데이터 검색을 가능케 하는 이진 탐색 트리(Binary Search Tree) 등등.
 - 이진트리의 종류 : 포화 이진 트리(Full Binary Tree), 완전 이진 트리(Complete Binary Tree), 높이 균형 트
리(Height Balanced Tree), 완전 높이 균형 트리(Completely Height Balanced Tree)

      트리(Full
포화 이진 트리(Full Binary Tree)
- 모든 레벨의 노드가 꽉 차있는 이진 트리.
- 단말 노드를 제외한 모든 노드의 차수가 2인 형태를 말한다.
트리(Complete
완전 이진 트리(Complete Binary Tree)
- 단말 노드들이 트리의 왼쪽부터 차곡차곡 채워진 형태.
- 무조건 왼쪽부터 채워져 있어야 한다.(왼쪽 하위 트리 중 하나라도 비워져있다면 해당 안됨)




트리 순회법
- 트리 순회 방법에는 3가지가 있다.
- 전위 순회(Preorder Traversal), 중위 순회(Inorder Traversal), 후위 순회(Postorder Traversal)

   순회법(Preorder
전위 순회법(Preorder Traversal)
1. 루트 노드부터 시작해서 아래로 내려 오면서
2. 왼쪽 하위 트리를 방문하고 왼쪽 하위 트리의 방문이 끝나면
3. 오른쪽 하위 트리를 방문하는 방식




   순회법(Inorder
중위 순회법(Inorder Traversal)
- 트리는 하위 트리의 집합이라고 할 수 있고 하위 트리 역시 또 다른 하위 트리의 집합이라고 할                              수 있다.
- 따라서 아래와 같은 방법으로 탐색할 수 있다.
1. 왼쪽 하위 트리부터 시작해서
2. 루트를 거쳐
3. 오른쪽 하위 트리를 방문하는 방법




- 응용 사례 : 수식 트리(Expression Tree), 중위 표기식
 - (1 * 2) + (7 - 8)을 수식 트리로 표현하면 다음 그림과 같이 나타낼 수 있다.

   순회법(Postorder
후위 순회법(Postorder Traversal)
-    전위 순회의 반대
1.   왼쪽 하위 트리부터 시작해서
2.   오른쪽 형제 노드를 방문 후
3.   루트 노드를 방문하는 방법.




- 응용 사례 : 후위 표기식. 후위 순회법을 통해 출력되는 노드를 살펴보면 후위 표기식으로 나타난다.
 - 1 2 * 7 8 - +




<C로 구현한 이진트리/트리 순회법>
2) AVL 트 리
AVL 트리란 균형이 갖춰진 이진트리를 의미한다. 균형이 갖춰져 있다는 말은 거의 완전한 이진트리를 갖춘다는
뜻이다.
완전이진트리는 검색시 O(log2 n)에 해당하는 검색속도를 유지할 수 있게 된다.
이에 따라 AVL 트리는 최적의 검색 속도를 보장하기 때문에 삽입과 삭제가 적은 경우에 아주 효율적이라고 볼 수
있다.
AVL 트리에서 가장 중요한 개념은 높이 차이를 나타내는 균형인수(Balance factor)이다.


균형 변수란 무엇인가?
간단하게 말하면 특정 노드에서 자식 노드들의 높이 차이를 말한다.
즉, 왼쪽 서브트리의 높이와 오른쪽 서브트리의 높이의 차이를 현재 노드의 균형인수라고 한다.
균형인수 = |왼쪽자식높이 - 오른쪽자식높이|




위 트리를 보면 맨 밑단의 단말노드의 균형인수는 0인 것을 알 수 있다. 왜냐하면 자식들이 없으니까 높이 차이는
0 이다.
이로써 제일 왼쪽의 단말노드의 부모의 균형인수는 1이 되는 이유가 설명이 된다. 이렇게 전체적으로 ±1을 이하를
이루는
트리를 AVL 트리라고 한다.


만약 제일 왼쪽에 또 하나의 단말노드를 붙여보자.




그렇다면 이처럼 균형인수가 2인 트리가 나타나게 된다. 이는 AVL 트리 조건이 깨져버린 것이다.
이 때 AVL 트리 구성을 위해 균형을 맞추기 위해 재구축 해야한다.


일반적으로 AVL 트리에서는 4가지 형태의 삽입으로 AVL 트리가 조건이 깨져버린다.
LL 형식, LR 형식, RR 형식, RL 형식
<LL 형식 >




A의 왼쪽 자식, 그 자식의 왼쪽으로 넣는 경우




<LR 형식>




A의 왼쪽 자식, 그 자식의 오른쪽으로 넣는 경우




<RR 형식>




A의 오른쪽 자식, 그 자식의 오른쪽으로 넣는 경우
<RL 형식>




A의 오른쪽 자식, 그 자식의 왼쪽으로 넣는 경우


여기까지 본 삽입시 AVL 트리의 조건이 깨지는 4가지 경우를 다시 한 번 정리해보겠다.


LL 형식 : A의 왼쪽(L)   자식의    왼쪽(L)에 넣는 경우
LR 형식 : A의 왼쪽(L)   자식의    오른쪽(R)에 넣는 경우
RR 형식 : A의 오른쪽(R) 자식의   오른쪽(R)에 넣는 경우
RL 형식 : A의 오른쪽(R) 자식의   왼쪽(L)에 넣는 경우


여기서 보아야할 것은 LL의 대칭은 RR 이고 LR의 대칭은 RL이라는 점이다.


이제 이러한 4가지 경우에 따라 트리를 재구축하는 방법을 알아보자.


일단 AVL 트리는 균형인수가 ±1 이하인 트리라고 했다.
삽입시 균형인수가 틀어지기 시작한 노드를 중심으로 재구축을 진행한다.


우선 LL 형식을 먼저 보자.
일단 아래를 보며 신규노드를 삽입했을 경우 빨간색 자식노드에 삽입되어 불균형이 발생하게 된다.
LL 형식은 오른쪽 회전(rotation)이라는 작업을 통해 재구축한다. 각각의 노드들에 대한 위치 변경이라고 보면 된다.


이에 대한 알고리즘은 다음과 같다.




  
                      
  




이를 코드로 표현하면 다음과 같다.




             
             
             
             


왜 B를 리턴하는가? 원래의 A 자리에 B가 결국에는 올라왔기 때문에
이에 포인터를 리턴하여 이 위치를 저장하기 위한 것이다.


신규 A' = 기존의 A를 대신하는 B 포인터
이처럼 포인터의 위치 변경만을 통해 LL 형식은 재구축 할 수 있다.

Mais conteúdo relacionado

Mais procurados

Latent Dirichlet Allocation
Latent Dirichlet AllocationLatent Dirichlet Allocation
Latent Dirichlet AllocationKyeongUkJang
 
자료구조 트리 보고서
자료구조 트리 보고서자료구조 트리 보고서
자료구조 트리 보고서mil23
 
유한 상태 기반의 한국어 형태소 분석기_이상호
유한 상태 기반의 한국어 형태소 분석기_이상호유한 상태 기반의 한국어 형태소 분석기_이상호
유한 상태 기반의 한국어 형태소 분석기_이상호Lee Ji Eun
 
C 언어 스터디 03 - 배열, 포인터
C 언어 스터디 03 - 배열, 포인터C 언어 스터디 03 - 배열, 포인터
C 언어 스터디 03 - 배열, 포인터Yu Yongwoo
 

Mais procurados (10)

Latent Dirichlet Allocation
Latent Dirichlet AllocationLatent Dirichlet Allocation
Latent Dirichlet Allocation
 
파이썬을 활용한 자연어 분석 - 추가분
파이썬을 활용한 자연어 분석 - 추가분파이썬을 활용한 자연어 분석 - 추가분
파이썬을 활용한 자연어 분석 - 추가분
 
서울 R&D 캠퍼스 자연어 수업자료
서울 R&D 캠퍼스 자연어 수업자료서울 R&D 캠퍼스 자연어 수업자료
서울 R&D 캠퍼스 자연어 수업자료
 
파이썬과 자연어 5 | 딥러닝
파이썬과 자연어 5 | 딥러닝파이썬과 자연어 5 | 딥러닝
파이썬과 자연어 5 | 딥러닝
 
자료구조 트리 보고서
자료구조 트리 보고서자료구조 트리 보고서
자료구조 트리 보고서
 
파이썬을 활용한 자연어 분석 - 2차
파이썬을 활용한 자연어 분석 - 2차파이썬을 활용한 자연어 분석 - 2차
파이썬을 활용한 자연어 분석 - 2차
 
파이썬과 자연어 1 | Word Cloud
파이썬과 자연어 1 | Word Cloud파이썬과 자연어 1 | Word Cloud
파이썬과 자연어 1 | Word Cloud
 
파이썬을 활용한 자연어 분석
파이썬을 활용한 자연어 분석파이썬을 활용한 자연어 분석
파이썬을 활용한 자연어 분석
 
유한 상태 기반의 한국어 형태소 분석기_이상호
유한 상태 기반의 한국어 형태소 분석기_이상호유한 상태 기반의 한국어 형태소 분석기_이상호
유한 상태 기반의 한국어 형태소 분석기_이상호
 
C 언어 스터디 03 - 배열, 포인터
C 언어 스터디 03 - 배열, 포인터C 언어 스터디 03 - 배열, 포인터
C 언어 스터디 03 - 배열, 포인터
 

Semelhante a DS_04

이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4KoChungWook
 
자료구조 Project4
자료구조 Project4자료구조 Project4
자료구조 Project4KoChungWook
 
이산치수학 Project7
이산치수학 Project7이산치수학 Project7
이산치수학 Project7KoChungWook
 
Project#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages HwpProject#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages HwpKimjeongmoo
 
부산 스터디 발표자료
부산 스터디 발표자료부산 스터디 발표자료
부산 스터디 발표자료shinhyunsoo
 
CoreDot TechSeminar 2018 - Session3 Doh Seungheon
CoreDot TechSeminar 2018 - Session3 Doh SeungheonCoreDot TechSeminar 2018 - Session3 Doh Seungheon
CoreDot TechSeminar 2018 - Session3 Doh SeungheonCore.Today
 
검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민종민 김
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서KimChangHoen
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 HwpKimjeongmoo
 
LDA : latent Dirichlet Allocation (Fairies NLP Series) - Korean Ver.
LDA : latent Dirichlet Allocation (Fairies NLP Series) - Korean Ver.LDA : latent Dirichlet Allocation (Fairies NLP Series) - Korean Ver.
LDA : latent Dirichlet Allocation (Fairies NLP Series) - Korean Ver.Adonis Han
 
데이터분석의 길 3 “r 워크플로우 (스토리텔링)”
데이터분석의 길 3   “r 워크플로우 (스토리텔링)”데이터분석의 길 3   “r 워크플로우 (스토리텔링)”
데이터분석의 길 3 “r 워크플로우 (스토리텔링)”Jaimie Kwon (권재명)
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서KimChangHoen
 
자료구조6보고서
자료구조6보고서자료구조6보고서
자료구조6보고서KimChangHoen
 

Semelhante a DS_04 (20)

이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4
 
자료구조 Project4
자료구조 Project4자료구조 Project4
자료구조 Project4
 
이산치수학 Project7
이산치수학 Project7이산치수학 Project7
이산치수학 Project7
 
자구4번
자구4번자구4번
자구4번
 
자료구조06
자료구조06자료구조06
자료구조06
 
자료구조06
자료구조06자료구조06
자료구조06
 
자료구조04
자료구조04자료구조04
자료구조04
 
Project#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages HwpProject#4 Syntax Of Languages Hwp
Project#4 Syntax Of Languages Hwp
 
2012 Ds 01
2012 Ds 012012 Ds 01
2012 Ds 01
 
부산 스터디 발표자료
부산 스터디 발표자료부산 스터디 발표자료
부산 스터디 발표자료
 
Mst 구하기
Mst 구하기Mst 구하기
Mst 구하기
 
CoreDot TechSeminar 2018 - Session3 Doh Seungheon
CoreDot TechSeminar 2018 - Session3 Doh SeungheonCoreDot TechSeminar 2018 - Session3 Doh Seungheon
CoreDot TechSeminar 2018 - Session3 Doh Seungheon
 
검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 
LDA : latent Dirichlet Allocation (Fairies NLP Series) - Korean Ver.
LDA : latent Dirichlet Allocation (Fairies NLP Series) - Korean Ver.LDA : latent Dirichlet Allocation (Fairies NLP Series) - Korean Ver.
LDA : latent Dirichlet Allocation (Fairies NLP Series) - Korean Ver.
 
Nlp study1
Nlp study1Nlp study1
Nlp study1
 
데이터분석의 길 3 “r 워크플로우 (스토리텔링)”
데이터분석의 길 3   “r 워크플로우 (스토리텔링)”데이터분석의 길 3   “r 워크플로우 (스토리텔링)”
데이터분석의 길 3 “r 워크플로우 (스토리텔링)”
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서
 
자료구조6보고서
자료구조6보고서자료구조6보고서
자료구조6보고서
 

DS_04

  • 1. REPORT Project #4: 상호참조 생성기 C1 김무경 박태원 김정훈 김슬기 김종진
  • 2. 목 차 1. 프 로 젝 트 개 요 2. 전 체 일 정 3. 회 의 록 4. 조 사 자 료 5. 알 고 리 즘 6. 결 과 소 스
  • 3. 1. 프로젝트 개요 1) 목표 자료구조에서 트리의 사용법을 알 수 있다. 2) 과제 ① 파일을 읽어서 그 안에 있는 모든 문자를 다음과 같은 형식으로 알파벳 순으로 출력합니다. 단어가 나타난 단어 단어의 빈도수 줄 번호 ② 우리가 만드는 상호참조 생성기는 대소문자를 구별하지 않습니다. 따라서 Did, did는 같은 문자로 취급합니다. ③ 예를들어 다음과 같은 문장 두 줄이 들어있는 파일을 상호참조 생성기로 돌린 결과는 다음과 같습니다. ex) 입력: 1. Twas brilling and the slithy toves 2. Did gyre and gimble in the qabe 출력: Word Count Lines and 2 1 2 brilling 1 1 did 1 2 gimble 1 2 gyre 1 2 in 1 2 slithy 1 1 the 2 1 2 toves 1 1 twas 1 2 wabe 1 2 Total 11 ④ 프로그램을 만들기 위해서 어떠한 트리를 사용해도 됨 ⑤ 파일을 파싱할 동안에 파일의 상호참조를 작성하기 위해서 트리를 사용하라.
  • 4. 2. 전체 일정 일 정 내 용 2012. 05. 01 화 조원별 업무 분담 및 계획작성 ~ 2012. 05. 08 화 자료조사 내용 발표 및 개념정리 ~ 2012. 05. 10 목 AVL트리에 관해 토의 및 필요한 알고리즘 내용 토의 ~ 2012. 05. 15 화 알고리즘 정리 및 소스 검토 ~ 2012. 05. 18 금 최종 보고서 검토, 보충 및 제출 3. 회 의 록 Project #4: 1st 일   시 2012. 05. 01 화 장 소 창원대 55110 프로젝트에 대한 문제파악 -트리를 사용하여 파일을 읽어 단어를 알파벳순으로 정렬하고 단어의 빈도수를 출력하고 단어가 나타난 줄의 번호를 출력한다. 어떠한 종류의 트리를 사용할건지에 대하여 토의 각자가 공부해 올 내용에 대하여 회의(업무분담) 회의내용 - 파일을 읽어오는 방법 - 트리에 대한 기본개념 & 프로젝트 수행에 적절한 트리 형태 선별 - 트리의 구현, 문자열 입력 방법 조사 - 입력받은 문자열의 우선순위를 비교할 수 있는 함수 조사 - 입력받은 문자열의 위치(라인넘버)를 표현할 수 있는 수단 조사 - 밸런스드 트리와 관련된 프로그램 소스&정보 조사 참 석 자 김무경, 박태원, 김정훈, 김슬기, 김종진
  • 5. Project #4: 2nd 일   시 2012. 05. 08 화 장 소 창원대 55516 프로젝트에 필요한 문자열함수에 대해 조사해온 내용 발표 -Strcmp : 두 개의 문자열의 사전식 순서를 비교한다. -strcpy : 문자열을 NULL문자가 나올 때까지 복사하는 함수입니다. -strcat : 문자열끼리 연결하는 함수 -cgets : 문자열을 입력받아 문자 배열 str에 저장하는 함수 트리에 관련된 용어와 개념정리 노드 : 트리를 구성하는 요소 근 노드 : 최상위 노드 회의내용 디그리 : 노드가 가지고 있는 가지의 수 레벨 : 최상위 노드에서 최하위 노드까지 가는데 거쳐가는 노드의 수 부모노드 : 임의의 노드의 상위노드 자식노드 : 임의의 노도의 하위노드 형제노드 : 동일한 부모를 가지는 노드들 전이진트리 : 단말노드를 제외한 모든 노드의 자식노드가 두 개 포화이진트리 : 전 이진 트리 중에서도 단말 노드의 레벨이 모두 같다. 완전 이진트리 : 포화이진트리에서 왼쪽에서 오른쪽으로 번호를 붙이고 지워지고 남은번호가 연속한다면 남은 노드로 이루어진 트리는 완전이진트리입니다. 변질트리 : 변질 트리는 단말 노드를 제외한 모든 노드의 자식이 하나 밖에 없는 노드 참 석 자 김무경, 박태원, 김정훈, 김슬기, 김종진 Project #4: 3rd 일   시 2012. 05. 10 목 장 소 창원대 55516 배열트리를 이용한 힙정렬에 대해 논의 - 배열트리를 이용한 힙정렬을 이용해 문자를 배열할 수 있으나 문자열의 정렬에 걸리는 시간이 오래 걸리기 때문에 기각. 각각의 문자열에 라인넘버를 매기기 위해 텍스트 파일을 한줄씩 읽어오는 함수 뒤 로 라인 카운터를 올리기로 함.( -> 배포된 소스에 들어가 있는 내용) 회의내용 밸런스드 트리를 만들기 위한 토의 - 교수님이 언급하신 AVL트리에 대해 공부하고 각각의 정렬 알고리즘(LL, RR, RL ,LR)을 구현하는 방법에 대해 논의 그 외에 필요하다고 언급된 내용들의 알고리즘에 대해 논의 참 석 자 김무경, 박태원, 김정훈, 김슬기, 김종진
  • 6. Project #4: 4th 일   시 2012. 05. 10 목 장 소 창원대 55516 배열트리를 이용한 힙정렬에 대해 논의 - 배열트리를 이용한 힙정렬을 이용해 문자를 배열할 수 있으나 문자열의 정렬에 걸리는 시간이 오래 걸리기 때문에 기각. 각각의 문자열에 라인넘버를 매기기 위해 텍스트 파일을 한줄씩 읽어오는 함수 뒤 로 라인 카운터를 올리기로 함.( -> 배포된 소스에 들어가 있는 내용) 회의내용 밸런스드 트리를 만들기 위한 토의 - 교수님이 언급하신 AVL트리에 대해 공부하고 각각의 정렬 알고리즘(LL, RR, RL ,LR)을 구현하는 방법에 대해 논의 그 외에 필요하다고 언급된 내용들의 알고리즘에 대해 논의 참 석 자 김무경, 박태원, 김정훈, 김슬기, 김종진 Project #4: 5th 일   시 2012. 05. 15 화 장 소 창원대 55516 알고리즘 정리 회의내용 배포된 소스에 대해 공부해온 내용 정리 참 석 자 김무경, 박태원, 김정훈, 김슬기, 김종진 4. 조 사 자 료 1) 이 진 트 리 이진트리(BinaryTree) 이진트리(BinaryTree) - 일반적인 트리는 한 노드가 N개의 자식을 가질 수 있지만 이진트리의 경우 한 노드가 최대 2개의 자식만 가 질 수 있다. - 다양한 분야에 활용되는 자료구조이다. 수식을 트리 형태로 표현하여 계산하게 하는 수식 이진 트리(Expression Binary Tree), 아주 빠른 데이터 검색을 가능케 하는 이진 탐색 트리(Binary Search Tree) 등등. - 이진트리의 종류 : 포화 이진 트리(Full Binary Tree), 완전 이진 트리(Complete Binary Tree), 높이 균형 트 리(Height Balanced Tree), 완전 높이 균형 트리(Completely Height Balanced Tree) 트리(Full 포화 이진 트리(Full Binary Tree) - 모든 레벨의 노드가 꽉 차있는 이진 트리. - 단말 노드를 제외한 모든 노드의 차수가 2인 형태를 말한다.
  • 7. 트리(Complete 완전 이진 트리(Complete Binary Tree) - 단말 노드들이 트리의 왼쪽부터 차곡차곡 채워진 형태. - 무조건 왼쪽부터 채워져 있어야 한다.(왼쪽 하위 트리 중 하나라도 비워져있다면 해당 안됨) 트리 순회법 - 트리 순회 방법에는 3가지가 있다. - 전위 순회(Preorder Traversal), 중위 순회(Inorder Traversal), 후위 순회(Postorder Traversal) 순회법(Preorder 전위 순회법(Preorder Traversal) 1. 루트 노드부터 시작해서 아래로 내려 오면서 2. 왼쪽 하위 트리를 방문하고 왼쪽 하위 트리의 방문이 끝나면 3. 오른쪽 하위 트리를 방문하는 방식 순회법(Inorder 중위 순회법(Inorder Traversal) - 트리는 하위 트리의 집합이라고 할 수 있고 하위 트리 역시 또 다른 하위 트리의 집합이라고 할 수 있다. - 따라서 아래와 같은 방법으로 탐색할 수 있다.
  • 8. 1. 왼쪽 하위 트리부터 시작해서 2. 루트를 거쳐 3. 오른쪽 하위 트리를 방문하는 방법 - 응용 사례 : 수식 트리(Expression Tree), 중위 표기식 - (1 * 2) + (7 - 8)을 수식 트리로 표현하면 다음 그림과 같이 나타낼 수 있다. 순회법(Postorder 후위 순회법(Postorder Traversal) - 전위 순회의 반대 1. 왼쪽 하위 트리부터 시작해서 2. 오른쪽 형제 노드를 방문 후 3. 루트 노드를 방문하는 방법. - 응용 사례 : 후위 표기식. 후위 순회법을 통해 출력되는 노드를 살펴보면 후위 표기식으로 나타난다. - 1 2 * 7 8 - + <C로 구현한 이진트리/트리 순회법>
  • 9.
  • 10. 2) AVL 트 리 AVL 트리란 균형이 갖춰진 이진트리를 의미한다. 균형이 갖춰져 있다는 말은 거의 완전한 이진트리를 갖춘다는 뜻이다. 완전이진트리는 검색시 O(log2 n)에 해당하는 검색속도를 유지할 수 있게 된다. 이에 따라 AVL 트리는 최적의 검색 속도를 보장하기 때문에 삽입과 삭제가 적은 경우에 아주 효율적이라고 볼 수 있다.
  • 11. AVL 트리에서 가장 중요한 개념은 높이 차이를 나타내는 균형인수(Balance factor)이다. 균형 변수란 무엇인가? 간단하게 말하면 특정 노드에서 자식 노드들의 높이 차이를 말한다. 즉, 왼쪽 서브트리의 높이와 오른쪽 서브트리의 높이의 차이를 현재 노드의 균형인수라고 한다. 균형인수 = |왼쪽자식높이 - 오른쪽자식높이| 위 트리를 보면 맨 밑단의 단말노드의 균형인수는 0인 것을 알 수 있다. 왜냐하면 자식들이 없으니까 높이 차이는 0 이다. 이로써 제일 왼쪽의 단말노드의 부모의 균형인수는 1이 되는 이유가 설명이 된다. 이렇게 전체적으로 ±1을 이하를 이루는 트리를 AVL 트리라고 한다. 만약 제일 왼쪽에 또 하나의 단말노드를 붙여보자. 그렇다면 이처럼 균형인수가 2인 트리가 나타나게 된다. 이는 AVL 트리 조건이 깨져버린 것이다. 이 때 AVL 트리 구성을 위해 균형을 맞추기 위해 재구축 해야한다. 일반적으로 AVL 트리에서는 4가지 형태의 삽입으로 AVL 트리가 조건이 깨져버린다. LL 형식, LR 형식, RR 형식, RL 형식
  • 12. <LL 형식 > A의 왼쪽 자식, 그 자식의 왼쪽으로 넣는 경우 <LR 형식> A의 왼쪽 자식, 그 자식의 오른쪽으로 넣는 경우 <RR 형식> A의 오른쪽 자식, 그 자식의 오른쪽으로 넣는 경우
  • 13. <RL 형식> A의 오른쪽 자식, 그 자식의 왼쪽으로 넣는 경우 여기까지 본 삽입시 AVL 트리의 조건이 깨지는 4가지 경우를 다시 한 번 정리해보겠다. LL 형식 : A의 왼쪽(L) 자식의 왼쪽(L)에 넣는 경우 LR 형식 : A의 왼쪽(L) 자식의 오른쪽(R)에 넣는 경우 RR 형식 : A의 오른쪽(R) 자식의 오른쪽(R)에 넣는 경우 RL 형식 : A의 오른쪽(R) 자식의 왼쪽(L)에 넣는 경우 여기서 보아야할 것은 LL의 대칭은 RR 이고 LR의 대칭은 RL이라는 점이다. 이제 이러한 4가지 경우에 따라 트리를 재구축하는 방법을 알아보자. 일단 AVL 트리는 균형인수가 ±1 이하인 트리라고 했다. 삽입시 균형인수가 틀어지기 시작한 노드를 중심으로 재구축을 진행한다. 우선 LL 형식을 먼저 보자. 일단 아래를 보며 신규노드를 삽입했을 경우 빨간색 자식노드에 삽입되어 불균형이 발생하게 된다.
  • 14. LL 형식은 오른쪽 회전(rotation)이라는 작업을 통해 재구축한다. 각각의 노드들에 대한 위치 변경이라고 보면 된다. 이에 대한 알고리즘은 다음과 같다.                 이를 코드로 표현하면 다음과 같다.                                     왜 B를 리턴하는가? 원래의 A 자리에 B가 결국에는 올라왔기 때문에 이에 포인터를 리턴하여 이 위치를 저장하기 위한 것이다. 신규 A' = 기존의 A를 대신하는 B 포인터 이처럼 포인터의 위치 변경만을 통해 LL 형식은 재구축 할 수 있다.