38
01. 순차 탐색 02. 이진 탐색 03. 이진 탐색 트리 04. 레드 블랙 트리

01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

  • Upload
    others

  • View
    17

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

01. 순차 탐색02. 이진 탐색

03. 이진 탐색 트리04. 레드 블랙 트리

Page 2: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

탐색(search)◦ 기본적으로 여러 개의 자료 중에서 원하는 자료를 찾는 작업

◦ 컴퓨터가 가장 많이 하는 작업 중의 하나◦ 탐색을 효율적으로 수행하는 것은 매우 중요. 탐색키(search key)◦ 항목과 항목을 구별해주는 키(key)탐색을 위하여 사용되는 자료 구조◦ 배열, 연결 리스트, 트리, 그래프 등

탐색키 데이터

Page 3: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

순차 탐색(sequential search)◦ 탐색 방법 중에서 가장 간단하고 직접적인 탐색 방법◦ 정렬되지 않은 배열의 항목들을 처음부터 마지막까지 하나씩 검사하여 원하는 항목을 찾아가는 방법

int seq_search(int key, int low, int high)

{

int i;

for(i=low; i<=high; i++)

if(list[i]==key)

return i; // 탐색 성공

return -1; // 탐색 실패

}

Page 4: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

순차 탐색에서 비교 횟수를 줄이기 위해 리스트의 끝에 찾고자 하는키 값을 저장하고 반복문의 탈출 조건을 키 값을 찾을 때까지로 설정

int seq_search2(int key, int low, int high)

{

int i;

list[high+1] = key;

// 키값을 찾으면 종료

for(i=low; list[i] != key; i++)

;

if(i==(high+1)) return -1; // 탐색 실패

else return i; // 탐색 성공

}

Page 5: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

자기 구성 순차 탐색(Self-Organizing Sequential Search)◦ 자주 사용되는 항목을 데이터 집합의 앞쪽에 배치함으로써 순차탐색의 검색 효율을 끌어올리는 방법

전진 이동법(Move To Front)전위법(Transpose)빈도 계수법(Frequency Count)

Page 6: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

전진 이동법(Move to front method) ◦ 어느 항목이 한번 탐색되고 나면, 그 항목을 데이터 집합의 가장앞(링크드 리스트에서는 헤드)에 위치시키는 방법

Page 7: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

전위법(Transpose method) ◦ 탐색된 항목을 바로 이전 항목과 교환한다는 것 말고는 기본적으로 전진 이동법과 같은 전략을 취하는 알고리즘

Page 8: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

계수법(Frequency count method)◦ 데이터 집합내의 각 요소들이 탐색된 횟수를 별도의 공간에 저장해 두고, 탐색된 횟수가 높은 순으로 데이터 집합을 재구성

◦ 계수 결과를 저장하는 별도의 공간을 유지해야 하고 계수 결과에따라 데이터 집합을 재배치해야 한다.

Page 9: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

정렬된 데이터 집합에서 사용할 수 있는 “고속” 탐색 알고리즘

찾고자하는 값을 찾을 때까지 1번~3번 과정을 반복

목표 값이 중앙 요소의 값보다 작다면 중앙을 기준으로 데이터 집합의 왼편에 대

해 새로 검색을 수행하고 크다면 오른편에 대해 이진 탐색을 새로이 수행

중앙 요소의 값과 찾고자 하는 목표 값을 비교

데이터 집합의 중앙에 있는 요소 선택

Page 10: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

배열의 중앙에 있는 값을 조사하여 찾고자 하는 항목이 왼쪽 또는 오른쪽 부분 배열에 있는지를 알아내어 탐색의 범위를 반으로 줄인다. (예) 10억 명중에서 이진 탐색을 이용하여 특정한 이름을 탐색◦ 이진탐색은 단지 30번의 비교◦ 순차 탐색에서는 평균 5억 번의 비교

1 3 5 6 7 9 11 20 30

•5을 탐색하는 경우

5< 7이므로 앞부분만을 다시 탐색

