알고리즘6. Searching on Ordered Array(정렬된 배열 탐색)(2) - binary search(이진탐색)

2021. 10. 3. 12:07·Computer Science/알고리즘
반응형

1. Analyzing Algorithms and Problems: Principles and Examples

1-4. Searching on Ordered Array 정렬된 배열 탐색

 

Let's Divide-and-Conquer 개선된 알고리즘 → 분할과 정복

Problem and Strategy D

  • K를 먼저 배열의 가운데에 있는 entry와 비교
  • 한 번의 연산으로 절반의 entry를 제거할 수 있다. 
  • 동일한 전략을 재귀적으로 수행한다. 

 

Algorithm D: Binary Search (반드시 정렬된 array 여야 함)

  • Input: E, first, last, and K→ first, …, last까지 정렬된 array E, K 는 찾아야 할 key 값, input 모두 정수
  • Output: first, …, last의 범위 내의 E안에 K가 존재한다면 E[index] = K의 index를 리턴, 만약 K가 E의 범위 내에 없다면 index = -1을 리턴

 

 

Binary Search

int binarySearch(int[] E, int first, int last, int K)
1. if (last < first)
2. 	index = -1;
3. else
4. 	int mid = (first + last)/2
5.	 if (K == E[mid])
6. 		index = mid;
7. 	else if (K < E[mid])
8.		index = binarySearch(E, first, mid-1, K)
9. 	else
10.	 	index = binarySearch(E, mid+1, last, K);
11. return index

 

<알고리즘 설명>

int binarySearch(int[] E, int first, int last, int K)

Input: E, first, last, and K

 

1. if (last < first)
2. index = -1;

base case: 재귀탈출 조건. 비교 원소 수가 존재하지 않을 때 재귀 탈출.

 

3. else
4. 	int mid = (first + last)/2

→배열의 중간 index 구하기

 

5. if (K == E[mid])
6. 	index = mid;
7. else if (K < E[mid])
8. 	index = binarySearch(E, first, mid-1, K)
9. else	//K > E[mid]
10.	index = binarySearch(E, mid+1, last, K);

if (K == E[mid]) 

   index = mid;     

  • 탐색 성공

else if (K < E[mid])  

   index = binarySearch(E, first, mid-1, K)

  • K < E[mid]이면 배열의 왼쪽 영역 살펴보기
  • 재귀 호출
  • first는 그대로, last는 mid-1로 업데이트
  • 탐색 영역이 1/2 씩 줄어든다

else //K > E[mid]
   index = binarySearch(E, mid+1, last, K);

  • K > E[mid]이면 배열의 오른쪽 영역 살펴보기
  • 재귀 호출
  • first는 mid+1로, last는 그대로 업데이트
  • 탐색 영역이 1/2 씩 줄어든다

 

11. return index

인덱스 값 리턴

 

 

Worst-Case Analysis of Binary Search

  • Basic operation: K과 배열 entry의 비교연산
5. if (K == E[mid])
6. 	index = mid;
7. else if (K < E[mid])
8. 	index = binarySearch(E, first, mid-1, K)
9. else	//K > E[mid]
10.	index = binarySearch(E, mid+1, last, K);
  • three-way branch는 ==, <, > 3번의 연산이지만 big O 관점에서 보았을 때 한번의 연산으로 가정한다.
  • three-way branch: ==, <, > 비교연산

 

  • 먼저 K!= E[mid]를 비교하여 배열을 두 개의 섹션으로 나눈다. 각 섹션에는 최대 ⌊x/2⌋개 항목이 존재한다. 
  • 재귀 호출을 통해 2로 나눈 범위만큼의 크기를 제거
  • 1보다 작은 결과(즉, n/(2^d) ≥ 1)를 얻지 않고 n을 2로 몇 번이나 나눌 수 있는가? 
  • d ≤ lg(n), 따라서 재귀 호출에 따른 *⌊log n⌋번의 비교와 재귀 호출 전 한 번의 비교(코드 6번 줄)를 수행한다. 
