CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.

Slides:



Advertisements
Similar presentations
언어의 자서전 소단원 (1) 단원. 언어의 특성 기호성 자의성 사회성 규칙성 창조성 역사성.
Advertisements

자료구조: CHAP 7 트리(1) 순천향대학교 컴퓨터공학과 하 상 호.
1. 자료구조 개념 (1) 자료구조의 개요 1) 자료구조 ① 일련의 자료들을 조직하고 구조화하는 것 ② 자료의 표현과 그것과 관련된 연산 2) 자료구조에 따라 저장공간의 효율성과 프로그램의 실행시간이 달라짐 3) 어떠한 자료구조에서도 필요한 모든 연산들을 처리하는 것이.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
8. 파일 인덱스: 탐색트리 (Search Tree)
Chapter 7. Binary Search Trees - 보충 자료-
시스템 생명 주기(System Life Cycle)(1/2)
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 1 강원대학교 컴퓨터과학전공 문양세.
Horowitz, Sahni and Anderson-Freed Computer Science Press
6장 트리.
DC Motor Control.
[INA470] Java Programming Youn-Hee Han
제5장 트리.
시스템 생명 주기(System Life Cycle)(1/2)
CHAP 7:트리.
강의 #7 트리(Tree).
쉽게 배우는 알고리즘 5장. 검색트리
자료구조: CHAP 7(3) 트리 순천향대학교 컴퓨터공학과 하 상 호.
자료구조: CHAP 7 이진 탐색 트리 순천향대학교 컴퓨터공학과 하 상 호.
CHAP 9 : 정렬.
자료구조 김현성.
제 8 장 이진 탐색 트 리 8.1 이진 탐색 트리 정의 8.2 이진 탐색 트리의 탐색 8.3 이진 탐색 트리의 삽입
Chapter 8. AVL Search Trees
C언어 응용 제 10 주 트리.
Chapter 9 정렬(sorting) SANGJI University Kwangman KO
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수.
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
12 검색.
IT CookBook, 자바로 배우는 쉬운 자료구조
정렬과 합병.
CHAP 8:우선순위큐 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
Tree & Heap SANGJI University Kwangman Ko
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
다음 주 과제 기말고사 시험범위 : 7장 ~12장 필기시험 : 2016년 12월 12일(6교시) 필기장소 : E???
AVLTree vs 편향 Tree.
C언어 응용 제10주 실습 해보기 제8장 트리.
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
CHAP 9: 정렬 (part 2) 순천향대학교 컴퓨터학부 하 상 호.
[CPA340] Algorithms and Practice Youn-Hee Han
4장 - PHP의 표현식과 흐름 제어-.
T-Tree MMDB 강원대학교 컴퓨터 과학과 양 기 운
선택 정렬 #define SWAP(x, y, t) {(t) = (x); (x) = (y); (y) = (t);}
Lecture 8 복잡한 구조 프로그래밍 프로그램 짤 때의 마음가짐 invariant 데이터 구성 list pair
자료구조: CHAP 7(2) 트리 순천향대학교 컴퓨터공학과 하 상 호.
CHAP 12: 탐색 순천향대학교 컴퓨터학부 하 상 호.
#1 배열 활용 #include int main(void) { int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; for(i=0;i.
CHAP 8:우선순위큐.
CHAP 12: 탐색 순천향대학교 컴퓨터학부 하 상 호.
13장. 균형 탐색 트리 and the pain you must suffer to learn them
C언어 응용 제 15 주 검색.
CHAP 12:탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 12 : 탐색.
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 27).
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
다음 주 과제 기말고사 시험범위 : 6장 ~12장 필기시험 : 2015년 12월 18일(5교시) 필기장소 : E327
알고리즘(Algorithm) 유비쿼터스 컴퓨팅학과 교수 송 창근
조별 주제 발표 -기프트리(gifTree)-
제 8 장 계산복잡도 개론 검색 문제 알고리즘 강의 슬라이드 8 검색 문제
알고리즘 강의 슬라이드 2 분할정복 제 2 장 분할정복 도경구역, 알고리즘, 사이텍미디어, 1999.
코딩체험교실 아두이노 로봇 코딩 4차산업기술 체험 (SW코딩/자율주행기술).
강의 #11 탐색(Search).
탐색 선형 탐색, 이진 탐색, 이진 탐색 트리.
제 5 장 탐색트리.
Chapter 07 트리.
(Ⅰ) 독서와 언어의 본질 언어의 본질 1 2 [고등 국어] – 독서와 문법 독서의 본질 (1) 독서의 특성
CHAP 8:우선순위큐 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
DataScience Lab. 박사과정 김희찬 (화)
Presentation transcript:

CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2011

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

순차 탐색(sequential search) 탐색 방법 중에서 가장 간단하고 직접적인 탐색 방법 정렬되지 않은 배열을 처음부터 마지막까지 하나씩 검사하는 방법 평균 비교 횟수 탐색 성공: (n + 1)/2번 비교 탐색 실패: n번 비교 시간 복잡도: O(n) 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; // 탐색 실패 }

개선된 순차탐색 반복문의 리스트 끝 테스트 배제 리스트 끝에 탐색 키 저장 키 값을 찾을 때 반복문 탈출 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; // 탐색 성공 }

이진탐색(binary search) 정렬된 배열의 탐색에 적합 배열의 중앙에 있는 값을 조사하여 찾고자 하는 항목이 왼쪽 또는 오른쪽 부분 배열에 있는지를 알아내어 탐색의 범위를 반으로 줄여가며 탐색 진행 (예) 10억 명중에서 특정한 이름 탐색 이진탐색 : 단지 30번의 비교 필요 순차 탐색 : 평균 5억 번의 비교 필요

이진탐색

이진탐색 알고리즘 이진탐색 프로그램 int search_binary2(int key, int low, int high) 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]에서의 탐색; 이진탐색 프로그램 int search_binary2(int key, int low, int high) {int middle; while( low <= high ){ // 아직 숫자들이 남아 있으면 middle = (low+high)/2; if( key == list[middle] ) return middle; // 탐색 성공 else if( key > list[middle] ) low = middle+1; // 왼쪽 부분리스트 탐색 else high = middle-1; // 오른쪽 부분리스트 탐색 } return -1; // 탐색 실패

이진탐색

색인 순차탐색 (indexed sequential search) 주 자료 리스트에서 일정 간격으로 발췌한 자료 저장 주 자료 리스트와 인덱스 테이블은 모두 정렬되어 있어야 함 복잡도: O(m+n/m) 인덱스 테이블의 크기=m, 주자료 리스트의 크기=n

보간탐색(interpolation search) 사전이나 전화번호부를 탐색하는 방법 ‘ㅎ’으로 시작하는 단어는 사전의 뒷부분에서 찾음 ‘ㄱ'으로 시작하는 단어는 앞부분에서 찾음 탐색키가 존재할 위치를 예측하여 탐색하는 방법: O(log(n)) 보간 탐색은 이진 탐색과 유사하나 리스트를 불균등 분할하여 탐색

보간탐색(interpolation search)

균형 이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)의 차이점 이진 탐색과 이진 탐색 트리는 근본적으로 같은 원리에 의한 탐색 구조 이진 탐색은 자료들이 배열에 저장되어 있으므로 삽입/삭제가 매우 비효율 자료의 삽입/삭제 시 원소들을 모두 이동시켜야 함 이진 탐색 트리는 매우 빠르게 삽입/삭제 수행 삽입, 삭제가 빈번히 이루어진다면 이진탐색트리가 유리함 이진탐색트리에서의 시간복잡도 균형트리: O(log(n)) 불균형트리: O(n), 순차탐색과 동일

AVL 트리 Adelson-Velskii와 Landis에 의해 1962년에 제안된 트리 모든 노드의 왼쪽과 오른쪽 서브트리의 높이 차가 1이하인 이진탐색트리 트리가 비균형 상태로 되면 스스로 노드들을 재배치하여 균형 상태 유지 평균, 최선, 최악 시간적복잡도: O(log(n)) 균형 인수(balance factor) =(왼쪽 서브 트리의 높이 - 오른쪽 서브 트리의 높이) 모든 노드의 균형 인수가 ±1 이하이면 AVL 트리

AVL 트리의 삽입연산 탐색연산: 이진탐색트리와 동일 삽입 연산과 삭제 연산 시 균형 상태가 깨질 수 있음 삽입 연산 삽입 위치에서 루트까지의 경로에 있는 조상 노드들의 균형 인수 영향 삽입 후에 불균형 상태로 변한 가장 가까운 조상 노드(균형 인수가 ±2가 된 가장 가까운 조상 노드)의 서브 트리들에 대하여 다시 재균형 삽입 노드부터 균형 인수가 ±2가 된 가장 가까운 조상 노드까지 회전

AVL트리의 삽입연산 AVL 트리의 균형이 깨지는 4가지 경우(삽입된 노드 N으로부터 가장 가까우면서 균형 인수가 ±2가 된 조상 노드가 A라면) LL 타입: N이 A의 왼쪽 서브 트리의 왼쪽 서브 트리에 삽입 LR 타입: N이 A의 왼쪽 서브 트리의 오른쪽 서브 트리에 삽입 RR 타입: N이 A의 오른쪽 서브 트리의 오른쪽 서브 트리에 삽입 RL 타입: N이 A의 오른쪽 서브 트리의 왼쪽 서브 트리에 삽입 각 타입별 재균형 방법 LL 회전: A부터 N까지의 경로상 노드의 오른쪽 회전 LR 회전: A부터 N까지의 경로상 노드의 왼쪽-오른쪽 회전 RR 회전: A부터 N까지의 경로상 노드의 왼쪽 회전 RL 회전: A부터 N까지의 경로상 노드의 오른쪽-왼쪽 회전

LL 회전 방법

RR 회전 방법

RL 회전 방법

LR 회전 방법

AVL 트리 단순회전 알고리즘 AVL 트리 이중회전 알고리즘 rotate_LL(A) B의 오른쪽 자식을 A의 왼쪽 자식으로 만든다 A를 B의 오른쪽 자식 노드로 만든다. rotate_RR(A) B의 왼쪽 자식을 A의 오른쪽 자식으로 만든다 A를 B의 왼쪽 자식 노드로 만든다. AVL 트리 이중회전 알고리즘 rotate_RL(A) rotate_LL(B)가 반환하는 노드를 A의 오른쪽 자식으로 만든다 rotate_RR(A) rotate_LR(A) rotate_RR(B)가 반환하는 노드를 A의 왼쪽 자식으로 만든다 rotate_LL(A)

2-3 트리 차수가 2 또는 3인 노드를 가지는 트리 2-노드 3-노드 이진탐색트리 처럼 하나의 데이터 k1와 두 개의 자식 노드를 가진다 3-노드 2개의 데이터 k1, k2와 3개의 자식노드를 가진다 왼쪽 서브 트리에 있는 데이터들은 모두 k1보다 작은 값이다 중간 서브 트리에 있는 값들은 모두 k1보다 크고 k2보다 작다 오른쪽에 있는 데이터들은 모두 k2보다 크다

2-3 트리 2-3 트리 삽입의 예

2-3 트리 탐색 프로그램 tree23_search(Tree23Node *root, int key) { if( root == NULL ) // 트리가 비어 있으면 return FALSE; else if( key == root->key1 ) // 루트의 키==탐색 키 return TRUE; else if( root->type == TWO_NODE ) { // 2-노드 if( key < root->key1 ) return tree23_search(root->left, key) else return tree23_search(root->right, key) } else { // 3-노드 else if( key > root->key2 ) return tree23_search(root->middle, key)

2-3 트리 단말노드 분리

2-3 트리 비단말노드 분리

2-3 트리 루트노드 분리