Big O Search Algorithms in JavaScript - Lee-hyuna/33-js-concepts-kr GitHub Wiki
JavaScript์ Big O ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ
์ด ๊ฒ์๋ฌผ์ JavaScript๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ถ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ์ ์ฝ๋ ์์ ๋ฅผ ์ ๊ณตํฉ๋๋ค. JavaScript์ ์ต์ํ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. ์ํ ์ฝ๋๋ฅผ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์ ธ ์์ ์คํํ ์ ์๋๋ก ์๋์ ์ผ๋ก JavaScript๋ฅผ ์ ํํ์ต๋๋ค.
๊ฐ ์ฝ๋ ์์ ์ ๋ํด JSLitmus๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒค์น ๋งํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ ์ ๋ ฅ, ์ค๊ฐ ์ ๋ ฅ ๋ฐ ํฐ ์ ๋ ฅ์ผ๋ก ๊ฐ ๋ฐฉ๋ฒ์ ์ธ ๋ฒ ๋ฒค์น ๋งํฌํฉ๋๋ค. JSLitmus์๋ ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ ํน์ฑ์ ์๊ฐ์ ์ผ๋ก ๋ํ๋ด๋ ์ ์ฉํ ๊ทธ๋ํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๋ฐ๋ณต ์คํ์ ์ด๋น ๊ฐ๋ฅํ ์์ ์๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
์ด๊ฒ์ด ์๊ณ ๋ฆฌ์ฆ ๋ฒค์น๋งํน์ ๊ดํ ๊ฒ์ด ์๋๋ผ ์ฑ์ฅ ํน์ฑ์ ์๊ฐ์ ์ผ๋ก ํ์ํ๊ธฐ ์ํด ๋ฒค์น ๋งํฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ์ ์ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์์ ๋ฅผ๋ณด๋ค ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ค์ ์ธ ๊ฐ์ง ๋ฐฐ์ด์ ๋ชจ๋ ์ฌ์ฉํฉ๋๋ค.
// Set up a simple array of colours
var colours = new Array ("Black", "Blue", "Brown", "Green", "Pink", "Red", "White", "Yellow");
// Set up numbers from 1 to 2500
var numbersHalf = new Array();
for (var i = 1; i < 2500; i++) {
numbersHalf.push(i);
};
// Set up numbers from 1 to 5000
var numbersFull = new Array();
for (var i = 1; i < 5000; i++) {
numbersFull.push(i);
};
๋ฐฐ์ด colours์ ์์ ๋ฐฐ์ด์ด๋ฉฐ numbersHalf์๋ 2500๊ฐ์ ํญ๋ชฉ์ด ์๊ณ numbersFull์๋ 5000๊ฐ์ ํญ๋ชฉ์ด ์์ต๋๋ค.
๊ฐ๋ ์ ์ตํ๊ธฐ ์ํด ์ด์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋ค์ ์ฐธ์กฐํ์ญ์์ค.
Constant Complexity (์ผ์ ํ ๋ณต์ก์ฑ)
์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ํํ๋ฉ๋๋ค : O(1)
๋ณต์ก์ฑ(ํญ๋ชฉ ์)์ ๊ด๊ณ์์ด ๊ฒฐ๊ณผ๋ ์ผ์ ํฉ๋๋ค. ์๋ ์ฝ๋๋ ๋จ์ํ ๋ฐฐ์ด์์ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ ๊ฐ์ ธ ์์ ๋ฐํํฉ๋๋ค.
// Find the first item
function FindFirstItem(items) {
return items[0];
}
JSLitmus.test('Find first colour test', function() {
FindFirstItem(colours);
});
JSLitmus.test('Find first number test (2500 items)', function() {
FindFirstItem(numbersHalf);
});
JSLitmus.test('Find first number test (5000 items)', function() {
FindFirstItem(numbersFull);
});
์๋ ํ๋ ์ด๋น ์์ ์๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ณด์๋ค์ํผ ๊ฒฐ๊ณผ๋ ์ ๋ ฅ ์์ ๊ด๊ณ์์ด ๊ฑฐ์ ๊ฐ์ต๋๋ค. ๊ฒฐ๊ณผ๋ ์ผ์ ํฉ๋๋ค.
Test | Ops/sec |
---|---|
Find first colour test | 102675741 |
Find first number test (2500 items) | 99864381 |
Find first number test (5000 items) | 99273467 |
๊ทธ๋ํ ์ด๋ฏธ์ง ์ฃผ์ : http://2.bp.blogspot.com/-PHqGo4yup_w/T5CkDrfB8CI/AAAAAAAAAOY/AkMGNKS2qCc/s400/constant-complexity.png
Linear Complexity(์ ํ ๋ณต์ก์ฑ)
์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ํํ๋ฉ๋๋ค : O(n)
์ ํ ๋ณต์ก์ฑ์ผ๋ก ํจ์์ ์ฑ์ฅ๋ฅ ์ ํญ๋ชฉ ์์ ์ง์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋ค์ ์ฝ๋ ์์ ์์๋ ๋ชจ๋ ํญ๋ชฉ์ ๋ฐ๋ณตํ๊ณ ๋ฐฐ์ด์ ๋ง์ง๋ง ํญ๋ชฉ๊ณผ ์ผ์น์ํต๋๋ค. ์ฑ์ฅ์ ์ธก์ ํ ๋๋ ์ํ ๋๋ ์ต์ ์ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํ๋ฏ๋ก ๋ฒค์น ๋งํฌ์์ ๋ฐฐ์ด์ ๋ง์ง๋ง ํญ๋ชฉ์ ์ฐพ๊ณ ์์ต๋๋ค.
function FindItem(items, match) {
for (var i=0; i < items.length; i++) {
if (items[i] == match) {
return true;
}
}
return false;
}
JSLitmus.test('Find colour by colour name', function() {
FindItem(colours, "Yellow");
});
JSLitmus.test('Find number index by number (2500 items)', function() {
FindItem(numbersHalf, 2500);
});
JSLitmus.test('Find number index by number (5000 items)', function() {
FindItem(numbersFull, 5000);
});
์๋ ๊ทธ๋ํ๋ ํจ์ฌ ๋ ์์ colours์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ด๋น ๋ ๋ง์ ์คํ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ถ๋ช ํ ๋ณด์ฌ ์ฃผ์ง๋ง, ๊ทธ๋ํ์ ๊ฒฐ๊ณผ๊ฐ ์๋์ ์ด๋ฏ๋ก 2500 ๋ฐ 5000 ํญ๋ชฉ์ ๋ฐฐ์ด์ ๋น๊ตํ๋ ๋ฐ๋ณ๋ก ์ ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ ์ด๋ธ ๋ฐ์ดํฐ์์ ๋น๊ต๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
Test | Ops/sec |
---|---|
Find colour by colour name | 53659755 |
Find number index by number (2500 items) | 54566 |
Find number index by number (5000 items) | 27168 |
๊ทธ๋ํ ์ด๋ฏธ์ง ์ฃผ์ : http://1.bp.blogspot.com/-r4-QbMkytKc/T5ClvsGIWRI/AAAAAAAAAOk/NKwiFOJptE4/s400/linear-complexity.png
์๋๋ FindItem ๋ฉ์๋์ 2500 ๋ 5000 ํญ๋ชฉ์ ๊ทธ๋ํ์ ๋๋ค. ์ด๊ฒ์ ๋ ๋ฐฐ๋ ๋ง์ ์์ดํ ์ ์ฑ์ฅ๋ฅ ์ ๋ถ๋ช ํ ๋ณด์ฌ ์ฃผ๋ฉฐ 5000๊ฐ ์์ดํ ์ 2500๊ฐ๋ณด๋ค ๋ ๋ฐฐ ๋๋ฆฝ๋๋ค.
๊ทธ๋ํ ์ด๋ฏธ์ง ์ฃผ์ : http://2.bp.blogspot.com/-NELJVXcDIJE/T5CmfbiKN3I/AAAAAAAAAOw/7xGTBbFpKDw/s1600/linear-complexity-2.png
Logarithmic Complexity (๋ก๊ทธ ๋ณต์ก์ฑ)
์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ํํ๋ฉ๋๋ค : O(log n)
๋ค์ ์ฝ๋๋ ์ ํ ๋ฒํธ๋ถ์์ ์ด๋ฆ์ ์ฐพ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ ํ ๋ฒํธ๋ถ์์ ์ด๋ฆ์ ์ฐพ๊ณ ์๋๋ฐ ์ ํํ ์ค๊ฐ์ ์ฑ ์ ์ฐ๋ค ๊ณ ์์ํด๋ณด์ญ์์ค. ์ฐพ๊ณ ์๋ ์ด๋ฆ์ด ํด๋น ํ์ด์ง์์๋ ๊ฒฝ์ฐ ์ํ๋ฒณ์ ๊ธฐ์ค์ผ๋ก ์ ํ ๋ฒํธ๋ถ๋ฅผ ์๋๋ก ๋๋ ์๋ก ์ด๋ํ๋ฉด์ ํด๋น ์น์ ์ ์ค๊ฐ์ ์ฐพ์ ๋ค์ ์ผ์นํ๋ ๋ถ๋ถ์ ์ฐพ์ ํ ๋๋จธ์ง ์น์ ์ ์ค๊ฐ์ผ๋ก ๊ณ์ ์ด๋ํฉ๋๋ค. ์ฐพ๊ณ ์๋ ์ด๋ฆ์ ์ฐพ์ ๋๊น์ง ์ด๊ฒ์ ์ ํ ๋ฒํธ๋ถ๊ฐ ์ํ๋ฒณ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ธ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค๋ ์ ์ ์ ์ํด์ผํฉ๋๋ค.
์ด ๊ฐ๋ ์ ์ด์ง ๊ฒ์์ด๋ผ๊ณ ํฉ๋๋ค. ์๋ ์ฝ๋๋ ์ด์ง ๊ฒ์์ ๊ตฌํ์ ๋๋ค.
function FindItemBinarySearch(items, match) {
var low = 0,
high = items.length -1;
while (low <= high) {
mid = parseInt((low + high) / 2);
current = items[mid];
if (current > match) {
high = mid - 1;
} else if (current < match) {
low = mid + 1;
} else {
return mid;
}
}
return -1;
}
JSLitmus.test('Find colour by colour name', function() {
FindItemBinarySearch(colours, "Yellow");
});
JSLitmus.test('Find number index by number (2500)', function() {
FindItemBinarySearch(numbersHalf, 2500);
});
JSLitmus.test('Find number index by number (5000)', function() {
FindItemBinarySearch(numbersFull, 5000);
});
์๋ ๊ฒฐ๊ณผ ์ธํธ์์ ์ฐ๋ฆฌ๋ colour ๋ฐฐ์ด ๋ชฉ๋ก์ด ์ ํ๋ ํฌ๊ธฐ์ ๋ฐฐ์ด๋ก ์ธํด ๋ ๋ง์ ์คํ์ ํ ์ ์์์ ์ ์ ์์ต๋๋ค. ํฅ๋ฏธ๋กญ๊ฒ๋ 2500 ๋ฐ 5000 ๋ฐฐ์ด ํญ๋ชฉ ์ฌ์ด์ ์ด๋น ์์ ์์๋ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ด์ ์ด์ง ๊ฒ์ ์ฌ์ฉ์ ์ด์ ์ ๋ณผ ์ ์์ต๋๋ค. ๋ ๋ฐฐ๋ ๋ง์ ์์ดํ ์ด์ง๋ง ๋๋ต ๊ฐ์ ํผํฌ๋จผ์ค๊ฐ ๊ทธ ์์ฒด๋ฅผ ๋๋ณํ ๊ฒ์ ๋๋ค!
Test | Ops/sec |
---|---|
Find colour by colour name | 8081984 |
Find number index by number (2500 items) | 3261082 |
Find number index by number (5000 items) | 3055804 |
๊ทธ๋ํ ์ด๋ฏธ์ง ์ฃผ์ : http://3.bp.blogspot.com/-SrIDz0CDt-Y/T5HImW9WHmI/AAAAAAAAAO8/2tGSryvYH1Y/s400/binary-search.png
๋ณด๋ค ์ฌ์คํ ์ฐจ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด 5000 ํญ๋ชฉ ๋ฐฐ์ด์์ ๋ง์ง๋ง ์์๋ฅผ ์ฐพ์ ๋ FindItem๋ฉ์๋ Linear Complexity(์ ํ ๋ณต์ก๋)์ FindItemBinarySearch๋ฉ์๋ Logarithmic Complexity(๋ก๊ทธ ๋ณต์ก๋)๋ฅผ ๋น๊ตํฉ๋๋ค.
Test | Ops/sec |
---|---|
Find number index by number - FindItem | 26349 |
Find number index by number - Binary Search | 844153 |
๊ทธ๋ํ ์ด๋ฏธ์ง ์ฃผ์ : http://2.bp.blogspot.com/-09gVF5IrEr8/T5HJLRiRdrI/AAAAAAAAAPI/ojBpAHoeKxU/s400/binary-search-vs-linear.png
๋ณด์๋ค์ํผ ์ฑ์ฅ์ ์ฐจ์ด๋ ๋๋์ต๋๋ค.
Linear Complexity vs. Logarithmic Complexity
์์ผ๋ก ๋น์ทํ ๋ก์ง์ ๋ํ ์ด์ง ๊ฒ์์ ์์ํ๊ณ ๊ตฌํํ๊ธฐ ์ ์ ๋ช ๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ์ปจํ ์คํธ๋ฅผ ๊ณ ๋ คํด์ผํฉ๋๋ค.
์ ํ ๋ณต์ก๋๋ฅผ ์ด์ฉํ colour ๋ฉ์๋์ ์ด์ง๊ฒ์์ ์ด์ฉํ colour ๋ฉ์๋๋ฅผ ๋น๊ตํด ๋ด ์๋ค. ์ด์ ์ ๋ณธ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ด๋๋ฆฌ ๊ฒ์์ด ๋ ๋นจ๋ผ์ง ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๊น?
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Test | Ops/sec |
---|---|
Find colour by colour name | 51804043 |
Find colour by colour name - Binary Search | 7902378 |
๊ทธ๋ํ ์ด๋ฏธ์ง ์ฃผ์ : http://3.bp.blogspot.com/-z3bxn1mjU5Y/T5HczUk2iyI/AAAAAAAAAPU/lAaduS7LXlg/s400/battle.png
์ด ๊ฒฝ์ฐ ์ ํ ๋ณต์ก์ฑ ์์ ๊ฐ ๋ ์ฑ๋ฅ์ด ์ข์ต๋๋ค. ์์ ๋ฐฐ์ด์์ ์ด์ง ๊ฒ์์ ์ถ๊ฐ ๋ณต์ก์ฑ์ผ๋ก ์ธํด ๋ถํ์ํ ์ค๋ฒ ํค๋๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฌ๊ธฐ์์ ๊ตํ์ ํญ์ ์ํฉ์ ๊ณ ๋ คํ๋ ๊ฒ์ ๋๋ค!
๋ ๋ฐฉ๋ฒ์ด ์๋ก ๋์ผํ ์ง์ ์ ์๋ณํ๊ธฐ ์ํด ๋ ๋ฒ์งธ ๋ฒค์น ๋งํฌ ์ธํธ๋ฅผ ์์ฑํ์ต๋๋ค. ์๋ ์ฝ๋๋ 85 ๊ฐ์ ํญ๋ชฉ์ด์๋ ๋ฐฐ์ด์ ์ฌ์ฉํฉ๋๋ค.
// Set up numbers from 1 to 85
JSLitmus.test('Find numbers - linear', function() {
FindItem(numbers, 85);
});
JSLitmus.test('Find numbers - Binary Search', function() {
FindItemBinarySearch(numbers, 85);
});
Test | Ops/sec |
---|---|
Find numbers - linear | 6045812 |
Find numbers - Binary Search | 6116343 |
๊ทธ๋ํ ์ด๋ฏธ์ง ์ฃผ์ : http://1.bp.blogspot.com/-APP7aI1q68c/T5HmE-PGDsI/AAAAAAAAAPg/_QdjelVPOvQ/s400/linear-vs-binary.png
์ด๊ฒ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ๋ ํญ์ ์ปจํ ์คํธ๋ฅผ ๊ณ ๋ คํด์ผํ๋ค๋ ์ ์ ๊ฐ์กฐํฉ๋๋ค.
๊ฒฐ๋ก
์ด๋ฌํ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Big O ํ๊ธฐ๋ฒ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ ํ ์คํธ๊ฐ ์๋์ด ๋ช ๋ฐฑํด์ผํฉ๋๋ค. ์ปจํ ์คํธ ๊ฐ๋ ์ด ์์ผ๋ฉฐ ๋ชจ๋ ์์๋ฅผ ๊ณ ๋ คํ์ง ์์ต๋๋ค. ๋ํ CPU ์๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฑ์ด ๋ค์ํฉ๋๋ค. ๋ํ ์ ๋ ฅ ํฌ๊ธฐ๊ฐ ์๊ณ ๋ฆฌ์ฆ ์ ํ์ ์ถ๋ก ํ ์ ์์์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ์ฃผ๋ ๊ฒ์ ํนํ ํฐ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ค๋ฃฐ ๋ ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ ์ ์๋ ๊ฒ์ ๋ํ ์๊ฐ์ ๋๋ค.