5 장 트 리

Similar documents
제 1 장 기본 개념

chap 5: Trees

7장

chap 5: Trees

슬라이드 1

08장.트리

4.1 관계

슬라이드 1

Microsoft PowerPoint - 제8장-트리.pptx

정의 이진탐색트리 이진탐색트리 (BST: binary search tree) 는각각의노드가 BST 특성을만족하는키 - 주소쌍을가지고있는이진트리 BST 특성 트리에있는각각의키에대해, 왼쪽서브트리에있는모든키는이것보다작고, 오른쪽서브트리에있는모든키는이것보다큼 < > 2

Microsoft PowerPoint - lec07_tree [호환 모드]

제 11 장 다원 탐색 트리

Microsoft PowerPoint - chap10_tree

슬라이드 1

Ch.1 Introduction

Microsoft PowerPoint - 자료구조2008Chap07

슬라이드 1

Microsoft PowerPoint - 제9장-트리의응용.pptx

입학사정관제도

Chapter 4. LISTS

05_tree

Microsoft PowerPoint - Chap5 [호환 모드]

o 경로 (path) 트리에서사용하는용어 ~ 어떤한노드에서다른노드까지링크를통해이동했을때, 거쳐온노드들의집합. o 루트 (root) ~ 트리의가장상위에있는노드로루트는항상하나만존재 o 부모, 자식 (parent, children) ~ 링크로연결된노드중위에있는노드를부모노드,

슬라이드 1

슬라이드 1

PowerPoint 프레젠테이션

e-비즈니스 전략 수립

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Chapter 4. LISTS

슬라이드 제목 없음

Microsoft PowerPoint - Chap5 [호환 모드]

Microsoft PowerPoint - 6장 탐색.pptx

Chapter 08. 트리(Tree)

제 9 장 우선순위 큐

슬라이드 1

슬라이드 1

슬라이드 1

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint Merging and Sorting Files.ppt

Chap 6: Graphs

1장. 리스트

11장 포인터

PowerPoint 프레젠테이션

Lab 3. 실습문제 (Single linked list)_해답.hwp

11강-힙정렬.ppt

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

Microsoft PowerPoint - 알고리즘_5주차_1차시.pptx

설계란 무엇인가?

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

OCW_C언어 기초

06장.리스트

제 10 장 최적 이원 탐색 트리

PowerPoint 프레젠테이션

쉽게 배우는 알고리즘 강의노트

untitled

chap x: G입력

리스트 (list), 선형리스트 (linear list): 순서를가진항목들의모임 집합 : 항목간의순서의개념이없음 L = n ( item0, item1,..., item -1) l 리스트의예 l 요일 : ( 일요일, 월요일,, 토요일 ) l 한글자음의모임 : ( ㄱ, ㄴ

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

Microsoft PowerPoint - C++ 5 .pptx

Data structure: Assignment 1 Seung-Hoon Na October 1, Assignment 1 Binary search 주어진 정렬된 입력 파일이 있다고 가정하자. 단, 파일내의 숫자는 공백으로 구 분, file내에 숫자들은

슬라이드 1

완벽한개념정립 _ 행렬의참, 거짓 수학전문가 NAMU 선생 1. 행렬의참, 거짓개념정리 1. 교환법칙과관련한내용, 는항상성립하지만 는항상성립하지는않는다. < 참인명제 > (1),, (2) ( ) 인경우에는 가성립한다.,,, (3) 다음과같은관계식을만족하는두행렬 A,B에

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

ABC 10장

1장. 리스트

PowerPoint 프레젠테이션

1장. 리스트

C++ Programming

C 언어 강의노트

2002년 2학기 자료구조

JVM 메모리구조

03_queue

adfasdfasfdasfasfadf

쉽게배우는알고리즘 6장. 해시테이블 테이블 Hash Table

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Chapter 4. LISTS

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

Microsoft PowerPoint - chap04-연산자.pptx

PowerPoint 프레젠테이션

Algorithms

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - [2009] 02.pptx

Contents v 학습목표 자료구조큐에대한개념을스택과비교하여이해한다. 큐의특징과연산방법에대해알아본다. 순차표현방법을이용한큐와연결표현방법을이용한큐를구현해본다. 큐의응용방법을알아본다. v 내용 큐 큐의구현 큐의응용 2/74

11장 포인터

<4D F736F F F696E74202D20C0DAB7E1B1B8C1B65FC3E2BCAEBCF6BEF7>

CH06)자료구조.hwp

Microsoft PowerPoint - chap06-2pointer.ppt

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

PowerPoint Template

Microsoft PowerPoint - 07-chap05-Stack.ppt

Microsoft PowerPoint - 제5장-스택의응용.pptx

