์ด์ง ํ์ (Binary Search) ์๊ฐ ๋ณต์ก๋๊ฐ ์ logn์ผ๊น?
public static int search(int[] nums, int target) {
int start = 0, end = nums.length - 1;
while(start <= end) {
int mid = (start + end) / 2;
if(nums[mid] == target) {
return mid;
}
if(nums[mid] < target) {
start = mid + 1;
} else {
end = end - 1;
}
}
return -1; // target ์์
}
์ด์ง ํ์์ divide and conquer์ ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์๋ค.
์๊ฐ ๋ณต์ก๋๋ O(logn)์ด ๋๋๋ฐ, ์ฒ์์๋ ํ์ํด์ผ ํ ๋ฐ์ดํฐ๊ฐ N๊ฐ๋ผ๋ฉด N๊ฐ ๋ชจ๋๊ฐ ํ์ ๋ฒ์๊ฐ ๋๋ค. ๊ทธ ์ดํ
๋ค์ ํ์์์ ํ์ ๋ฒ์๋ ์ ๋ฐ์ผ๋ก ์ค์ด N/2 ๊ฐ ๋๊ณ ๊ทธ ๋ค์ ํ์์์ ํ์ ๋ฒ์๋ ๋ ์ ๋ฐ์ผ๋ก ์ค์ด N/4๊ฐ ๋๊ณ ๊ทธ ๋ค์์ N/8, N/16 ์ด ๋๊ฒ ๋๋ค.
์ฆ ํ์ํด์ผ ํ๋ ํ์๊ฐ k ๋ผ๋ฉด N๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ฐ N = 2^k๊ฐ ๋๋ค.
k์ ๊ฐ์ ๊ตฌํ๋ ค๋ฉด k = log2(N)์ด๋ผ ํ ์ ์๋ค.
๋ก๊ทธ๊ฐ ์ฝํ ์ฌ๋๋ค์ ์ํ ํ
log2(8) ์ 2๋ฅผ ๋ช ์ ๊ณฑ ํด์ผ 8์ด๋ผ๋ ๊ฐ์ ์ป์ ์ ์๋๋๋ ๋ป์ด๋ค. log2(2^3) ์ด๋ฉฐ ์ด๋ 3log2(2)๋ก ํํ ํ ์ ์๋ค.
log2(2), log3(3) ... ๋ฑ์ ๊ฐ์ด ์ผ์ด๋ฏ๋ก 3log2(2) = 3 ์ด ๋๋ค.
์ฆ 2^3 = 8 ์ด๊ณ 3 = log2(8)์ด ๋๋ค.
์์์ ํ์ ๋ฒ์๋ 2^k = N ์ด๋ฏ๋ก ์ด๋ฅผ ๋ก๊ทธ๋ก ํํํ๋ฉด k = log2(N)์ด๋ผ๊ณ ํ ์ ์๋ค!