๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ข…๋ฅ˜

[์ด๋ถ„ ํƒ์ƒ‰] ์ด๋ถ„ ํƒ์ƒ‰(Binary Search) ์ด๋ž€ ?

by ๐Ÿณ Laboon 2024. 2. 1.
์ด๋ถ„ ํƒ์ƒ‰

 

๋‘ ์ด, ๋‚˜๋ˆŒ ๋ถ„์„ ์จ์„œ ์ด๋ถ„์ธ๊ฐ€?

 

์ •๋‹ต, ์ด๋ถ„ ํƒ์ƒ‰์€ ๋‘๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด์„œ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 1๋ถ€ํ„ฐ 10๊นŒ์ง€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

 

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

 

์šฐ๋ฆฌ๊ฐ€ 8์„ ์ฐพ์„ ๋•Œ, ๋ˆˆ์œผ๋กœ ๋ฐ”๋กœ ๋ณด์ด๋‹ˆ๊นŒ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ช‡ ๋ฒˆ์งธ์— ์žˆ๋Š”๊ฐ€? ๋ฐฐ์—ด์€ 0๋ฒˆ์งธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋‹ˆ 7๋ฒˆ์งธ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ปดํ“จํ„ฐ ๋ฐฐ์—ด ์ธ๋ฑ์Šค ๊ฐœ๋…์ด ์—†๋Š” ์‚ฌ๋žŒ๋“ค์€ 8๋ฒˆ์งธ๋ผ๊ณ  ๋‹ตํ•  ๊ฒƒ์ด๋‹ค.

์ฆ‰, O(1) ์‹œ๊ฐ„์ด๋‹ค.

 

๊ทธ๋Ÿผ, 
{1, 4, 7, 10, 12, 23, 30, 35, 100, 120} ์ด ์žˆ์„ ๋•Œ, 35์˜ ์œ„์น˜๋Š”?

์šฐ๋ฆฌ๋Š” ์•ž์—์„œ ๊ฐ’์„ ์„ธ์–ด๊ฐ€๋ฉด์„œ ๋ช‡ ๋ฒˆ์งธ์— ์žˆ๋Š”์ง€ ์•Œ ๊ฒƒ์ด๋‹ค.

์ฆ‰, O(N) ์‹œ๊ฐ„์ด๋‹ค.

 

100๋งŒ๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด?

 

์šฐ๋ฆฌ๋Š” 100๋งŒ๊ฐœ๋ฅผ ์ผ์ผ์ด ์„ธ๋‹ค๊ฐ€ ์ง€๋ฃจํ•ด์„œ ํฌ๊ธฐํ•œ๋‹ค.

๋งŒ์•ฝ์— ์‚ฌ๋žŒ ์—ฌ๋Ÿฌ๋ช…์„ ๋™์›ํ•ด์„œ ์ˆซ์ž๋ฅผ ์ฐพ์•„๋„ ๋œ๋‹ค๋ฉด??

 

๊ฐ ์ธ์›๋“ค์„ 100๋งŒ/N ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ ์˜์—ญ ๋ณ„๋กœ ์ฐพ์œผ๋ฉด ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋‹ค.

๊ทผ๋ฐ, ๊ฐ ์ˆซ์ž๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด N์ด 100๋งŒ์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

์ฆ‰ O(N)์ด๋ž‘ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค.

 

๋งŒ์•ฝ, ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. 1๋ถ€ํ„ฐ 100๋งŒ ์ค‘ 10๋งŒ์„ ์ฐพ์œผ๋ ค๋Š”๋ฐ

๋ฒˆํ˜ธ ํ•˜๋‚˜๋ฅผ ์งš์—ˆ๋Š”๋ฐ 30๋งŒ์ด๋‹ค.

๊ทธ๋Ÿผ ์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” 1 ๋ถ€ํ„ฐ 30๋งŒ๊นŒ์ง€์˜ ์˜์—ญ๋งŒ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

์ด๋ฒˆ์—๋Š” 9๋งŒ์„ ์ฐพ์•˜๋‹ค. ๊ทธ๋Ÿผ 9๋งŒ๋ถ€ํ„ฐ 30๋งŒ๊นŒ์ง€๋งŒ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ •๋ ฌ์„ฑ์„ ์ด์šฉํ•˜๋ฉด ๋ฒˆํ˜ธ๋ฅผ ํ•˜๋‚˜ ์งš์—ˆ์„ ๋•Œ,

๋” ํฐ ๊ฐ’์ด ์žˆ๋Š” ์ชฝ๊ณผ ๋” ์ž‘์€ ๊ฐ’์ด ์žˆ๋Š” ์ชฝ, 2 ๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค.

1. ์„ ํƒํ•œ ์ˆซ์ž๊ฐ€ ์ฐพ๋Š” ๊ฐ’๋ณด๋‹ค ๋” ์ž‘๋‹ค๋ฉด ํฐ ๊ฐ’์ด ์žˆ๋Š” ์˜์—ญ

2. ์„ ํƒํ•œ ์ˆซ์ž๊ฐ€ ์ฐพ๋Š” ๊ฐ’๋ณด๋‹ค ๋” ํฌ๋‹ค๋ฉด ์ž‘์€ ๊ฐ’์ด ์žˆ๋Š” ์˜์—ญ

๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋‰˜๊ฒŒ๋˜๋Š” ์„ฑ์งˆ์„ ์ด์šฉํ•œ ๊ฒƒ์ด '์ด๋ถ„ ํƒ์ƒ‰'์ด๋‹ค.

 


 

์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ ํ•˜๋ฉด ๋ ๊นŒ์š”?

 

์ด๋ถ„ ํƒ์ƒ‰์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค๋ฉด ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…๋ นํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿผ ์ปดํ“จํ„ฐ๋Š” N๊ฐœ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด N/2, N/4, N/8 ... O(log N)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ๊ฒŒ ๋œ๋‹ค.

 

๊ตฌํ˜„ ์ ‘๊ทผํ•˜๊ธฐ

 

์ž„์˜์˜ ๋‘ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์•ผ ํ•œ๋‹ค. ํ•œ ์˜์—ญ์„ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ„๊ธฐ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ?

์ค‘๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„๋ฉด ๋œ๋‹ค.

 

์ด ๊ธฐ์ค€์ ์„ ์ด๋ถ„ ํƒ์ƒ‰์—์„œ mid ๊ฐ’์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ปดํ“จํ„ฐ์—์„œ ์ˆ˜์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์ค‘๊ฐ„ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฐ์—ด์˜ ์‹œ์ž‘์  0๋ฒˆ index ๋ถ€ํ„ฐ ๋์  n-1๋ฒˆ index

 

๋งŒ์•ฝ n์ด 10์ด๋ผ๋ฉด, mid = (n-1) / 2 = 9 / 2 = 4 ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. 

1. ๋ฐฐ์—ด์ด ์˜ค๋ฆ„์ฐจ์ˆœ์ด๊ณ  4๋ฒˆ์งธ ์ธ๋ฑ์Šค ๊ฐ’ < key ๊ฐ’ ์ด๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” 5๋ฒˆ์งธ ๋ถ€ํ„ฐ 9๋ฒˆ๊นŒ์ง€ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

์ฆ‰ ์‹œ์ž‘์ ์ด 5๋ฒˆ์ด ๋˜๊ณ  ๋์€ 9๋ฒˆ์ด ๋  ๊ฒƒ์ด๋‹ค.

 

2. ๋ฐฐ์—ด์ด ์˜ค๋ฆ„์ฐจ์ˆœ์ด๊ณ  4๋ฒˆ์งธ ์ธ๋ฑ์Šค ๊ฐ’ > key ๊ฐ’ ์ด๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” 0๋ฒˆ์งธ ๋ถ€ํ„ฐ 3๋ฒˆ๊นŒ์ง€ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

 

3. ๋ฐฐ์—ด์ด ์˜ค๋ฆ„์ฐจ์ˆœ์ด๊ณ  4๋ฒˆ์งธ ์ธ๋ฑ์Šค ๊ฐ’ == key ๊ฐ’ ์ด๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” ์ธ๋ฑ์Šค ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์ ‘๊ทผ์„ ๋ฐ”ํƒ•์œผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•ด๋ณด๊ธฐ

์ •๋ ฌ๋œ ์ˆ˜์—ด์˜ ์ •๋ณด, ์ฐพ๋Š” ๊ฐ’ 62

1. ์ž„์˜์˜ ํ•œ ์  ์„ ํƒ : start = 0, end = 11, mid = (0+11) / 2 = 5

2. 5๋ฒˆ์— ์œ„์น˜ํ•œ ๊ฐ’ : 52

3. 52 < 62, s = mid + 1 = 6, e = 11, mid = (6+11) / 2 =  8

4. 8๋ฒˆ์— ์œ„์น˜ํ•œ ๊ฐ’ : 61

5. 61 < 62, s = mid + 1 = 9, e = 11, mid = (9+11) / 2 = 10

6. 10๋ฒˆ์— ์œ„์น˜ํ•œ ๊ฐ’ : 73

7. 73 > 62, s = 9, e = mid - 1 = 9, mid = (9+9) / 2  = 9

 

7. 9๋ฒˆ์— ์œ„์น˜ํ•œ ๊ฐ’ : 62

8. 62 == 62, 9๋ฒˆ ๋ฐ˜ํ™˜

 

์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•œ๋Œ€๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ตฌํ˜„ ํ•ด๋ณด๊ธฐ

 

/*
	authored by jihwankim
	dev-dot.tistory.com
	binary search
*/
#include <iostream>
#include <vector>

using namespace std;

int main() {
	vector<int> arr = {
		10, 20, 30, 40, 50, 52, 54, 60, 61, 62, 73, 89
	};
	
	int s = 0, e = arr.size() - 1;
	int key = 62;
	
	while(true) {
		int m = (s+e) / 2;
		if (arr[m] < key) {
			s = m + 1;
		} 
		if (arr[m] > key) {
			e = m - 1;
		}
		if (arr[m] == key) {
			cout << key << "๋Š” " << m+1 << "๋ฒˆ ์งธ์— ์žˆ์Šต๋‹ˆ๋‹ค.\n";
			break;
		}
	}
	return 0;
}

 

์›ํ•˜๋Š” ๊ฒฐ๊ณผ ๊ฐ’์ด ๋‚˜์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ถ”์ฒœ Thinking

 

1. ์žฌ๊ท€๋กœ ์ ‘๊ทผํ•ด๋ณด๊ธฐ

2. ์ข€ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์ƒ๊ฐํ•ด๋ณด๊ธฐ