CHAP 12: 탐색 순천향대학교 컴퓨터학부 2016. 11. 24 하 상 호.

Slides:



Advertisements
Similar presentations
Ⅰ. 연산자 Ⅱ. 제어 구조. 연산자 : 할당 연산자 - 사용자가 정의한 변수에 임의의 값을 저장하는 기능 strvar = strVar1+ “ Hello ”
Advertisements

알고리즘 기본 개념 정렬 알고리즘 탐색 알고리즘 알고리즘 복잡도.
2.6 탐색(Search) 1. 순차검색 (Sequential Search, Linear Search)
주요 내용 기본 용어 이진 트리(binary tree) 이진 탐색 트리(binary search tree)
T-tree 엄종진 강원대학교 컴퓨터과학과.
연결리스트(linked list).
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
트리 이 현 직
제 3 장 선형 리스트 3.1 선형 리스트 3.2 연결 리스트 3.3 다항식.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
Chapter 8. AVL Search Trees
Heesang kim PL/SQL 3 Heesang kim.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
13 인덱스 인덱스의 개념 인덱스의 구조 인덱스의 효율적인 사용 방법 인덱스의 종류 및 생성 방법 인덱스 실행 경로 확인
제 11 장 다원 탐색 트리.
자료구조: CHAP 4 리스트 (1) 순천향대학교 컴퓨터공학과 하 상 호.
자료구조: CHAP 7 트리(1) 순천향대학교 컴퓨터공학과 하 상 호.
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
11장. 1차원 배열.
CHAP 7: 트 리 (1) 한 성 대 학 교 정보통신공학과 봉 정 식.
13 인덱스 인덱스의 개념 인덱스의 구조 인덱스의 효율적인 사용 방법 인덱스의 종류 및 생성 방법 인덱스 실행 경로 확인
13. 탐색 트리.
10장 컴퓨터 기반 데이터 획득 응용 프로그램 LabVIEW 사용법
Introduction To Data Structures Using C
다음 주 과제 기말고사 시험범위 : 7장 ~12장 필기시험 : 2016년 12월 12일(6교시) 필기장소 : E???
CHAP 10:그래프 (2) 순천향대학교 하상호.
자바 5.0 프로그래밍.
인터넷응용프로그래밍 JavaScript(Intro).
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
CHAP 9: 정렬 순천향대학교 컴퓨터학부 하 상 호.
자료구조: 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.
쉽게 배우는 알고리즘 7장. 상호 배타적 집합의 처리.
8장. 상호 배타적 집합의 처리.
11장 균형 탐색 트리.
알고리즘: 우선순위 큐(8장) 순천향대학교 컴퓨터 학부 하 상 호.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
제 1 강.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
CHAP 12: 탐색 순천향대학교 컴퓨터학부 하 상 호.
리스트(List)를 이용한 자료 관리 이점숙 /
13장. 균형 탐색 트리 and the pain you must suffer to learn them
트리.
균형이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)와의 차이점
CHAP 12:탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 12 : 탐색.
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 27).
알고리즘 알고리즘이란 무엇인가?.
데이터 동적 할당 Collection class.
알고리즘: 우선순위 큐(8장) 순천향대학교 컴퓨터 학부 하 상 호.
자료구조론 12장 검색(search).
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
DA :: 퀵 정렬 Quick Sort 퀵 정렬은 비교방식의 정렬 중 가장 빠른 정렬방법이다.
다음 주 과제 기말고사 시험범위 : 6장 ~12장 필기시험 : 2015년 12월 18일(5교시) 필기장소 : E327
5장. 선택 알고리즘.
7주차: Functions and Arrays
강의 #11 탐색(Search).
쉽게 배우는 알고리즘 2장. 점화식과 점근적 복잡도 분석
Chapter 10 데이터 검색1.
CHAP 9: 정렬 순천향대학교 컴퓨터학부 하 상 호.
트리 (Logical) Data Structures Linear list Tree Graph Linear structures
컴퓨터 개론 √ 원리를 알면 IT가 맛있다 쉽게 배우는 컴퓨터 기본 원리 한빛미디어 교재출판부.
제 4 장 Record.
어서와 C언어는 처음이지 제21장.
C++ Espresso 제15장 STL 알고리즘.
6 객체.
Presentation transcript:

CHAP 12: 탐색 순천향대학교 컴퓨터학부 2016. 11. 24 하 상 호

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

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

