탐색 선형 탐색, 이진 탐색, 이진 탐색 트리.

Slides:



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

신현중학교 김유재 최강 꽃 미남 태릉중학교 정찬혁 성일중학교 방현조 성일중학교 박해찬
자료구조: CHAP 7 트리(1) 순천향대학교 컴퓨터공학과 하 상 호.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
Internet Computing KUT Youn-Hee Han
8. 파일 인덱스: 탐색트리 (Search Tree)
문화이벤트 특강 시민축제에 대하여 애니메이션 김철환.
2017년 스타트Up-청년취Up 매칭사업 개요 □ 사업목적 □ 지원내용 □ 청년인재 정의 □ 스타트업 정의
커뮤니케이션 스킬 UP -전화매너- ..
시스템 생명 주기(System Life Cycle)(1/2)
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 1 강원대학교 컴퓨터과학전공 문양세.
트리 이 현 직
6장 트리.
DC Motor Control.
[INA470] Java Programming Youn-Hee Han
시스템 생명 주기(System Life Cycle)(1/2)
Autokey Cipher 자동키 암호 Department of Cyber Security / 박건주.
CHAP 7:트리.
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 50).
강의 #7 트리(Tree).
쉽게 배우는 알고리즘 5장. 검색트리
자료구조: CHAP 7(3) 트리 순천향대학교 컴퓨터공학과 하 상 호.
자료구조: CHAP 7 이진 탐색 트리 순천향대학교 컴퓨터공학과 하 상 호.
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
CHAP 9 : 정렬.
자료구조 김현성.
쉽게 배우는 알고리즘 5장. 검색트리.
C언어 응용 제 10 주 트리.
Internet Computing KUT Youn-Hee Han
Chapter 9 정렬(sorting) SANGJI University Kwangman KO
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
이진트리 순회 트리내의 모든 노드를 특정 순서에 따라 한번씩 방문 하는 것 방문 순서 R: Moving Right Child
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
1장 – 그래픽스 시스템과 모델 2장 – 그래픽스 프로그래밍 3장 – 입력과 상호작용 4장 – 기하학적 객체와 변환
12 검색.
IT CookBook, 자바로 배우는 쉬운 자료구조
정렬과 합병.
CHAP 8:우선순위큐 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
Tree & Heap SANGJI University Kwangman Ko
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
AVLTree vs 편향 Tree.
C언어 응용 제10주 실습 해보기 제8장 트리.
Tree & Heap SANGJI University Kwangman Ko
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
CHAP 9: 정렬 (part 2) 순천향대학교 컴퓨터학부 하 상 호.
[CPA340] Algorithms and Practice Youn-Hee Han
선택 정렬 #define SWAP(x, y, t) {(t) = (x); (x) = (y); (y) = (t);}
스케줄링 (Scheduling) 시스템 내부시간(time in the system): 스케줄링 문제
자료구조: CHAP 7(2) 트리 순천향대학교 컴퓨터공학과 하 상 호.
센서값 전송하기 WiFi 시리얼 보드 활용가이드 김영준 헬로앱스 (
#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:우선순위큐.
어린이집.
C언어 응용 제 15 주 검색.
CHAP 12:탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 12 : 탐색.
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
제 8 장 계산복잡도 개론 검색 문제 알고리즘 강의 슬라이드 8 검색 문제
타인을 내편으로 만드는 12가지 방법 고객서비스팀.
알고리즘 강의 슬라이드 2 분할정복 제 2 장 분할정복 도경구역, 알고리즘, 사이텍미디어, 1999.
강의 #11 탐색(Search).
아두이노 프로그래밍 4일차 – Part1 모바일 로봇 강사: 김영준 목원대학교 겸임교수
홍미영 부평구 재정 및 운영방향 인천광역시 부평구.
Chapter 07 트리.
(Ⅰ) 독서와 언어의 본질 언어의 본질 1 2 [고등 국어] – 독서와 문법 독서의 본질 (1) 독서의 특성
아두이노 서보로봇 제어 (블루투스 스마트폰 조종) -03차시-
Presentation transcript:

탐색 선형 탐색, 이진 탐색, 이진 탐색 트리

탐색 01. 탐색의 정의 02. 탐색의 종류 03. 선형탐색 (순차 탐색) 04. 이진 탐색 05. 이진 탐색 트리 06. 이진 탐색과 이진 탐색 트리의 차이점

탐색

탐색

탐색 여러 개의 자료 중에서 원하는 자료를 찾는 작업

탐색 탐색의 단위 : 항목 ( 탐색키 + 데이터 ) * 탐색키 : 항목과 항목을 구별시켜 주는 키

탐색 탐색 키와 데이터로 이루어진 항목 중에서 원하는 탐색 키를 가지고 있는 항목을 찾는 것

탐색의 종류 탐색 정렬되지 않은 배열에서의 탐색 정렬된 배열에서의 탐색 순차 탐색 (Sequential Search) = 선형 탐색 이진 탐색(Binary Search) 색인 순차 탐색 보간 탐색

순차 탐색(선형 탐색) 9,5,8,3,7 중에 숫자 하나를 생각 해 주세요.

순차 탐색(선형 탐색) 9 입니까 ? NO YES

순차 탐색(선형 탐색) 5 입니까 ? NO YES

순차 탐색(선형 탐색) 8 입니까 ? NO YES

순차 탐색(선형 탐색) 3 입니까 ? NO YES

순차 탐색(선형 탐색) 7 입니까 ? NO YES

순차 탐색(선형 탐색) STOP YES 생각한 숫자는 ( ) 에요.

순차 탐색(선형 탐색) 정렬되지 않은 배열의 항목들을 처음부터 마지막까지 검사하여 원하는 항목을 찾아가는 방법

순차 탐색(선형 탐색) 7을 찾을 경우

순차 탐색(선형 탐색) Function seq_search(key,low,high) { For(i=low;i<=high;i++) if(list[i]==key) return i; // 탐색 성공 return -1; // 탐색 실패 }

이진 탐색 1 ~ 50번까지 있는 소주 병뚜껑 숫자 맞추기 게임 !

이진 탐색 ’9’ 일 경우 UP 25 !

이진 탐색 ’9’ 일 경우 DOWN 14 !

이진 탐색 ’9’ 일 경우 UP 7 !

이진 탐색 ’9’ 일 경우 UP 8 !

이진 탐색 ’9’ 일 경우 정답 9 !

이진 탐색 여기서 부르는 숫자의 공통점은 ?

이진 탐색 부르는 범위의 가운데 위치 숫자

이진 탐색 25 : 1 ~ 50 까지의 숫자 중 가운데 위치 숫자 14 : 1 ~ 25 까지의 숫자 중 가운데 위치 숫자 7 : 1 ~ 14 까지의 숫자 중 가운데 위치 숫자 8 : 7 ~ 9까지의 숫자 중 가운데 위치 숫자

이진 탐색 배열의 중앙에 있는 값을 조사하여 찾고자 하는 항목이 왼쪽 또는 오른쪽 부분 리스트에 있는지 알아내어 탐색의 범위를 반으로 줄여 찾는 방법

이진 탐색 찾고자 하는 항목이 속해 있지 않은 부분은 전혀 고려할 필요가 없기 때문에 비교가 이루어질 때 마다 탐색 범위가 반으로 줄어듬. 데이터 삽입, 삭제가 빈번할 때는 적합하지 않고, 고정된 데이터에 대한 탐색에 적합함.

이진 탐색

이진 탐색 Function search_binary(key,low,high) { while(low<=high) { middle=(low + high) / 2; if(key==low[middle]) return middle; } else if ( key > list[middle]) { low = middle + 1; } else { high=middle + 1; } return -1;

이진 탐색 트리 파일 용량 계산

이진 탐색 트리 이진 탐색 트리의 성질을 만족하는 트리 모든 노드의 키는 유일하다. 왼쪽 서브트리의 키들은 루트의 키보다 작다. 오른쪽 서브트리의 키들은 루트의 키보다 크다. 왼쪽과 오른쪽 서브트리도 이진 탐색 트리이다.

이진 탐색 트리 search(x, k) if x=NULL then return NULL; // 탐색 실패 if k=x->key then return x; // 탐색 성공 else if k<x->key then return search(x->left, k); // 계속 탐색 else return search(x->right, k); // 계속 탐색

이진 탐색 트리(삽입) - 이진 탐색 트리에 원소를 삽입하기 위해 먼저 탐색을 수행하는 것이 필요 탐색에 실패한 위치가 바로 - 이진 탐색 트리에 원소를 삽입하기 위해 먼저 탐색을 수행하는 것이 필요 탐색에 실패한 위치가 바로 새로운 노드를 삽입하는 위치

이진 탐색 트리(삽입) // key를 이진 탐색 트리 root에 삽입한다. void insert_node(TreeNode **root, int key) { TreeNode *p, *t; // p는 부모노드, t는 현재노드 TreeNode *n; // n은 새로운 노드 t = *root; p = NULL; // 탐색을 먼저 수행 while (t != NULL) { if ( key == t->key ) return; p = t; if ( key < t->key ) t = t->left; else t = t->right; }

이진 탐색 트리(삽입) // key가 트리 안에 없으므로 삽입 가능 n = (TreeNode *) malloc(sizeof(TreeNode)); if ( n == NULL ) return; // 데이터 복사 n->key = key; n->left = n->right = NULL; // 부모 노드와 링크 연결 if ( p != NULL ) if ( key < p->key ) p->left = n; else p->right = n; else *root = n; }

이진 탐색 트리(삭제) 3가지의 경우 1. 삭제하려는 노드가 단말 노드일 경우 2. 삭제하려는 노드가 하나의 왼쪽이나 오른쪽 서브 트리중 하나만 가지고 있는 경우 3. 삭제하려는 노드가 두개의 서브 트리 모두 가지고 있는 경우

이진 탐색 트리(삭제) 1. 삭제하려는 노드가 단말 노드일 경우 - 단말의 부모노드를 찾아서 부모 노드 안의 해당 필드를 NULL로 만들어 연결을 끊음.

이진 탐색 트리(삭제) 2. 삭제하려는 노드가 하나의 서브트리만 갖고 있는 경우 - 자기 노드 삭제하고, 그 서브 트리를 자기 노드의 부모 노드가 가리키게 한다.

이진 탐색 트리(삭제) 3. 삭제하려는 노드가 두개의 서브트리를 갖고 있는 경우 삭제 되는 노드와 가장 값이 비슷한 노드를 후계자로 !

이진 탐색 트리(삭제) 3. 삭제하려는 노드가 두개의 서브트리를 갖고 있는 경우

이진 탐색 트리(삭제) // 삭제 함수 void delete_node(TreeNode **root, int key) { TreeNode *p, *child, *succ, *succ_p, *t; // key를 갖는 노드 t를 탐색, p는 t의 부모노드 p = NULL; t = *root; // key를 갖는 노드 t를 탐색한다. while ( t != NULL && t->key != key ) { p = t; t = ( key < t->key ) ? t->left : t->right; } // 탐색이 종료된 시점에 t가 NULL이면 트리안에 key가 없음 if ( t == NULL ) { // 탐색트리에 없는 키 printf("key is not in the tree"); return;

이진 탐색 트리(삭제) // 첫번째 경우: 단말노드인 경우 if ( (t->left==NULL) && (t->right==NULL) ) { if ( p != NULL ) { // 부모노드의 자식필드를 NULL로 만든다. if ( p->left == t ) p->left = NULL; else p->right = NULL; } else // 만약 부모노드가 NULL이면 삭제되는 노드가 루트 *root = NULL;

이진 탐색 트리(삭제) // 두번째 경우: 하나의 자식만 가지는 경우 else if ((t->left==NULL)||(t->right==NULL)) { child = (t->left != NULL) ? t->left : t->right; if ( p != NULL ) { if ( p->left == t ) // 부모를 자식과 연결 p->left = child; else p->right = child; } else // 만약 부모노드가 NULL이면 삭제되는 노드가 루트 *root = child;

이진 탐색 트리(삭제) // 세번째 경우: 두개의 자식을 가지는 경우 else{ // 오른쪽 서브트리에서 후계자를 찾는다. succ_p = t; succ = t->right; // 후계자를 찾아서 계속 왼쪽으로 이동한다. while(succ->left != NULL){ succ_p = succ; succ = succ->left; }

이진 탐색 트리(삭제) // 후속자의 부모와 자식을 연결 if( succ_p->left == succ ) succ_p->left = succ->right; // succ 노드의 우측 서브트리를 연결 else succ_p->right = succ->right; // succ 노드의 왼쪽 서브트리가 없는 경우 // 후속자가 가진 키값을 현재 노드에 복사 t->key = succ->key; // 원래의 후속자 삭제 t = succ; } free(t);

이진 탐색과 이진 탐색 트리의 차이점 삽입, 삭제가 용이하냐, 안하냐

이진 탐색과 이진 탐색 트리의 차이점 이진 탐색 : 자료들이 배열에 저장되어 있으므로 삽입, 삭제 할 때마다 앞뒤의 원소들을 이동 시켜야 함.

이진 탐색과 이진 탐색 트리의 차이점 이진 탐색 트리 : 비교적 빠른 시간 안에 삽입과 삭제를 끝마칠 수 있는 구조로 되어 있음.

이진 탐색과 이진 탐색 트리의 차이점 5 { 5, 2, 8, 3,1, 3, 7, 9} 순서로 삽입 했을 때 2 8 최대 비교 횟수 3번 이진 탐색 트리 – 균형 트리

이진 탐색과 이진 탐색 트리의 차이점 { 1, 2, 3, 5, 7, 8, 9} 순서로 삽입 했을 때 1 2 { 1, 2, 3, 5, 7, 8, 9} 순서로 삽입 했을 때 이진 탐색 트리 – 불균형 트리 1 2 3 5 7 8 9 최대 비교 횟수 7번

이진 탐색과 이진 탐색 트리의 차이점 이진 탐색 트리에서는 균형을 유지하는 것이 중요함!

감사합니다