[Algorithm] ์ด์ง ํ์ ๋ฐ ๋ณํ ์๊ณ ๋ฆฌ์ฆ Binary Search Algorithm
์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํน์ ๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฐพ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด์ง ํ์์ ๊ฐ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ํ์ ๋ฒ์๋ฅผ ์ ๋ฐ์ผ๋ก ์ค์ฌ๊ฐ๋ฉฐ ์ํ๋ ๊ฐ์ ์ฐพ์๋ด๋ ๋ฐฉ์์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋ $O(\log n)$์ผ๋ก ํจ์จ์ ์ด๋ค. ์๋ฅผ ๋ค์ด 1024๊ฐ ์์๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์์ ์ํ๋ ๊ฐ์ ์ฐพ์ ๋ ์ต๋ 10๋ฒ์ ๋น๊ต๋ง ํ์ํ๋ค.
ํ์ง๋ง ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๋ค๋ฉด ๋งค๋ฒ ์ ๋ ฌ์ ํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ฑ์ด ๋จ์ด์ง ์ ์๋ค. ๋ฐ์ดํฐ ์ฝ์ /์ญ์ ๊ฐ ๋น๋ฒํ ๊ฒฝ์ฐ์ ํด์ ํ ์ด๋ธ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋๊ฒ ๋ ๋์ ์ ์๋ค.
๐ก ์ด์ง ํ์์ ์ด๋ถ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
์ด์ง ํ์ ๊ธฐ๋ณธ
- ์ค์๊ฐ ๊ณ์ฐ
- ๋ฐฐ์ด์ ์ค๊ฐ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํ๋ค
mid = Math.floor((left + right) / 2)
- ์ค์๊ฐ๊ณผ ์ฐพ๊ณ ์ ํ๋ ๊ฐ(target)์ ๋น๊ตํ๋ค
- ๋ฐฐ์ด์ ์ค๊ฐ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํ๋ค
- ๊ฐ ๋น๊ต ๋ฐ ๋ฒ์ ์กฐ์
- ๋ฐ๋ณต ์ข
๋ฃ
- ์ค์๊ฐ์ด ์ฐพ๊ณ ์ ํ๋ ๊ฐ๊ณผ ๊ฐ๋ค๋ฉด ํ์์ ์ข ๋ฃํ๊ณ ํด๋น ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค
- ๋ ์ด์ ํ์ ๋ฒ์๊ฐ ์์ผ๋ฉด(left > right) ๋ฐ๋ณต์ ์ข
๋ฃํ๊ณ
-1
์ ๋ฐํํ๋ค
- ๊ณ์ ๋ฐ๋ณต
- ์ค์๊ฐ์ด ์ฐพ๊ณ ์ ํ๋ ๊ฐ๋ณด๋ค ์๋ค๋ฉด, ํ์ ๋ฒ์๋ฅผ ์ค๋ฅธ์ชฝ ์ ๋ฐ์ผ๋ก ์ค์ธ๋ค
left = mid + 1
- ์ค์๊ฐ์ด ์ฐพ๊ณ ์ ํ๋ ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด, ํ์ ๋ฒ์๋ฅผ ์ผ์ชฝ ์ ๋ฐ์ผ๋ก ์ค์ธ๋ค
right = mid - 1
- ์ค์๊ฐ์ด ์ฐพ๊ณ ์ ํ๋ ๊ฐ๋ณด๋ค ์๋ค๋ฉด, ํ์ ๋ฒ์๋ฅผ ์ค๋ฅธ์ชฝ ์ ๋ฐ์ผ๋ก ์ค์ธ๋ค
- ๋ฐ๋ณต ์ข
๋ฃ
๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํ ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ โผ
const binarySearch = (sortedArr, target) => {
let left = 0;
let right = sortedArr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2); // ์ค์ ์ธ๋ฑ์ค ๊ณ์ฐ
if (sortedArr[mid] === target) return mid; // ์ํ๋ ๊ฐ์ ์ฐพ์์ ๋
if (sortedArr[mid] < target) left = mid + 1; // ํ์ ๋ฒ์ ์ค๋ฅธ์ชฝ ์ ๋ฐ์ผ๋ก ์ถ์
else right = mid - 1; // ํ์ ๋ฒ์ ์ผ์ชฝ ์ ๋ฐ์ผ๋ก ์ถ์
}
return -1; // ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์์ ๋
};
์ด์ง ํ์ ์์ฉ
๐ก bisect๋ “์ด๋ฑ๋ถํ๋ค”๋ผ๋ ๋ป์ผ๋ก ์ด๋ค ๊ฒ์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํ์ด์ฌ์์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด bisect๋ผ๋ ๋ชจ๋์ ์ ๊ณตํ๋ค. ์ด ๋ชจ๋์ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํน์ ๊ฐ์ด ๋ค์ด๊ฐ ์ ์๋ ์์น๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉํ๋ bisect_left
, bisect_right
ํจ์๊ฐ ํฌํจ๋์ด ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ด์ง ํ์ ๋ก์ง์ ์ด์ง๋ง ๋ณํํด์ ๋์ผํ๊ฒ ๊ตฌํํ ์ ์๋ค.
bisect_left (์ข์ธก ์ด๋ถ ํ์)
์ ๋ ฌ๋ ๋ฐฐ์ด์์ target
์ ์ฝ์
ํ ์ ์๋ ๊ฐ์ฅ ์ผ์ชฝ ์์น(์ธ๋ฑ์ค)๋ฅผ ๋ฐํํ๋ค. target
๊ณผ ๋์ผํ ๊ฐ์ด 1๊ฐ ํน์ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ฉด, ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ target
์ ์์น๋ฅผ ๋ฐํํ๋ค. target
๊ณผ ๋์ผํ ๊ฐ์ด ์๋ค๋ฉด, target
๋ณด๋ค ํฐ ๊ฐ์ด ์ฒ์ ๋ํ๋ ์์น๋ฅผ ๋ฐํํ๋ค.
const bisectLeft = (sortedArr, target) => {
let left = 0;
let right = sortedArr.length;
while (left < right) {
const mid = Math.floor((left + right) / 2);
if (sortedArr[mid] < target) left = mid + 1;
else right = mid;
}
return left;
};
const arr = [1, 2, 4, 4, 6];
console.log(bisectLeft(arr, 4)); // 2
console.log(bisectLeft(arr, 3)); // 2
์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ด๋ผ๋ฉด bisect_left
ํจ์๊ฐ ๋ฐํํ ์ธ๋ฑ์ค ์ดํ์ ์๋ ์์๋ค์ ๋ชจ๋ target
๊ณผ ๊ฐ๊ฑฐ๋ ํฌ๋ค๊ณ ๋ณผ ์ ์๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ ๋ฐฐ์ด์์ target
๊ณผ ๊ฐ๊ฑฐ๋ ํฐ ์์์ ๋ชจ๋ ๊ฐ์๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
const countGreaterOrEqual = (sortedArr, target) => {
const leftIndex = bisectLeft(sortedArr, target);
return sortedArr.length - leftIndex; // target๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์์ ์
};
const arr = [1, 2, 4, 4, 6];
console.log(countGreaterOrEqual(arr, 4)); // 3
bisect_right (์ฐ์ธก ์ด๋ถ ํ์)
์ ๋ ฌ๋ ๋ฐฐ์ด์์ target
์ ์ฝ์
ํ ์ ์๋ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์์น(์ธ๋ฑ์ค)๋ฅผ ๋ฐํํ๋ค. target
๊ณผ ๋์ผํ ๊ฐ์ด 1๊ฐ ํน์ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ฉด, ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์๋ target
์ ๋ค์ ์์น๋ฅผ ๋ฐํํ๋ค. target
๊ณผ ๋์ผํ ๊ฐ์ด ์๋ค๋ฉด, target
๋ณด๋ค ํฐ ๊ฐ์ด ์ฒ์ ๋ํ๋ ์์น๋ฅผ ๋ฐํํ๋ค.
const bisectRight = (sortedArr, target) => {
let left = 0;
let right = sortedArr.length;
while (left < right) {
const mid = Math.floor((left + right) / 2);
if (sortedArr[mid] <= target) left = mid + 1;
else right = mid;
}
return left;
};
const arr = [1, 2, 4, 4, 6];
console.log(bisectRight(arr, 4)); // 4
console.log(bisectRight(arr, 3)); // 2
์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ด๋ผ๋ฉด bisect_right
ํจ์๊ฐ ๋ฐํํ ์ธ๋ฑ์ค ์ด์ ์ ์๋ ์์๋ค์ ๋ชจ๋ target
๊ณผ ๊ฐ๊ฑฐ๋ ์๋ค. ์๋ฅผ ๋ค์ด bisect_right
๊ฐ 4๋ฅผ ๋ฐํํ๋ค๋ฉด 0~3 ์ธ๋ฑ์ค์ ์๋ ์์๋ target
๊ณผ ๊ฐ๊ฑฐ๋ ์์ ๊ฐ๋ค์ด๋ค. ๋ฐ๋ผ์ bisect_right
๊ฐ ๋ฐํํ๋ ์ธ๋ฑ์ค๋ ๊ณง target
๊ณผ ๊ฐ๊ฑฐ๋ ์์ ์์์ ๊ฐ์์ ๊ฐ๋ค.
const countLessOrEqual = (sortedArr, target) => {
return bisectRight(sortedArr, target);
};
const arr = [1, 2, 4, 4, 6];
console.log(countLessOrEqual(arr, 4)); // 4
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[DevTools] nvm๋ณด๋ค 40๋ฐฐ ๋น ๋ฅธ ๋ ธ๋ ๋ฒ์ ๊ด๋ฆฌ ๋๊ตฌ — fnm
[DevTools] nvm๋ณด๋ค 40๋ฐฐ ๋น ๋ฅธ ๋ ธ๋ ๋ฒ์ ๊ด๋ฆฌ ๋๊ตฌ — fnm
2024.06.18 -
[DevTools] Prettier ์ฃผ์ ํฌ๋งทํ ์ต์ ๊ณผ ์ถ์ฒ ์ค์
[DevTools] Prettier ์ฃผ์ ํฌ๋งทํ ์ต์ ๊ณผ ์ถ์ฒ ์ค์
2024.06.15 -
[Network] ์ฃ์ง ํ๋ซํผ ์ํคํ ์ฒ Edge Platform Architecture
[Network] ์ฃ์ง ํ๋ซํผ ์ํคํ ์ฒ Edge Platform Architecture
2024.06.02 -
[HTML/CSS] ์ํ๋ ์์น์ ๋ ธ๋ ์ฝ์ ํ๊ธฐ — insertAdjacentHTML
[HTML/CSS] ์ํ๋ ์์น์ ๋ ธ๋ ์ฝ์ ํ๊ธฐ — insertAdjacentHTML
2024.06.02