순차 탐색 알고리즘 알고리즘 복잡도 int seq_search(a: array of integers, key, low, high: integer) { i: integer; // 탐색이 성공이면, 키 값의 인덱스를 반환화고, // 탐색이 실패이면, -1을 반환하라. }

ⅹ 이진탐색 영어사전 정렬된 배열의 탐색에는 이진 탐색(binary search)이 적합 배열의 중앙에 있는 값을 조사하여 찾고자 하는 항목이 왼쪽 또는 오른쪽 부분 배열에 있는지를 알아내어 탐색의 범위를 반으로 줄인다. (예) 10억 명중에서 이진 탐색을 이용하여 특정한 이름을 탐색 순차 탐색에서 비교 회수는? 이진탐색에서 비교 회수는? 5을 탐색하는 경우 7과 비교 영어사전 1 3 5 6 7 9 11 20 30 ⅹ 5< 7이므로 앞부분만을 다시 탐색 moveable 1 3 5 6 7 9 11 20 30 move 5를 3과 비교 1 3 5 6 7 9 11 20 30 5> 3이므로 뒷부분만을 다시 탐색 1 3 5 6 7 9 11 20 30 5==5이므로 탐색성공 data 1 3 5 6 7 9 11 20 30

이진탐색 알고리즘 알고리즘 알고리즘 복잡도는? search_binary(list: array of integers, key, low, high: integer) { // 탐색 성공시 색인 값 반환하고, 그렇지 않으면 -1 반환 middle: integer; if (low <= high) { middle = (low + high) / 2; } return -1;

이진탐색 알고리즘 (반복 버전) 알고리즘 알고리즘 복잡도는? search_binary(list: array of integers, key, low, high: integer) { middle: integer; }

색인순차탐색 색인 순차 탐색(indexed sequential search) 방법은 인덱스(index)라 불리는 테이블을 사용하여 탐색의 효율을 높이는 방법 인덱스 테이블은 주 자료 리스트에서 일정 간격으로 발췌한 자료를 가지고 있다. 주 자료 리스트와 인덱스 테이블은 모두 정렬되어 있어야 한다. 인덱스 테이블 구조체 typedef struct { int key; int index; } itable 22 자료 리스트 크기가 n이고, 인덱스 테이블 크기가 m이면, 인덱스 테이블 항목 i는 자료 리스트의 i *(n/m)번째 항목을 갖는다.

색인순차탐색 알고리즘 인덱스 테이블 구조체 typedef struct { int key; int index; } itable Integer searchIndex(a, itab: array of itable, key, n, m: integer) // n: 주자료테이블 크기, m: 인덱스 테이블 크기 I, low, high: integer; if (key < a[0] or key > a[n-1]) // key가 리스트 범위에 속하지 않으면 then return -1; // key가 속한 인덱스 테이블 구간을 결정해서, 그 구간내 순차 탐색 수행 // 결정된 구간의 범위 결정: low & high // 결정된 구간 범위에서 순차 탐색 return seqSearch(a, key, low, high); end searchIndex 알고리즘 22

균형이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)와의 차이점 이진 탐색과 이진 탐색 트리는 근본적으로 같은 원리에 의한 탐색 구조 이진 탐색은 자료들이 배열에 저장되어 있으므로 삽입과 삭제가 상당히 힘들다. 즉 자료를 삽입하고 삭제할 때마다 앞뒤의 원소들을 이동시켜야 한다. 이진 탐색 트리는 비교적 빠른 시간 안에 삽입과 삭제를 끝마칠 수 있는 구조 삽입, 삭제가 빈번히 이루어진다면 반드시 이진 탐색 트리를 사용하여야 한다. 이진 탐색 트리는 균형 트리를 보장하지 않는다. 이진탐색트리에서의 시간복잡도 균형트리: 불균형트리:

Recall: 이진 탐색 트리 정의? 탐색 알고리즘 모든 원소의 키는 유일 Key(왼쪽 서브트리의 노드) < Key(루트 노드) Key(오른쪽 서브트리의 노드) > Key(루트 노드) 왼쪽, 오른쪽 서브트리도 이진 탐색 트리 탐색 알고리즘 Search(T, key) { p <- T; }

AVL 트리 Adelson-Velskii와 Landis에 의해 1962년에 제안된 트리 각 노드에서 왼쪽 서브 트리의 높이와 오른쪽 서브 트리의 높이 차이가 1 이하인 이진 탐색 트리 트리가 비균형 상태로 되면 스스로 노드들을 재배치하여 균형 상태로 만든다. AVL 트리는 균형 트리를 항상 보장 정의 균형 인수(balance factor): (왼쪽 서브 트리의 높이 - 오른쪽 서브 트리의 높이) 모든 노드의 균형 인수가 ±1 이하이면 AVL 트리이다.

AVL 트리의 연산 탐색연산: 이진탐색트리와 동일 균형을 이룬 이진 탐색 트리에서 균형 상태가 깨지는 것은 삽입 연산과 삭제 연산시이다. 삽입 연산시에는 삽입되는 위치에서 루트까지의 경로에 있는 조상 노드들의 균형 인수에 영향을 줄 수 있다. 따라서 즉 새로운 노드의 삽입 후에 불균형 상태로 변한 가장 가까운 조상 노드, 즉 균형 인수가 ±2가 된 가장 가까운 조상 노드의 서브 트리들에 대하여 다시 균형을 잡아야 한다.

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

예제: AVL 트리의 삽입 연산 LL 타입 LR 타입 8 8 2 9 2 1 7 1 5

예제: AVL 트리의 삽입 연산 RR 타입 RL 타입 2 7 1 5 8 3 7 9 4

삽입 연산: LL 유형 N을 A의 왼쪽 서브트리의 왼쪽 서브트리에 삽입 방법: LL 회전 N: 새로 삽입된 노드 A: N으로부터 가장 가까우면서 균형인수가 ±2가 된 조상 노드 방법: LL 회전 A부터 N까지의 경로상의 노드들을 오른쪽으로 회전

삽입 연산: LL 유형 예제 8 2 1

삽입 연산: LL 유형 알고리즘 nodeptr rotateLL(A: nodeptr) { B: nodeptr; return B; }

삽입 연산: RR 유형 N을 A의 오른쪽 서브트리의 오른쪽 서브트리에 삽입 방법: RR 회전 N: 새로 삽입된 노드 A: N으로부터 가장 가까우면서 균형인수가 ±2가 된 조상 노드 방법: RR 회전 A부터 N까지의 경로상의 노드들을 왼쪽으로 회전

삽입 연산: RR 유형 예제 7 8 9

삽입 연산: RR 유형 알고리즘 nodeptr rotateRR(A: nodeptr) { B: nodeptr; return B; }

삽입 연산: LR 유형 N을 A의 왼쪽 서브트리의 오른쪽 서브트리에 삽입 방법: LR 회전 N: 새로 삽입된 노드 A: N으로부터 가장 가까우면서 균형인수가 ±2가 된 조상 노드 방법: LR 회전 두 번의 회전 필요 RR 회전, LL 회전

삽입 연산: LR 유형 예제 8 2 9 1 7 5

삽입 연산: LR 유형 알고리즘 nodeptr rotateLR(A: nodeptr) { B: nodeptr; }

삽입 연산: RL 유형 N을 A의 오른쪽 서브트리의 왼쪽 서브트리에 삽입 방법: RL 회전 N: 새로 삽입된 노드 A: N으로부터 가장 가까우면서 균형인수가 ±2가 된 조상 노드 방법: RL 회전 두 번의 회전 필요 LL 회전, RR 회전

삽입 연산: RL 유형 예제 2 1 5 3 7 4

삽입 연산: RL 유형 알고리즘 nodeptr rotateRL(A: nodeptr) { B: nodeptr; }

예제 다음 리스트를 순차적으로 삽입하면서 AVL 트리를 구성하라. (7, 8, 9, 2, 1, 5, 3, 6, 4)

문제 다음 리스트를 순차적으로 삽입하면서 AVL 트리를 구성하라. (60, 50, 20, 80, 90, 70, 55, 10, 40, 35)

AVL 트리: 알고리즘 트리 탐색 avlSearch(T, key) // 탐색된 노드를 반환 { if (T = null) then return null; }

AVL 트리: 알고리즘 트리 탐색시 비교 회수 계산하여 반환 AvlCount(T, key) { if (T = null) then return 0; }

AVL 트리: 알고리즘 노드 삽입 AvlAdd(T, key) { if (T = null) then T = getNode(key); else { } return T;

AVL 트리: 알고리즘 노드 삽입 AvlAdd(T, key) { if (T = null) then T = getNode(key); else { if (key < T.data) then { T.left <- avlAdd(T.left, key); T <- rebalance(T); } else if (key > T.data) then { T.right <- avlAdd(T.right, key); } else { error (“key 중복”); } return T;

AVL 트리: 알고리즘 rebalance rebalance(T) { diff <- getHeightDiff(T); // T의 bf를 구함 }

AVL 트리: 알고리즘 rebalance rebalance(T) { diff <- getHeightDiff(T); if (diff > 1 ) then { // LL or LR type if (getHeightDiff(T.left) > 0) then return rotateLL(T); else return rotateLR(T); } else if (diff < -1 ) then // RR or RL type if (getHeightDiff(T.right) > 0) then return rotateRR(T); return rotateRL(T); else return T; }

AVL 트리: 알고리즘 getHeightDiff(T) getHeight(T) getHeightDiff(T) { }