13. 탐색 트리.

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

이진 나무 구조 강윤섭 2008년 5월 23일.
UNIX 운영 체제의 설계 - Chapter 4. 파일의 내부 표현
주요 내용 기본 용어 이진 트리(binary tree) 이진 탐색 트리(binary search tree)
T-tree 엄종진 강원대학교 컴퓨터과학과.
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
최윤정 Java 프로그래밍 클래스 상속 최윤정
연결리스트(linked list).
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
트리 이 현 직
자료구조론 9장 트리(tree).
10.다차원 공간 화일.
14. 히프와 우선순위 큐.
7장 이원 탐색 트리.
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 50).
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
Lesson 6. 형변환.
Chapter 8. AVL Search Trees
제3장 스택과 큐.
P150 문제를 프로그래밍 할 것 Source file (헤더파일포함), 실행화면 (학번_이름_1.txt)
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
제 11 장 다원 탐색 트리.
트리 2-3 트리 2-3 트리의 노드 AVL은 균형 트리 (Balanced Tree)를 지향
CHAPTER 5 트리(Tree).
제 5 장 트 리 5.1 트리 5.2 이진 트리 5.3 스레드 이진 트리.
자료구조: CHAP 7 트리(1) 순천향대학교 컴퓨터공학과 하 상 호.
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
CHAP 7: 트 리 (1) 한 성 대 학 교 정보통신공학과 봉 정 식.
Introduction To Data Structures Using C
인터넷응용프로그래밍 JavaScript(Intro).
자료구조: CHAP 7 트리 –review 순천향대학교 컴퓨터공학과 하 상 호.
Tree & Heap SANGJI University Kwangman Ko
Report #3 - due: 4/6 100*100의 2개의 희소 행렬 A, B를 전달 받아서 이들의 덧셈을 구하고, 그 결과의 행렬 C를 반환하는 add_sparse_matrix(A, B, C)를 다음과 같이 작성하라. 희소 행렬은 sparse_matrix 타입으로 표현된다.
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
8장. 상호 배타적 집합의 처리.
11장 균형 탐색 트리.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
27강 JAVA Collections - II - Map계열 컬렉션 클래스 살펴보기 - Set계열 컬렉션 클래스 살펴보기
에어 조건문.
제 1 강.
CACM 구현 public class CACM { public CACM(File file)
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
CHAP 12: 탐색 순천향대학교 컴퓨터학부 하 상 호.
CHAP 12: 탐색 순천향대학교 컴퓨터학부 하 상 호.
CHAP 21. 전화, SMS, 주소록.
13장. 균형 탐색 트리 and the pain you must suffer to learn them
트리.
객체기반 SW설계 팀활동지 4.
균형이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)와의 차이점
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 27).
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
DA :: 퀵 정렬 Quick Sort 퀵 정렬은 비교방식의 정렬 중 가장 빠른 정렬방법이다.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
5장. 선택 알고리즘.
Chapter 10 데이터 검색1.
발표자 : 이지연 Programming Systems Lab.
7장 연습 문제 풀이 학번 : 이름 :조 재한.
제 4장 트리.
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
트리 (Logical) Data Structures Linear list Tree Graph Linear structures
컴퓨터 개론 √ 원리를 알면 IT가 맛있다 쉽게 배우는 컴퓨터 기본 원리 한빛미디어 교재출판부.
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제 4 장 Record.
C++ Espresso 제15장 STL 알고리즘.
7 생성자 함수.
6 객체.
11. 트리.
Presentation transcript:

13. 탐색 트리

13.1 키와 Comparable 타입 (1) Comparable 인터페이스 public int compareTo(Object object) 다음 세 가지 가능성 중의 하나에 대한 정보를 가지고 있는 정수 c를 리턴 만일 c<0이면, this 객체는 주어진 object보다 작음 만일 c=0이면, this 객체는 주어진 object와 같음 만일 c>0이면, this 객체는 주어진 object보다 큼 디스크 주소를 위한 인터페이스 interface DiskAddress { public Object get(Comparable key); }