5를 3과 비교

5> 3이므로 뒷부분만을 다시 탐색

5==5이므로 탐색성공

7과 비교

1 3 5 6 7 9 11 20 30

1 3 5 6 7 9 11 20 30

1 3 5 6 7 9 11 20 30

1 3 5 6 7 9 11 20 30

ⅹ영어사전

Page 11: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

이진 탐색 예

Page 12: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

search_binary(list, low, high)

middle ← low에서 high사이의 중간 위치

if( 탐색값 ≠ list[middle] )

return TRUE;

else if (탐색값 < list[middle] )

return list[0]부터 list[middle-1]에서의 탐색;

else if (탐색값 > list[middle] )

return list[middle+1]부터 list[high]에서의 탐색;

Page 13: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

이진 탐색의 성능◦ 탐색 대상의 범위 : ½ ¼ 1/16 …◦ Let n : 데이터 집합의 크기

x : 탐색 반복 횟수1 = n x (1/2)xx = log2n

◦ 100만개의 데이터 집합 : 최대 20회◦ 1000만개의 데이터 집합 : 최대 23회 …

Page 14: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

이진 탐색의 구현

ElementType BinarySearch(ElementType DataSet[], int Size, ElementType Target){

int Left, Right, Mid;

Left = 0;Right = Size - 1;

while ( Left <= Right ){

Mid = (Left + Right) / 2;

if ( Target == DataSet[Mid] )return DataSet[Mid];

else if ( Target > DataSet[Mid] )Left = Mid + 1;

elseRight = Mid - 1;

}

return NULL; }

Page 15: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

C 표준 라이브러리의 이진 탐색 함수 bsearch()

void *bsearch( const void *key, /* 찾고자 하는 목표 값 데이터의 주소 */const void *base, /* 데이터 집합 배열의 주소 */size_t num, /* 데이터 요소의 개수 */size_t width, /* 한 데이터 요소의 크기 */int (__cdecl *compare)(const void *, const void *) /* 비교 함수에 대한 포인터 */

);

Page 16: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

각 노드가 다음 규칙을 따르는 이진 트리◦ “왼쪽 자식 노드는 부모보다 작고, 오른쪽 자식 노드는 부모보다 크다.”

이진 탐색 트리의 예

Page 17: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

이진탐색(binary search) vs. 이진탐색트리(binary search tree)◦ 근본적으로같은원리에의한탐색 구조◦ 이진탐색은배열에저장된데이터를탐색

동적으로크기가변하는데이터집합 탐색에는부적합삽입과삭제가상당히힘들다.

◦ 이진탐색트리는연결리스트데이터에대한탐색비교적빠른시간 안에삽입과삭제를끝마칠수 있는구조

◦ 삽입, 삭제가빈번히이루어진다면반드시이진탐색 트리를사용하여야한다.

이진탐색트리에서의시간복잡도◦ 균형트리: O(logn)◦ 불균형트리: O(n), 순차탐색과동일

Page 18: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

이진 탐색 트리의 연산◦ 노드 탐색◦ 노드 삽입◦ 노드 삭제

Page 19: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

이진 탐색 트리에서의 이진 탐색

Page 20: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

이진 탐색 트리에서의 노드 삽입

Page 21: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

이진 탐색트리에서의 노드 삭제 #1◦ 삭제할 노드가 잎 노드인 경우

Page 22: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

이진 탐색트리에서의 노드 삭제 #2◦ 삭제할 노드가 잎 노드가 아닌 경우 && 왼쪽/오른쪽 중 어느 한쪽 자식 노드만 갖고 있는 경우

Page 23: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

이진 탐색트리에서의 노드 삭제 #3◦ 삭제할 노드가 잎노드가 아닌 경우 && 양쪽 자식 노드를 모두 갖고 있는 경우

Page 24: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

문제 : 순수 이진 탐색 트리는 다음과 같은 모습을 가질수 있게 되며, 이 때 탐색 효율은 극도로 떨어진다.