5. if (K == E[mid])
6. 	index = mid;
7. else if (K < E[mid])	//재귀호출 전 한 번 비교
8. 	index = binarySearch(E, first, mid-1, K)
9. else	//K > E[mid]
10.	index = binarySearch(E, mid+1, last, K);

 

K는 key값, k는 비교연산의 횟수. k는 위 d ≤ lg(n)의 d와 동일

  • W(n) = ⌊log n⌋+ 1 = ⌈x(log n)⌉ ∈ θ(log n)

 

*⌊log n⌋: 내림. log n을 정수로 나타냄

 

 

Average-Behavior Analysis of Binary Search

 

 

 

 

 

 


자료 출처

Computer Algorithms

(Sara Baase, Allen Van Gelder저, Addison Wesley, 2000)

반응형
저작자표시 비영리 변경금지 (새창열림)

'Computer Science > 알고리즘' 카테고리의 다른 글

BFS / DFS 참고용 블로그  (0) 2023.04.01
알고리즘10. Heapsort  (0) 2021.11.11
알고리즘: Mergesort 합병 정렬  (0) 2021.11.11
알고리즘5. Searching on Ordered Array(정렬된 배열 탐색)(1)  (0) 2021.09.27
알고리즘4. 점근적 증가율에 따른 함수 분류  (0) 2021.09.13
알고리즘3. 알고리즘과 문제 분석  (0) 2021.09.07
'Computer Science/알고리즘' 카테고리의 다른 글
  • 알고리즘10. Heapsort
  • 알고리즘: Mergesort 합병 정렬
  • 알고리즘5. Searching on Ordered Array(정렬된 배열 탐색)(1)
  • 알고리즘4. 점근적 증가율에 따른 함수 분류
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
    반응형
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기 (505)
      • 프로그래밍 (41)
        • Programming (1)
        • C | C++ (6)
        • Java (28)
        • Python (5)
      • 웹 프로그래밍 (108)
        • HTML | CSS (5)
        • JavaScript | TypeScript (41)
        • React (25)
        • Vue.js (0)
        • Next.js (18)
        • Spring & Spring Boot (13)
        • JSP & Servlet (1)
        • DB (4)
      • 웹 프로젝트 (77)
        • 웹 프로젝트 (22)
        • 🥨스낵몰 (3)
        • 👨‍👨‍👧‍👧소셜 가계부 (26)
        • 🌜꿈 일기장 (11)
        • 🔮포트폴리오 사이트 (11)
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램 (0)
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼 (0)
        • 😺Just Meow It: 조언 사이트 (2)
        • 📕Workly: 교대근무 다이어리 (1)
      • 앱 프로그래밍 (26)
        • Flutter (24)
        • Kotlin (2)
      • Problem Solving (166)
        • 백준 (52)
        • 프로그래머스 (79)
        • SWEA (29)
      • Computer Science (40)
        • 알고리즘 (14)
        • 컴퓨터 네트워크 (18)
        • 이산수학 (8)
      • Developer (47)
        • 후기 (4)
        • 자료정리 (4)
        • 취업 | 취준 (9)
        • SSAFY (1)
        • 웹개발 교육 프로그램 (9)
        • TIL (20)
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    mysql
    타입스크립트
    Til
    알고리즘
    컴퓨터네트워크
    백준
    리액트
    자바
    클론 프로젝트
    bfs
    SWEA
    spring boot
    웹사이트
    구현
    블로그 제작
    ZeroCho
    Jiraynor Programming
    Next.js
    공식문서
    프로그래머스
    강의내용정리
    뉴렉처
    React
    플러터
    AWS
    파이썬
    프로젝트
    d3
    자바스크립트
    포트폴리오
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
알고리즘6. Searching on Ordered Array(정렬된 배열 탐색)(2) - binary search(이진탐색)
상단으로

티스토리툴바