v 이원탐색트리 (binary search tree) u 인덱스를조직하는한가지방법 u 이진트리 (binary tree) 유한한수의노드를가진트리 공백 (empty) 이거나루트와두개의분리된이진트리즉, 왼쪽서브트리 (left subtree) 와오른쪽서브트리 (right su

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

PowerPoint Presentation

Transcription:

5 장 트리 Copyright 2007 DBLAB, Seoul National University

트리구조 Copyright 2007 DBLAB, Seoul National University 2

트리 트리 : 하나이상의노드 (node) 로이루어진유한집합 1 하나의루트 (root) 노드 2 나머지노드들은 n( 0) 개의분리집합 T 1, T 2,, T n 으로분할 (T i : 루트의서브트리 ) 노드 : 한정보아이템 + 다른노드로뻗어진가지 노드의차수 (degree) : 노드의서브트리수 단말 ( 리프 ) 노드 : 차수 = 0 비단말노드 : 차수 0 자식 : 노드 X 의서브트리의루트 ( 부모 ) 형제 : 부모가같은자식들 트리의차수 = max{ 노드의차수 } 조상 : 루트까지의경로상에있는모든노드 노드레벨 : 루트 - 레벨 1, 자식레벨 = 부모레벨 +1 트리의높이 ( 깊이 ) = max{ 노드레벨 } Copyright 2007 DBLAB, Seoul National University 3

트리의표현 레벨 A 1 B C D 2 E F G H I J 3 K L M 4 Copyright 2007 DBLAB, Seoul National University 4

리스트표현 트리의리스트표현 (A(B(E(K,L),F),C(G),D(H(M),I,J))) 차수가 k 인트리에대한노드구조 공간낭비많음 k 원트리에서노드수가 n 이면 nk 의자식필드중 n(k-1)+1 개필드가 0 Copyright 2007 DBLAB, Seoul National University 5

왼쪽자식 - 오른쪽형제표현 노드구조 left child data right sibling 트리 A B C D E F G H I J K L M Copyright 2007 DBLAB, Seoul National University 6

차수가 2 인트리표현 차수가 2 인트리 왼쪽자식 - 오른쪽형제트리의오른쪽형제포인터를 45 회전 루트노드의오른쪽자식은공백 이진트리 (binary tree) 왼쪽자식 - 오른쪽자식트리 Copyright 2007 DBLAB, Seoul National University 7

트리표현 A A A B B B 트리왼쪽자식 - 오른쪽형제트리이진트리 A A A B B C B C 트리왼쪽자식-오른쪽형제트리이진트리 C Copyright 2007 DBLAB, Seoul National University 8

이진트리 (1) 이진트리의특성 한노드는최대두개의가지 왼쪽서브트리와오른쪽서브트리구별 0 개의노드를가질수있음 이진트리의정의 공백이거나두개의분리된이진트리로구성된노드의유한집합 Copyright 2007 DBLAB, Seoul National University 9

이진트리 (2) 이진트리와일반트리의차이점 공백이진트리존재 자식의순서구별 서로다른두이진트리 Copyright 2007 DBLAB, Seoul National University 10

이진트리 (3) 편향이진트리와완전이진트리 A A level 1 B B C 2 C D E F G 3 D H I 4 E (a) 편향이진트리 (b) 완전이진트리 5 Copyright 2007 DBLAB, Seoul National University 11

이진트리의성질 (1) 최대노드수 레벨 i 에서의최대노드수 : 2 i-1 (i 1) 깊이가 k 인이진트리가가질수있는최대노드수 : 2 k - 1(k 1) 증명 1 귀납기초 : 레벨 i=1 일때루트만이유일한노드이므로레벨 i=1 에서의최대노드수 : 2 1-1 = 2 0 = 1 귀납가설 : i 를 1 보다큰임의의양수라고가정. 레벨 i-1 에서의최대노드수는 2 i-2 라고가정 귀납과정 : 가설에의해레벨 i-1 의최대노드수는 2i-2 각노드의최대차수는 2 이므로레벨 i 의최대노드수는레벨 i-1 에서의최대노드수의 2 배 2 i-1 증명 2 k i 1 ( 레벨i의최대노드 수) k 2 i 1 i 1 2 k 1 Copyright 2007 DBLAB, Seoul National University 12

이진트리의성질 (2) 리프노드수와차수가 2 인노드수와의관계 n 0 =n 2 +1 n 0 : 리프노드수 n 2 : 차수가 2 인노드수 증명 n 1 : 차수 1 인노드수, n : 총노드수, B : 총가지수 n = n 0 + n 1 + n 2 루트를제외한모든노드들은들어오는가지가하나씩있으므로 n = B + 1 모든가지들은차수가 2 또는 1 인노드에서뻗어나오므로 B = n 1 + 2n 2 n = B + 1 = n 1 + 2n 2 + 1 n 0 = n 2 +1 Copyright 2007 DBLAB, Seoul National University 13

이진트리의성질 (3) 포화이진트리 (full binary tree) 깊이가 k 이고, 노드수가 2 k -1 (k 0) 인이진트리 노드번호 1,,2 K -1 까지순차적부여가능 1 깊이 4 2 3 4 5 7 7 8 9 10 11 12 13 14 15 Copyright 2007 DBLAB, Seoul National University 14

이진트리의성질 (4) 완전이진트리 (Complete binary tree) 깊이가 k 이고노드수가 n 인이진트리 각노드들이깊이가 k 인포화이진트리에서 1 부터 n 까지 번호를붙인노드와 1대 1로일치 n 노드완전이진트리의높이 : log 2 ( n 1) A B C D E F G H I Copyright 2007 DBLAB, Seoul National University 15

이진트리의표현 (1) 배열표현 1차원배열에노드를저장 보조정리 5.4 n 개의노드를가진완전이진트리 1 parent(i) : i / 2 if i 1 2 leftchild(i) : 2i if 2i n 왼쪽자식없음 if 2i > n 3 rightchild(i) : 2i+1 if 2i+1 n 오른쪽자식없음 if 2i + 1 > n 완전이진트리 : 낭비되는공간없음 편향트리 : 공간낭비 최악의경우, 깊이 k 편향트리는 2 k -1 중 k 개만사용 Copyright 2007 DBLAB, Seoul National University 16

이진트리의표현 (2) E 편향트리 B C D A [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]... [16] - A B - C - - - D -... E H D 완전이진트리 A B E F I C G [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] - A B C D E F G H I Copyright 2007 DBLAB, Seoul National University 17

이진트리의표현 (3) 연결표현 노드표현 left child 클래스정의 data 부모알기어려움 parent 필드추가 right child template <class T> class Tree; // 전방선언 template <class T> class TreeNode{ friend class Tree<T>; private: T data; TreeNode<T> *leftchild; TreeNode<T> *rightchild; }; LeftChild data RightChild template <class T> class Tree { public: // 트리연산들... private: TreeNode<T> *root; }; Copyright 2007 DBLAB, Seoul National University 18

이진트리의표현 (4) 연결표현의예 A root B A 0 C B 0 D C 0 D 0 E 0 E 0 root A A B C B C D E F G D E 0 0 F 0 0 G 0 H I 0 H 0 0 I 0 Copyright 2007 DBLAB, Seoul National University 19

이진트리순회와트리반복자 트리순회 (tree traversal) 트리에있는모든노드를한번씩만방문 순회방법 : LVR, LRV, VLR, VRL, RVL, RLV L : 왼쪽이동, V : 노드방문, R : 오른쪽이동 왼쪽을오른쪽보다먼저방문 (LR) LVR : 중위 (inorder) 순회 VLR : 전위 (preorder) 순회 LRV : 후위 (postorder) 순회 산술식의이진트리표현 + * E * D / C A B Copyright 2007 DBLAB, Seoul National University 20

중위순회 호출 currentnode 의값조치호출 currentnode 의값 조치 Driver 1 2 3 4 5 4 6 3 7 8 7 9 2 + * * / A 0 A 0 / B 0 B 0 * cout<< A cout<< / cout<< B cout<< * 10 11 10 12 1 13 14 13 15 Driver 16 17 16 18 C 0 C 0 * D 0 D 0 + E 0 E 0 cout<< C cout<< * cout<< D cout<< + cout<< E 출력 : A/B*C*D+E Copyright 2007 DBLAB, Seoul National University 21

레벨순서순회 큐사용 루트방문 -> 왼쪽자식방문 -> 오른쪽자식방문 + * E * D / C A B template <class T> void Tree<T>::LevelOrder() {// 이진트리의레벨순서순회 Queue<TreeNode<T>*> q; TreeNode<T> * currentnode = root; while(currentnode){ Visit(currentNode); if(currentnode->leftchild) q.push(currentnode->leftchild); if(currentnode->rightchild) q.push(currentnode->rightchild); if(q.isempty()) return; currentnode = q.front(); q.pop(); } } Copyright 2007 DBLAB, Seoul National University 22

스택없는순회 각노드에 parent ( 부모 ) 필드추가 스택을사용하지않아도루트노드로올라갈수있음 스레드 (thread) 이진트리로표현 각노드마다두비트필요 leftchild 필드와 rightchild 필드를루트로돌아갈수있는경로를유지하도록사용 경로상의주소스택은리프노드에저장 Copyright 2007 DBLAB, Seoul National University 23

만족성문제 (1) 변수 x 1, x 2,, x n 과연산자,, 으로이루어진식 변수 = { 참, 거짓 } 규칙 (1) 변수도하나의식 (2) x, y 가식일때, x, x y, x y 도식 (3) 연산순서는,, 순, 괄호사용 명제해석식 (formula of propositional calculus) 위규칙을이용해서구성한식 x x ) 1 ( 2 x3 Copyright 2007 DBLAB, Seoul National University 24

만족성문제 (2) 명제식의만족성 (satisfiability) 문제 식의값이 true가되도록, 변수에값을지정할수있는방법이있는가? ( x x 1 x2) ( x1 x3) 3 x 3 x 1 x 3 x 2 x 1 Copyright 2007 DBLAB, Seoul National University 25

만족성문제 (3) 가능한모든 true 와 false 의조합을대입 : O(g 2 n ) g : 식을계산하는데필요한시간 전체식이하나의값이될때까지서브트리를계산하면서트리를후위순회 x 1 x 2 x 3 formular T T T? T T F? T F T? T F F? F T T? F T F? F F T? F F F? Copyright 2007 DBLAB, Seoul National University 26

만족성문제 (4) 후위순회계산 Tree 템플릿클래스를 T=pair<Operator, bool> 로인스턴스화 enum Operator { Not, And, Or, True, False}; for n 개변수에대한 2 n 개의가능한참값조합 { 다음조합을생성 ; 그들의값을변수에대입 ; 명제식을나타내는트리를후위순회로계산 ; if(formula.data().second()){cout << current combination; return;} } cout << no satisfiable combination ; Copyright 2007 DBLAB, Seoul National University 27

스레드 (1) n 노드이진트리의연결표현 총링크의수 : 2n 0 링크의수 : n+1 root A B C D 0 E 0 0 F 0 0 G 0 0 H 0 0 I 0 Copyright 2007 DBLAB, Seoul National University 28

스레드 (2) 스레드 (Thread) 0 링크필드를다른노드를가리키는포인터로대치 if p->rightchild == 0, p->rightchild = p 의중위후속자에대한포인터 if p->leftchild = 0, p->leftchild = p 의중위선행자에대한포인터 root A B C D E F G H I Copyright 2007 DBLAB, Seoul National University 29

스레드 (3) 노드구조 LeftThread LeftChild data RightChild RightThread TRUE FALSE leftthread == false : leftchild 포인터 == true : leftchild 스레드 rightthread == false : rightchild 포인터 == true : rightchild 스레드 헤드노드 연결되지않은스레드제거 Copyright 2007 DBLAB, Seoul National University 30

스레드이진트리의메모리표현 root f - f f A f f B f f C f f D f t E t t F t t G t t H t t I t f = false; t = true Copyright 2007 DBLAB, Seoul National University 31

스레드이진트리의중위순회 스택을이용하지않고중위순회가능 중위순회의후속자 x->rightthread == true : x->rightchild == false : 오른쪽자식의왼쪽자식링크를따라가서 LeftThread==true 인노드 스레드이진트리에서중위후속자를찾는함수 T* ThreadedInorderIterator::Next() {// 스레드이진트리에서 currentnode 의중위후속자를반환 ThreadedNode<T> *temp = currentnode->rightchild; if(!currentnode->rightthread) while(!temp->leftthread) temp = temp->leftchild; currentnode = temp; if(currentnode == root) return 0; else return &currentnode->data; } Copyright 2007 DBLAB, Seoul National University 32

스레드이진트리에서의노드삽입 s 의오른쪽자식으로 r 을삽입 Copyright 2007 DBLAB, Seoul National University 33

우선순위큐 우선순위가가장높은 ( 낮은 ) 원소를먼저삭제 임의의우선순위를가진원소삽입가능 최대우선순위큐 template <class T> class MaxPQ{ public: virtual ~MaxPQ(){} // 가상파괴자 virtual bool IsEmpty() const = 0; // 우선순위큐가공백이면 true 를반환 virtual const T& Top() const =0; // 최대원소에대한참조를반환 virtual void Push(const T&) = 0; // 우선순위큐에원소를삽입 virtual void Pop() = 0; // 최대우선순위를가진원소를삭제 }; Copyright 2007 DBLAB, Seoul National University 34

우선순위큐 표현방법 무순서선형리스트 IsEmpty() : O(1) Push() : O(1) Top() : Θ(n) Pop() : Θ(n) 최대히프 IsEmpty() : O(1) Top() : O(1) Push() : O(log n) Pop() : O(log n) Copyright 2007 DBLAB, Seoul National University 35

최대히프의정의 최대 ( 최소 ) 트리 : 각노드의키값이그자식의키값보다작지 ( 크지 ) 않은트리. 최대히프 : 최대트리이면서완전이진트리. 최소히프 : 최소트리이면서완전이진트리. 14 9 30 최대히프 12 7 6 3 25 10 8 6 5 2 10 11 최소히프 7 4 20 83 21 10 8 6 50 Copyright 2007 DBLAB, Seoul National University 36

최대히프에서의삽입 삽입후에도최대히프유지 새로삽입된원소는부모원소와비교하면서최대히프가되는것이확인될때까지위로올라감 20 15 2 14 10 (a) (b) 20 5 21 15 15 20 14 10 2 14 10 2 (c) (d) Copyright 2007 DBLAB, Seoul National University 37

최대히프에서의삭제 루트삭제 루트와마지막위치의노드교환후노드수 -1 루트와왼쪽자식, 오른쪽자식비교 가장큰것을루트로. 2 15 15 20 14 2 14 10 6 10 (a) (b) (c) Copyright 2007 DBLAB, Seoul National University 38

이원탐색트리 사전 (dictionary) pair< 키, 원소 > 의집합 template <class K, class E> class Dictionary{ public: virtual bool IsEmpty() const=0; // 공백이면 true 반환 virtual pair<k,e>*get(const K&) const = 0; // 지시한키값을가진쌍에대한포인터반환, 쌍이없으면 0 반환 virtual void Insert(const pair<k,e>&)=0; // 쌍을삽입, 키가중복되면관련원소갱신 virtual void Delete(const K&)=0; // 지시된키를가진쌍삭제 }; Copyright 2007 DBLAB, Seoul National University 39

이원탐색트리 정의 이진트리로서공백가능하고, 만약공백이아니라면 (1) 모든원소는서로상이한키를갖는다. (2) 왼쪽서브트리의키들은그루트의키보다작다. (3) 오른쪽서브트리의키들은그루트의키보다크다 (4) 왼쪽과오른쪽서브트리도이원탐색트리이다. 이원탐색트리 20 30 60 15 25 5 40 70 12 10 22 2 65 80 (a) X (b) O (c) O Copyright 2007 DBLAB, Seoul National University 40

이원탐색트리의탐색 k = 루트의키 : 성공적종료 k < 루트의키 : 왼쪽서브트리탐색 k > 루트의키 : 오른쪽서브트리탐색 template <class K, class E> //Driver pair<k,e>* BST<K,E>::Get(const K& k) {// 키 k 를가진쌍을이원탐색트리 (*this) 에서탐색 // 쌍을발견하면포인터반환, 아니면 0 반환 return Get(root, k); } template <class K, class E> //Workhorse pair<k,e>* BST<K,E>::Get(TreeNode <pair <K,E>>*p, const K& k) { if(!p) return 0; if(k<p->data.first) return Get(p->leftChild,k); if(k>p->data.first) return Get(p->rightChild,k); return &p->data; } Copyright 2007 DBLAB, Seoul National University 41

순위에의한이원탐색트리의탐색 순위 (rank) 중위순서에서의위치 leftsize = 왼쪽서브트리의원소수 + 1 순위에의한이원탐색트리의탐색 template <class K, class E> // 순위에의한탐색 pair<k,e>* BST<K,E>::RankGet(int r) {//r번째작은쌍을탐색한다. TreeNode<pair<K,E>>*currentNode = root; while(currentnode) if(r<currentnode->leftsize) currentnode = currentnode->leftchild; else if (r> currentnode->leftsize) { } r -= currentnode->leftsize; currentnode = currentnode->rightchild; } else return &currentnode->data; return 0; 1 2 leftsize key 3 30 2 5 1 40 Copyright 2007 DBLAB, Seoul National University 42

이원탐색트리에서의삽입 x 의 key 값을가진노드를탐색 탐색이성공하면이키에연관된원소를변경 탐색이실패하면탐색이끝난지점에쌍을삽입 30 30 30 5 40 80 삽입 35 삽입 5 40 5 40 2 2 80 2 35 80 Copyright 2007 DBLAB, Seoul National University 43

이원탐색트리에서의삭제 리프원소의삭제 부모의자식필드에 0 을삽입. 삭제된노드반환 하나의자식을가진비리프노드의삭제 삭제된노드의자식을삭제된노드의자리에위치 30 5 30 을삭제 5 40 2 40 2 80 80 두개의자식을가진비리프노드의삭제 왼쪽서브트리에서가장큰원소나오른쪽서브트리에서가장작은원소로대체 대체된서브트리에서대체한원소의삭제과정진행 시간복잡도 : O(h) Copyright 2007 DBLAB, Seoul National University 44

이원탐색트리의조인과분할 (1) ThreeWayJoin(small, mid, big) 이원탐색트리 small 과 big 에있는쌍들과쌍 mid 로구성되는이원탐색트리를생성 새로운노드를하나얻어서 데이타필드 =mid 왼쪽자식포인터 =small.root 오른쪽자식포인터는 big.root O(1) TwoWayJoin(small, big) 두이원탐색트리 small 과 big 에있는모든쌍들을포함하는하나의이원탐색트리생성 small 또는 big 이공백일경우 공백이아닌것이이원탐색트리 둘다공백이아닌경우 small 에서가장큰키값을가진 mid 쌍삭제 : small ThreeWayJoin(small, mid, big) 수행 O(height(small)) Copyright 2007 DBLAB, Seoul National University 45

이원탐색트리의조인과분할 (2) Split(k, small, mid, big) 이원탐색트리 *this 를세부분으로분할 small 은 *this 의원소중키값이 k 보다작은모든쌍포함 mid 는 *this 의원소중키값이 k 와같은쌍포함 big 은 *this 의원소중키값이 k 보다큰모든쌍포함 k = root->data.first 인경우 small = *this 의왼쪽서브트리 mid = 루트에있는쌍 big = *this 의오른쪽서브트리 k < root->data.first 인경우 big 루트, 오른쪽서브트리 k > root->data.first small 루트, 왼쪽서브트리 Copyright 2007 DBLAB, Seoul National University 46

이원탐색트리 (n) 의높이 이원탐색트리의원소수 : n 최악의경우 이원탐색트리의높이 = n 키 [1,2,3,...,n] 을순서대로삽입 평균 이원탐색트리의높이 = O(log n ) 균형탐색트리 (balanced search tree) 최악의경우에도 height = O(log n ) 이되는트리 탐색, 삽입, 삭제의시간복잡도 : O(h) AVL, 2-3, 2-3-4, 레드 - 블랙 (red-black), B 트리, B+ 트리등 Copyright 2007 DBLAB, Seoul National University 47

승자트리 (1) 런 (run) 하나의순서순차로합병될 k 개의순서순차 각런은 key 필드에따라비감소순서로정렬 승자트리 (winner tree) 각노드가두개의자식노드중더작은노드를나타내는완전이진트리 루트노드 : 트리에서가장작은노드 리프노드 : 각런의첫번째레코드 이진트리에대한순차할당기법으로표현 Copyright 2007 DBLAB, Seoul National University 48

승자트리 (2) K=8 인경우의승자트리 1 6 2 3 6 8 4 5 6 7 9 6 8 17 8 9 10 10 9 20 6 11 12 13 14 15 8 9 90 17 15 20 20 15 15 11 95 18 16 38 30 25 50 16 99 20 28 run 1 run 2 run 3 run 4 run 5 run 6 run 7 run 8 Copyright 2007 DBLAB, Seoul National University 49

승자트리 (3) 승자트리에서한레코드가출력되고나서재구성 새로삽입된노드에서루트까지의경로를따라토너먼트재수행 4 9 2 9 15 1 8 5 6 7 8 9 10 11 12 13 14 15 10 9 20 15 8 9 90 17 8 8 3 17 15 20 20 25 15 11 95 18 16 38 30 28 50 16 99 20 run 1 run 2 run 3 run 4 run 5 run 6 run 7 run 8 Copyright 2007 DBLAB, Seoul National University 50

패자트리 (1) 승자트리의문제점 재구성할때루트까지의경로를따라형제노드들사이에토너먼트발생 형제노드는전에시행되었던토너먼트의패자들 패자트리 (loser tree) 비리프노드가패자레코드에대한포인터유지 전체토너먼트의승자를표현하기위한노드 0 첨가 토너먼트는부모와비교 형제노드에는접근하지않음 Copyright 2007 DBLAB, Seoul National University 51

패자트리 (2) 0 6 전체승자 6 1 8 6 8 2 3 9 17 9 6 8 17 4 5 6 7 10 20 9 90 8 9 10 10 9 20 6 11 12 13 14 15 8 9 90 17 Run 1 2 3 4 5 6 7 8 Copyright 2007 DBLAB, Seoul National University 52

포리스트 포리스트 (forest) n( 0) 개의분리 (disjoint) 트리들의집합 A E G B C D F H I Copyright 2007 DBLAB, Seoul National University 53

포리스트를이진트리로변환 (1) 각트리를이진트리로변환 변환된모든이진트리들을루트의 rightchild 로연결 정의 만일 T 1,T 2,,T n 이트리로된포리스트라하면이포리스트에대응하는이진트리, B(T 1,T 2,,T n ) 은 n=0 이면공백 B 의루트 = T 1 의루트왼쪽서브트리 = B(T 11,T 12,,T 1m ) T 11,T 12,,T 1m 는 T1 의루트의서브트리오른쪽서브트리 = B(T 2,,T n ) Copyright 2007 DBLAB, Seoul National University 54

포리스트를이진트리로변환 (2) 세개의트리로구성된포리스트 A E G B C D F H 위그림의이진트리표현 I A B E C F G D H Copyright 2007 DBLAB, Seoul National University 55 I

포리스트순회 (1) 포리스트전위 (forest preorder) F가공백이면복귀 F의첫번째트리의루트방문 첫번째트리의서브트리들을포리스트전위순회 F의나머지트리들을포리스트전위로순회 포리스트중위 (forest inorder) F가공백이면복귀 F의첫번째트리의서브트리를포리스트중위로순회 첫번째트리의루트방문 나머지트리들을포리스트중위로순회 Copyright 2007 DBLAB, Seoul National University 56

포리스트순회 (2) 포리스트후위 (forest postorder) F가공백이면귀환 F의첫트리의서브트리를포리스트후위로순회 나머지트리들을포리스트후위로순회 F의첫트리의루트를방문 포리스트레벨순서순회 포리스트의각루트부터시작하여노드를레벨순으로방문 레벨내에서는왼쪽에서부터오른쪽으로차례로방문 Copyright 2007 DBLAB, Seoul National University 57

분리집합의표현 (1) 분리집합 (disjoint set) 의트리표현 집합의모든원소는수 0,1,2,...,n-1 이라고가정 모든집합들은쌍별로분리된다고가정 임의의두집합은어떤원소도공유하지않음 자식에서부터부모로가는링크로연결 0 4 2 6 7 8 1 9 3 5 S 1 S 2 S 3 Copyright 2007 DBLAB, Seoul National University 58

분리집합의표현 (2) S 1, S 2, S 3 의데이타표현 Set Name Pointer S 1 0 4 2 S 2 6 7 8 1 9 3 5 S 3 S 1, S 2, S 3 의배열표현 i 번째원소 : 원소 i 를포함하는트리노드 원소 : 대응되는트리노드의부모포인터 루트의 parent 는 -1 i [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] parent -1 4-1 2-1 2 0 0 0 4 Copyright 2007 DBLAB, Seoul National University 59

분리합집합 분리합집합 (disjoint set union) S i S j = {x x 는 S i 또는 S j 에포함되는모든원소 } 두트리중의하나를다른트리의서브트리로넣음 0 4 6 7 8 4 0 1 9 1 9 6 7 8 S 1 S 2 or S 1 S 2 Copyright 2007 DBLAB, Seoul National University 60

SimpleUnion 과 SimpleFind 분석 변질 (degenerate) 트리 n 개의원소가각각 n 개의집합에하나씩포함된경우 S i ={i} ( 0 i < n) 초기상태 : n 개의노드들로이루어진포리스트 parent[i]= -1 (0 i n) Union(0,1), Union(1,2),Union(2,3),..., Union(n-2,n-1) n-1 번의합집합이 O(n) 시간에수행 Find(0), Find(1),..., Find(n-1) 수행 레벨 i 에있는원소에대한수행시간 : O(i) n번의 Find 수행 : O( i ) = O(n 2 ) n i 1 n-1 n-2 Copyright 2007 DBLAB, Seoul National University 61 0

가중규칙을적용한합집합 (1) Union(i,j) 를위한가중규칙 루트 i 를가진트리의노드수 < 루트 j 를가진트리의노드수 : j 를 i 의부모로 otherwise : i 를 j 의부모로 0 1 n-1 0 1 2 n-1 1 0 2 3 n-1 initial Union(0,1) Union(0,2) 0 1 2 3 Union(0,3) 4 n-1 0 1 2 3 n-1 Union(0,n-1) Copyright 2007 DBLAB, Seoul National University 62

가중규칙을이용한합집합 (2) 모든트리의루트에 count( 계수 ) 필드유지 루트의 parent 는 -1 이므로, 루트의 parent 에 count 유지 void sets::weightedunion(int i, int j) // 가중규칙을이용하여루트가 i 와 j(i j) 인집합의합을구함 // parent[i] = -count[i] 이며 parent[j] = -count[j] 임. { int temp = parent[i] + parent [j]; if (parent[i] > parent[j]) { // i 의노드수가적으면 parent[i] = j; // j 를새루트로만든다 parent[j] = temp; } else ( // j 의노드수가적거나같으면 parent[j] = i; // i 를새루트로만든다 parent[i] = temp; } } Copyright 2007 DBLAB, Seoul National University 63

WeightedUnion 과 WeightedFind 의분석 WeightedUnion : O(1) WeightedFind(=SimpleFind) : O(log m) 합집합의결과가 m 개의노드를가진트리의높이 log 2 m 1 u-1 개의합집합 + f 개의탐색 : O(u+f log u) 트리의노드수 u Copyright 2007 DBLAB, Seoul National University 64

최악의경우의트리 (1) Copyright 2007 DBLAB, Seoul National University 65

최악의경우의트리 (2) Copyright 2007 DBLAB, Seoul National University 66

붕괴규칙을이용한탐색알고리즘 붕괴규칙 (collapsing rule) 만일 j 가 i 에서루트로가는경로상에있고 parent[i] root(i) 면 parent[j] 를 root(i) 로지정 int Sets::CollapsingFind(int i) {// 원소 i 를포함하는루트를찾음 // 붕괴규칙을이용하여 i 로부터루트로가는모든노드를붕괴시킴 for (int r = i; parent[r] >= 0; r = parent[r]); // 루트를찾음 while( i!= r) { // 붕괴 int s = parent[i]; parent[i] = r; i = s; } return r; } Copyright 2007 DBLAB, Seoul National University 67

동치부류의응용 (1) 동치쌍 (equivalence pair) 의처리 동치부류 (equivalence class) 를집합으로간주 i j i 와 j 를포함하고있는집합찾기 다른집합에포함된경우합집합으로대체 같을때는아무작업도수행할필요없음 n 개의변수, m 개의동치쌍 초기포리스트형성 : O(n) 2m 개의탐색, 최대 min{n-1,m} 개의합집합 : O(n+mα(2m, min{n-1,m})) Copyright 2007 DBLAB, Seoul National University 68

동치부류의응용예제 (1) [-1] [-1] [-1] [-1] [-1] [-1] [-1] [-1] [-1] [-1] [-1] [-1] 0 1 2 3 4 5 6 7 8 9 10 11 (a) Initial trees [-2] [-2] [-2] [-1] [-1] [-1] [-1] [-1] 0 3 6 8 2 5 7 11 4 1 10 9 0 4, 3 1, 6 10, and 8 9 다음의높이 -2 트리 Copyright 2007 DBLAB, Seoul National University 69

동치부류의응용예제 (2) [-3] [-4] [-3] [-2] 0 6 3 2 4 7 10 8 1 5 11 9 (c) 7 4, 6 8, 3 5,and 2 11 다음의트리 [-5] 0 [-4] 6 [-3] 3 4 7 2 10 8 1 5 11 9 (d) 11 0 다음의트리 Copyright 2007 DBLAB, Seoul National University 70

이진트리의개수계산 상이한이진트리 n=2 일때서로다른이진트리 : 2 개 A A and B B n=2 일때서로다른이진트리 : 5 개 Copyright 2007 DBLAB, Seoul National University 71

스택순열 (1) 전위순서 ABCDEFGHI, 중위순서 BCAEDGHFI 전위순서 : A 는트리의루트 중위순서 : BC 는 A 의왼쪽서브트리, EDGHFI 는오른쪽서브트리 B,C 전위순서 : B 가다음번루트 중위순서 : B 의왼쪽서브트리는공백, 오른쪽은 C A A D,E,F,G,H,I B D,E,F,G,H,I 반복 B C A C E D G F H I Copyright 2007 DBLAB, Seoul National University 72

스택순열 (2) 전위순열 (preorder permutation) 이진트리를전위순회에따라방문한노드들의순서 1 2 4 3 5 6 7 9 8 중위순열 (inorder permutation) 이진트리를중위순회에따라방문한노드들의순서 Copyright 2007 DBLAB, Seoul National University 73

스택순열 (3) 모든이진트리는유일한전위 - 중위순서쌍을가짐 n 개의노드를가진서로다른이진트리의수 = 1,2,...,n 의전위순열을가지는이진트리로부터얻을수있는중위순열의수 =1 부터 n 까지의수를스택에넣었다가가능한모든방법으로삭제하여만들수있는상이한순열의수 Copyright 2007 DBLAB, Seoul National University 74

행렬곱셈 n 개행렬의곱셈 M 1 *M 2 *M 3 *... *M n n 개의행렬을곱하는방법의수 b n b 1 =2, b 2 =1, b 3 =2, b 4 =5 Mij = M i *M i+1 *... *M j M 1n = M 1i *M i+1,n n-1 M 1i _ 계산방법수 : b i b n bibn-1, n 1 M i+1,n 계산방법수 : b n-i i 1 b n = 루트, 노드수가 b i, b n-i-1 인서브트리로된이진트리들 n-1 bn bibn-i-1, n 1그리고b0 i 1 1 Copyright 2007 DBLAB, Seoul National University 75

상이한이진트리의수 (1) 이진트리의수를구하는생성함수 (generating function) i B(x) b i x i 0 순환관계에의하여 xb 2 (x)=b(x)-1 B(0)=b 0 =1 을이용하여이차방정식을풀면 B(x) 1-1- 4x 2x 이항정리를이용하여 (1-4x) 1/2 를확장하면 B(x) 1 2x 1 n 0 1/ 2 n n m 2m 1 m 4x ( 1) 2 x m 0 1/ 2 m Copyright 2007 DBLAB, Seoul National University 76

상이한이진트리의수 (2) B(x) 에서 x n 의계수인 b n 은아래와같다. 1/ 2 n 2n 1 ( 1) 2 n 1 1 2n n 1 n b n b n O(4 n /n 3/2 ) Copyright 2007 DBLAB, Seoul National University 77