키와 Comparable 타입 (2) 탐색 트리가 만족해야 하는 조건 탐색 트리의 구현 예 탐색 트리 구조 내에 있는 키는 유일함 각각의 키는 그것이 표현하는 데이터의 주소를 가지고 있음 키의 타입은 java.lang.Comparable 인터페이스를 구현함 주소의 타입은 Address 인터페이스를 구현함 탐색 트리의 구현 예 탐색 트리가 내부 레드-블랙 트리 Object[] data = new Object[200]; 탐색 트리가 내부 B-트리 class DiskAddress implements Address { private String drive; private long sector, block; }

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

이진 탐색 트리 (2) 이진 탐색 트리의 순회 BST 검색 알고리즘 1. 만일 T가 공백이면, null을 리턴. 이진 탐색 트리의 중위 순회는 키를 오름차순으로 방문 BST 검색 알고리즘 입력 : 이진 탐색 트리 T와 키. 출력 : 키를 위한 데이터 주소 또는 키가 T에 없다면 null. 1. 만일 T가 공백이면, null을 리턴. 2. 만일 key < root.key 이면, 키를 찾기 위해 왼쪽 순환 탐색에 의해 반환되는 값을 리턴. 3. 만일 key > root.key 이면, 키를 찾기 위한 오른쪽 순환 탐색에 의해 반환되는 값을 리턴. 4. root.address를 리턴.

이진 탐색 트리의 예

BST 삽입 BST 삽입 알고리즘 1. 만일 T가 공백이면 키-주소 쌍을 포함하는 단독 트리를 만들고, true를 리턴. 출력 : 키가 T에 이미 있다면 false, 아니면 true. 선조건 : 키-주소 쌍은 T에 있음. 1. 만일 T가 공백이면 키-주소 쌍을 포함하는 단독 트리를 만들고, true를 리턴. 2. 만일 key < root.key 이면, 순환적으로 왼쪽 서브트리에서 키-주소 쌍의 삽입에 의해 반환되는 값을 리턴. 3. 만일 key < root.key 이면, 순환적으로 오른쪽 서브트리에서 키-주소 쌍의 삽입에 의해 반환되는 값을 리턴. 4. false를 리턴.

BST 삽입의 예

BST 구축 예

BST의 최선과 최악의 경우

BST BST 최소값 알고리즘 BST 후속자 알고리즘 입력 : 공백이 아닌 이진 탐색 트리 T. 1. x를 T의 루트라 하자. 2. x.left가 공백이 아닌 동안 x=x.left로 설정. 3. x를 리턴. BST 후속자 알고리즘 입력 : 공백이 아닌 이진 탐색 트리 T와 노드 x. 출력 : x의 중위 후속자 또는 x가 T의 최대 원소일 경우에는 null. 1. 만일 x의 오른쪽 서브트리가 공백이 아니면, 그것의 최소값을 리턴(BST 최소값 알고리즘). 2. 만일 x의 오른쪽 서브트리가 공백이면, x가 오른쪽 자식인 동안 x=x.parent로 설정. 3. x.parent(null이 될 수 있음)를 리턴.

노드의 중위 후속자 사례 1: 후속자는 오른쪽 서브트리의 최소 원소임 사례 2: 후속자는 값이 크면서 가장 가까운 조상임 사례 3: 트리에서 가장 오른쪽 원소는 후속자를 가지지 않음

BST 삭제 노드 44를 삭제하기 위한 부적절한 시도

BST 삭제 노드 44를 삭제하는 올바른 방법

BST 삭제의 세 가지 경우

BST 삭제 입력 : 이진 탐색 트리 T와 키. 출력 : T에서 키를 발견할 수 없으면 false; 아니면 true. 2. 만일 key < root.key 이면, 순환적으로 왼쪽 서브트리로부터 키의 삭제에 의해 반환되는 값을 리턴. 3. 만일 key > root.key 이면, 순환적으로 오른쪽 서브트리로부터 키의 삭제에 의해 반환되는 값을 리턴. 4. 만일 T가 단독 트리이면, 이것을 공백 트리로 만들고, true를 리턴. 5. 만일 왼쪽 서브트리가 공백이면, T의 오른쪽 서브트리의 루트, 왼쪽, 오른쪽 필드를 T 자체에 복사하고, true를 리턴. 6. 만일 오른쪽 서브트리가 공백이면, T의 왼쪽 서브트리의 루트, 왼쪽, 오른쪽 필드를 T 자체에 복사하고, true를 리턴. 7. 후속자 노드를 찾아 루트와 교체한 후 후속자 노드에 대해 BST 삭제 알고리즘 순환 호출.

