ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์ด์ง„ ํƒ์ƒ‰ Binary Search

NaNaRin๐Ÿ™ƒ 2021. 1. 22. 16:15

 

์ด์ง„ ํƒ์ƒ‰(Binary Search) ์•Œ๊ณ ๋ฆฌ์ฆ˜ :

์š”์†Œ๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ ๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ(sort)๋œ ๋ฐฐ์—ด์—์„œ ์›ํ•˜๋Š” ํ‚ค ๊ฐ’์„ ๊ฐ–๋Š” ์š”์†Œ๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ํƒ์ƒ‰.

์„ ํ˜• ํƒ์ƒ‰๋ณด๋‹ค ์ข€ ๋” ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ ๊ฐ€๋Šฅ

 

๊ฐ’ 53์„ ํƒ์ƒ‰

   1. ๋ฐฐ์—ด์˜ ์ค‘์•™ Binary[5] ์™€ ๋น„๊ต, 53 > Binary[5]  =>  Binary[5] ์ด์ „ ๋ฐฐ์—ด ํƒ์ƒ‰ ๋Œ€์ƒ์—์„œ ์ œ์™ธ

   2. Binary[6] ~ Binary[10]์˜ ์ค‘์•™ Binary[8] ๊ณผ ๋น„๊ต, 53 < Binary[8]  =>  Binary[8] ์ดํ›„ ๋ฐฐ์—ด ํƒ์ƒ‰ ๋Œ€์ƒ์—์„œ ์ œ์™ธ

   3. Binary[6] ~ Binary[7]์˜ ์ค‘์•™ Binary[6] ๊ณผ ๋น„๊ต, 53 == Binary[6]  =>  ํƒ์ƒ‰ ์„ฑ๊ณต

๋ฐฐ์—ด Binary ์—์„œ ์ด์ง„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐ’ 53 ํƒ์ƒ‰

 

๋งจ ์•ž์˜ ์ธ๋ฑ์Šค๋ฅผ pl, ๋งจ ๋์˜ ์ธ๋ฑ์Šค๋ฅผ pr, ์ค‘์•™ ์ธ๋ฑ์Šค๋ฅผ pc๋ผ๊ณ  ํ•  ๋•Œ ํƒ์ƒ‰ ์‹œ์ž‘์‹œ pl์€ 0, pr์€ n-1, pc๋Š” (n-1)/2๋กœ ์ดˆ๊ธฐํ™”.

๊ฒ€์‚ฌํ•œ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ œ์™ธ์‹œํ‚ค๋Š” ์„ ํ˜• ํƒ์ƒ‰๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ด์ง„ ํƒ์ƒ‰์€ ํƒ์ƒ‰์„ ํ•œ ๋‹จ๊ณ„์”ฉ ์ง„ํ–‰ํ•  ๋•Œ ๋งˆ๋‹ค ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ ๋‹ค. 

Binary[pc]์™€ ํ‚ค ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๊ฐ™์œผ๋ฉด ํƒ์ƒ‰ ์„ฑ๊ณต

 

1.Binary[pc] < key ์ผ ๋•Œ

  Binary[pl] ~ Binary[pc]๋Š” key๋ณด๋‹ค ์ž‘์€ ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜๋ฏ€๋กœ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ค‘์•™ ์š”์†Œ ๋’ค์ชฝ์˜ Binary[pc+1] ~ Binary[pr] ๋กœ ์ˆ˜์ •, pl์„ pc+1๋กœ ์—…๋ฐ์ดํŠธ

2. BSArray[pc] > key ์ผ ๋•Œ

  Binary[pc] ~ Binary[pr]๋Š” key๋ณด๋‹ค ํฐ ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜๋ฏ€๋กœ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ค‘์•™ ์š”์†Œ ์•ž์ชฝ์˜ Binary[pl] ~ Binary[pc-1] ๋กœ ์ˆ˜์ •, pr์„ pc-1๋กœ ์—…๋ฐ์ดํŠธ

 

์ด์ง„ ํƒ์ƒ‰์˜ ์ข…๋ฃŒ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

   ์กฐ๊ฑด 1 : Binary[pc]์™€ key๊ฐ€ ์ผ์น˜ํ•  ๊ฒฝ์šฐ (ํƒ์ƒ‰ ์„ฑ๊ณต)

   ์กฐ๊ฑด 2 : ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ๋”์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (ํƒ์ƒ‰ ์‹คํŒจ)

๋ฐฐ์—ด์˜ ์š”์†Œ ์ˆ˜๊ฐ€ n๊ฐœ ์ผ ๋•Œ ์ด์ง„ ํƒ์ƒ‰์€ ํƒ์ƒ‰์„ ๋ฐ˜๋ณตํ•  ๋•Œ ๋งˆ๋‹ค ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ์ ˆ๋ฐ˜์ด ๋˜๋ฏ€๋กœ ํƒ์ƒ‰์— ํ•„์š”ํ•œ ๋น„๊ต ํšŸ์ˆ˜์˜ ํ‰๊ท ๊ฐ’์€ log nํšŒ ์ด๋‹ค. => O(log n)

 

 

๋ฉ”์„œ๋“œ binSearch() : ๋ฐฐ์—ด a ์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ด n๊ฐœ์˜ ์š”์†Œ ์ค‘์—์„œ ๊ฐ’์ด key์ธ ์š”์†Œ๋ฅผ ์ด์ง„ ํƒ์ƒ‰

๋งค๊ฐœ๋ณ€์ˆ˜ : int[] a, int n, int key

๋ฐ˜ํ™˜๊ฐ’ : ํ‚ค ๊ฐ’์ด ์—ฌ๋Ÿฌ๊ฐœ ์กด์žฌํ•  ๊ฒฝ์šฐ, ์ฒ˜์Œ ๋ฐœ๊ฒฌํ•œ ์š”์†Œ์˜ ์ธ๋ฑ์Šค๋ฅผ, ํ‚ค ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜

 

   ์กฐ๊ฑด 1 : a[pc] == key (ํƒ์ƒ‰ ์„ฑ๊ณต)

   ์กฐ๊ฑด 2 : pl > pr (ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ) (ํƒ์ƒ‰ ์‹คํŒจ)

java
๋‹ซ๊ธฐ
int binSearch(int[]a, int n, int key) { โ€Œint pl = 0; โ€Œint pr = n - 1; โ€Œ โ€Œdo { โ€Œโ€Œint pc = (pl + pr) / 2; โ€Œโ€Œif(a[pc] == key) { โ€Œโ€Œโ€Œreturn pc; โ€Œโ€Œ} else if (a[pc] < key) { โ€Œโ€Œโ€Œpl = pc + 1; โ€Œโ€Œ} else { โ€Œโ€Œโ€Œpr = pc - 1; โ€Œโ€Œ} โ€Œ} while(pl <= pr); โ€Œ โ€Œreturn -1; }

 

 

 

 

์ด์ง„ ํƒ์ƒ‰ Binary Search : O(logN)