ν”„λ‘œκ·Έλž˜λ°/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 (탐색 λ²”μœ„κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ) (탐색 μ‹€νŒ¨)

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)