13.4 BST 성능 이진 탐색 트리의 삽입과 탐색 BST 탐색과 삽입 알고리즘에 대한 평균 시간 복잡도 B(n) = Θ(1) A(n) = Θ(lg n) W(n) = Θ(n) BST 탐색과 삽입 알고리즘에 대한 평균 시간 복잡도

13.5 AVL 트리 AVL 트리 어떤 노드에서도 두 서브트리가 거의 같은 높이를 갖도록 강제하여 균형을 유지하는 이진 탐색 트리 불균형이 발생할 때마다 서브트리를 회전하여 균형을 맞추어 줌 AVL 회전의 패턴 왼쪽 단순 회전 오른쪽 단순 회전 복합 오른쪽-왼쪽 회전 복합 왼쪽-오른쪽 회전

왼쪽 회전 알고리즘 (1) x에 대해 왼쪽으로 회전 x에 대해 왼쪽으로 회전

왼쪽 회전 알고리즘 (2) x에 대해 왼쪽으로 회전 x에 대해 왼쪽으로 회전

이중 회전 알고리즘 (1) y에 대해 오른쪽으로 회전 x에 대해 왼쪽으로 회전

이중 회전 알고리즘 (2) y에 대해 오른쪽으로 회전 x에 대해 왼쪽으로 회전

AVL 회전의 패턴 왼쪽 단순 회전 오른쪽 단순 회전 복합 오른쪽-왼쪽 회전 복합 왼쪽-오른쪽 회전