해결책 : 트리가 균형잡힌 모습으로 자라도록하는 알고리즘

Page 25: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

레드 블랙 트리 : 모든 노드가 검은색 또는 붉은색

다음의 규칙을 가진다.1. 모든 노드는 빨간색 아니면 검은색이다.2. 루트 노드는 검은색이다.3. 잎 노드는 검은색이다.4. 빨간 노드의 자식들은 모두 검은색이다(하지만 검은색 노드의자식이 빨간색일 필요는 없다.).

5. 루트 노드에서 모든 잎 노드 사이에 있는 검은색 노드의 수는모두 동일하다.

Page 26: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

레드 블랙 트리의 예

Page 27: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

 노드 회전(Rotation)

우회전을 할 때에는 왼쪽 자식 노드의 오른쪽 자식 노드를 부모노드의 왼쪽 자식으로 연결한다.

좌회전을 할 때에는 오른쪽 자식 노드의 왼쪽 자식 노드를 부모노드의 오른쪽 자식으로 연결한다.

Page 28: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

노드 삽입

Page 29: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

노드 삭제◦ 삽입한 노드와 부모 노드가 모두 빨간색일 때

Page 30: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

Adelson-Velskii와 Landis에 의해 1962년에 제안된 트리각노드에서 왼쪽 서브 트리의 높이와 오른쪽 서브 트리의 높이 차이가 1 이하인 이진 탐색 트리◦ 트리가비균형상태로되면스스로노드들을재배치하여균형상태로만든다.

AVL 트리는 균형 트리가 항상 보장되기 때문에 탐색이 O(logn)시간안에 끝나게 된다. 균형 인수(balance factor)=(왼쪽 서브 트리의 높이 - 오른쪽 서브트리의 높이)◦ 모든노드의균형인수가 ±1 이하이면 AVL 트리이다.

Page 31: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

탐색연산: 이진탐색트리와 동일균형을 이룬 이진 탐색 트리에서 균형 상태가 깨지는 것은 삽입 연산과 삭제 연산 시이다.삽입 연산 시에는 삽입되는 위치에서 루트까지의 경로에 있는 조상노드들의 균형 인수에 영향을 줄 수 있다.

새로운 노드의 삽입 후에 불균형 상태로 변한 가장 가까운 조상노드, 즉 균형 인수가 ±2가 된 가장 가까운 조상 노드의 서브 트리들에 대하여 다시 균형을 잡아야 한다.

Page 32: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

균형트리로 만드는 방법: 회전(rotation)

AVL 트리에서 균형이 깨지는 경우에는 다음의 4가지의 경우가 있다. 새로삽입된 노드 N로부터 가장 가까우면서 균형 인수가 가 된 조상 노드를 A라고 하자. ◦ LL 타입: N이 A의 왼쪽 서브 트리의 왼쪽 서브 트리에 삽입된다. ◦ LR 타입: N이 A의 왼쪽 서브 트리의 오른쪽 서브 트리에 삽입된다. ◦ RR 타입: N이 A의 오른쪽 서브 트리의 오른쪽 서브 트리에 삽입된다. ◦ RL 타입: N이 A의 오른쪽 서브 트리의 왼쪽 서브 트리에 삽입된다.

Page 33: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary
Page 34: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary
Page 35: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary

LL 회전:A부터 N까지의 경로상의 노드들을 오른쪽으로 회전시킨다. LR 회전: A부터 N까지의 경로상의 노드들을 왼쪽-오른쪽으로 회전시킨다. RR 회전: A부터 N까지의 경로상의 노드들을 왼쪽으로 회전시킨다. RL 회전: A부터 N까지의 경로상의 노드들을 오른쪽-왼쪽으로 회전시킨다.

Page 36: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary
Page 37: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary
Page 38: 01. 순차탐색 02. 이진탐색 03. 이진탐색트리 04. 레드블랙트리mclab.silla.ac.kr/lecture/201301/algorithm/lecture_07.pdf`이진탐색(binary search) vs. 이진탐색트리(binary