13.6 AVL 트리의 구현 (1) An AVLTree CLASS 1 public class AVLTree { 2 private int key, height; 3 private AVLTree left, right; 5 public static final AVLTree NIL = new AVLTree(); 7 public AVLTree(int key){ 8 this.key = key; 9 left = right = NIL; 10 } 12 public boolean add(int key) { 13 int oldSize = size(); 14 grow(key); 15 return size()>oldSize; 16 } 17

AVL 트리의 구현 (2) 18 public AVLTree grow(int key) { 19 if (this == NIL) return new AVLTree(key); 20 if (key == this.key) return this; // prevent key duplication 21 if (key < this.key) left = left.grow(key); 22 else right = right.grow(key); 23 rebalance(); 24 height = 1 + Math.max(left.height,right.height); 25 return this; 26 } 28 public int size() { 29 if (this == NIL) return 0; 30 return 1 + left.size() + right.size(); 31 } 33 public String toString() { 34 if (this == NIL) return ""; 35 return left + " " + key + " " + right; 36 }

AVL 트리의 구현 (3) 38 private AVLTree() { // constructs the empty tree 39 left = right = this; 40 height = -1; 41 } 43 private AVLTree(int key, AVLTree left, AVLTree right) { 44 this.key = key; 45 this.left = left; 46 this.right = right; 47 height = 1 + Math.max(left.height,right.height); 48 } 50 private void rebalance() { 51 if (right.height > left.height+1) { 52 if (right.left.height > right.right.height) right.rotateRight(); 53 rotateLeft(); 54 }

AVL 트리의 구현 (4) 55 else if (left.height > right.height+1) { 56 if (left.right.height > left.left.height) left.rotateLeft(); 57 rotateRight(); 58 } 59 } 60 61 private void rotateLeft() { 62 left = new AVLTree(key,left,right.left); 63 key = right.key; 64 right = right.right; 65 } 66 67 private void rotateRight() { 68 right = new AVLTree(key,left.right,right); 69 key = left.key; 70 left = left.left; 71 } 72 }

AVL 특성 AVL 트리가 아님 : AVL 트리임 :

회전이 있는 AVL 삽입 35 삽입 오른쪽 회전 왼쪽 회전

AVL 회전 라인 62 : 라인 63 : 라인 64 :

13.7 피보나치 트리 피보나치 트리 높이가 1인 이진 트리 높이 h=2인 네 가지 피보나치 트리 피보나치 수를 생성하는 것과 동일한 순환적인 아이디어를 사용하여 생성 이 트리는 최악의 경우 AVL 트리이며 이것을 분석해 보면 일반적인 AVL 트리가 최악의 경우에도 로그 시간에 수행된다는 것을 증명할 수 있음 높이가 1인 이진 트리 높이 h=2인 네 가지 피보나치 트리

피보나치 트리의 특성 피보나치 트리 피보나치 트리의 크기에 대한 범위 AVL 트리의 최악의 경우 성능 피보나치 트리는 AVL 특성을 만족하며, 주어진 높이에서 AVL 특성을 만족하는 모든 이진 트리 중에서 최소 크기를 가짐 피보나치 트리의 크기에 대한 범위 AVL 트리의 최악의 경우 성능 AVL 트리에 대한 탐색과 삽입은 최악의 경우 Θ(lgn)에 실행됨

피보나치 트리의 예

높이 h=4인 최소와 최대 AVL 트리 피보나치 트리 포화 이진 트리 h = 4 n = 12 n = 31

13.8 다원 탐색 트리 정의 다원 탐색 트리(MST: Multiway Search Tree) 특성을 만족하는 트리 MST 특성 만일 Ti에 있는 각각의 xi에 대해 x0, x1, x2, …, xd-1을 서브트리에 있는 키라고 하면, x0<k0<x1<k1<x2<k2<…xd-2<kd-2임

다원 탐색 트리의 예 차수가 7인 다원 탐색 노드 차수가 5인 다원 탐색 트리

다원 탐색 트리의 Java 정의 1 public class MST { 3 private class Node { 4 int degree; 5 Comparable[] keys; 6 DiskAddress[] locs; 7 Node[ ] kids; 9 Node(int m) { 10 keys = new String[m-1]; 11 locs = new DiskAddress[m-1]; 12 kids = new Node[m]; 13 } 14 } 16 private int degree; 17 private Node root; 19 public MST(int m) { 20 degree = m; 21 root = new Node(m); 22 } 23 }

Java MST.Node 객체

13.9 B-트리 차수가 m인 B-트리는 다음을 만족하는 차수가 m인 다원 탐색 트리임 모든 리프 노드는 동일한 레벨에 있음 루트가 아닌 모든 내부 노드는 최소한 의 차수를 가짐 B-트리의 크기에 대한 범위 B-트리의 높이에 대한 범위

B-트리의 예 972년 R. Bayer와 E. McCreight에 의해 개발되었다

B-트리 삽입 B-트리 삽입 알고리즘 입력 : B-트리 T와 키-주소 쌍 (x,y). 출력 : 만일 T가 변경되었으면 true, 아니면 false. 후조건 : 키-주소 쌍 (x,y)는 트리 T에 존재. 1. 만일 T가 공백이면, 키-주소 쌍 (x,y)를 포함하는 단독 트리로 교체하고 true를 리턴. 2. x를 가지고 있는 리프 노드 p를 찾기 위해 다원 탐색 알고리즘을 적용. 3. 만일 x가 p에 있고 그것의 주소가 y이면, false를 리턴. 4. 만일 x가 p에 있고 그것의 주소가 y가 아니면, 그 주소를 y로 교체하고 true를 리턴. 5. 만일 x가 p에 없으면, 키-주소 쌍 (x,y)를 삽입. 6. 만일 p가 오버플로되면, 그것을 분할. 7. true를 리턴.

B-트리 삭제 B-트리 삭제 알고리즘 입력 : B-트리 T와 키 x. 출력 : 만일 T가 변경되었으면 true, 아니면 false. 후조건 : 키 x가 트리 T에 없음. 1. x를 가지고 있는 리프 노드 p를 찾기 위해 다원 탐색 알고리즘을 적용. 2. 만일 x를 찾을 수 없으면, false를 리턴. 3. 만일 p가 리프가 아니면, x를 중위 후속자로 교체; 그러면 x는 그 후속자가 되고, p는 그것의 노드가 됨. 4. 만일 p가 최소가 아니면, x를 삭제하고 true를 리턴. 5. 만일 p의 형제들 중의 하나가 최소가 아니면, 그것을 x로 회전하고 true를 리턴. 6. p를 그것의 형제들 중의 하나 및 그들의 부모와 결합(join)한 다음, x를 삭제하고 true를 리턴.

높이가 2이고 차수가 4인 B-트리

B-트리 검색 B-트리 검색 알고리즘 입력 : 다원 탐색 트리 T와 키 x. 출력 : x가 T에 존재하는지 여부. 1. 만일 T가 NIL이라면, false를 리턴. 2. T의 루트에 있는 키 시이퀀스를 이진 탐색; i를 ki-1<x≤ki에 대한 인덱스로 설정. 3. 만일 x=ki이면, true를 리턴. 4. T를 서브트리 Ti로 설정. 5. x에 대해 Ti를 탐색한 결과 반환되는 값을 리턴. 6. 만일 x=ki이면, false를 리턴. 7. 만일 Ti가 NIL이면, ki-1과 ki 사이에 x를 삽입 8. Ti에서 x를 삽입한 결과 반환되는 값을 리턴.

B-트리 분할 연산 B-트리 분할 알고리즘 포화 노드는 하나의 단독 노드 A와 이것의 두 자식이 되는 두 개의 반-포화(half-full) 노드 B와 C로 교체됨 A에 있는 하나의 원소는 원래 노드에 있는 키의 중앙값이다.

13.10 레드-블랙 트리 2-3-4 트리 2-3-4 트리를 이진 트리로 저장 레드-블랙 트리 차수가 4인 B-트리는 각각의 내부 노드가 2, 3, 4 개의 자식을 가지고 있기 때문에 2-3-4 트리라고도 불림 세 개의 자식을 가지고 있는 노드를 3-노드라고 부르고, 네 개의 자식을 가지고 있는 노드를 4-노드라고 부름 2-3-4 트리를 이진 트리로 저장 2-3-4 트리를 이진 트리로 저장하는 아이디어는 각각의 3-노드를 크기 2인 이진 트리로 표현하고, 각각의 4-노드는 크기 3인 이진 트리로 표현 레드-블랙 트리 이진 트리의 일반적인 노드는 블랙으로 표현하고, 3-노드와 4-노드는 레드로 표현한 트리 모든 단독 노드는 블랙이고, 3-노드와 4-노드는 레드-블랙 서브트리로 교체

레드-블랙 트리 노드를 B-트리 노드로 표현

B-트리를 표현하는 레드-블랙 트리

레드-블랙 트리로 변환 방법 레드-블랙 트리로 변환된 후에도 순서가 유지되는 2-3-4 트리에 있는 서브트리

레드-블랙 트리 특성 다음과 같은 레드-블랙-트리 특성을 만족하는 모든 이진 탐색 트리는 2-3-4 트리로 표현됨 1. 각각의 노드는 레드 또는 블랙이다. 2. 루트와 NIL 노드는 블랙이다. 3. 각각의 레드 노드의 두 자식은 블랙이다. 4. 모든 루트-리프 경로는 동일한 개수의 블랙 노드를 가지고 있다.

블랙 높이가 2인 레드-블랙 트리

레드-블랙 트리 삽입 레드-블랙 트리 삽입 알고리즘 입력 : 레드-블랙 트리 T와 키-주소 쌍. 출력 : 이미 키가 T에 있으면 false, 아니면 true. 후조건 : 키-주소 쌍은 트리 T에 존재. 1. 만일 T가 공백이면, 이것을 블랙 노드로 키를 포함하는 단독 트리로 만들고, true를 리턴. 2. r을 T의 루트로 설정. 3. r이 리프가 아닌 동안, 단계 4-8을 반복. 4. 만일 r이 블랙이고 그것의 두 자식이 레드라면, 모든 세 노드를 다시 색칠. 5. 만일 r과 그것의 부모가 레드라면 r, 부모, 조부모를 회전. 6. 만일 key<r.key 라면, r=r.left로 설정. 7. 아니고, 만일 key>r.key 라면, r=r.right로 설정. 8. 아니면, false를 리턴(key=r.key이기 때문에) 9. 만일 key<r.key 라면, r.left를 키-주소 쌍을 가지는 새로운 레드 노드로 설정. 10. 아니고, 만일 key>r.key 라면, r.right를 키-주소 쌍을 가지는 새로운 레드 노드로 설정. 11. 아니면, false를 리턴(key=r.key이기 때문에) 12. 만일 r이 레드이면, r, 부모, 새로운 노드를 회전 13. true를 리턴.

레드-블랙 트리를 위한 회전

레드-블랙 트리에 삽입하는 예