ํ์
ํ์์ ์ฃผ์ด์ง ์๋ฃ๋ค ์ค ์ํ๋ ์กฐ๊ฑด์ ํด๋นํ๋ ์๋ฃ๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด๋ค. ์ปดํจํฐ์์ ํ์์ ์์ฃผ ์ด๋ฃจ์ด์ง๋ฏ๋ก ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ์ํํ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ด์ ์ ๋ฐฐ์ ๋ '์ ๋ ฌ'์ ํ์์ ์ํํ ์ ์๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค. ์ ๋ ฌ์ ๋ฆฌ์คํธ๋ฅผ ํ๋์ ๊ธฐ์ค์ผ๋ก ๋ํ๋ด๊ธฐ ์ํด์๋ ์ฐ์ด์ง๋ง ์ํ๋ ์๋ฃ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ํ๊ธฐ ์ํด ์ฐ์ด๊ธฐ๋ ํ๋ค. ๋ฌผ๋ก ๊ตณ์ด ์ ๋ ฌ์ด ์๋๋๋ผ๋ ํ์์ ์ํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ค.
์์ผ๋ก ์๊ฐํ ํ์์ ๋ค์์ 4๊ฐ์ง ์ข ๋ฅ์ด๋ค.
-
์ ํํ์
-
์ด์งํ์
-
ํด์ํ์
-
BST
ํ์์ ์ํด์๋ ๋ฐฐ์ด, ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ํธ๋ฆฌ, ๊ทธ๋ํ ๋ฑ ๋ค์ํ ์๋ฃ๊ตฌ์กฐ๊ฐ ์ฌ์ฉ๋๋ฉฐ, ์ํฉ์ ๋ฐ๋ผ ๋ง์ถฐ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ ํ ํ์
์์ฐจ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ์ ํ ํ์์ ๊ฐ์ฅ ๊ฐ๋จํ ํ์ ๋ฐฉ๋ฒ์ด๋ค. ์ ํ ํ์์์๋ ์ ๋ ฌ๋์ง ์์ ์ด๊ธฐ ๋ฆฌ์คํธ๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์ฐจ๋ก๋ก ๊ฒ์ฌํ๋ค.
๋ฆฌ์คํธ์ ์๋ ์์์ ๊ฐฏ์๋ฅผ n์ด๋ผ๊ณ ํ ๋, ์์ฐจํ์์ ๋ฐ๊ฒฌํ๋ ์๊ฐ ํ์์ ๋ง์น๋ค. ๋ฆฌ์คํธ์ ์ํ๋ ์์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ํ๊ท ์ ์ผ๋ก (n+1)/2
์ ๋น๊ต๋ก ์์๋ฅผ ์ฐพ์๋ผ ์ ์์ง๋ง, ๋ฆฌ์คํธ์ ์ํ๋ ์์๊ฐ ์์ ๊ฒฝ์ฐ์๋ ์ด n+1 ๋ฒ์ ๋น๊ต ๋์ ํด๋น ์์๊ฐ ์๋ค๋ ์ ์ ๋ฐ๊ฒฌํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์์ฐจํ์์ ์๊ฐ ๋ณต์ก๋๋ O(n)์ด๋ค.
๊ตฌํ
์์ฌ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
//value : ์ฐพ๊ณ ์ ํ๋ ๊ฐ
//index : ์ฐพ์ ๊ฐ์ ์์น
for i=0 to n:
if arr[i] == value
index = i
break
c++๋ก ๊ตฌํํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
int arr[9] = { 3,1,5,7,2,4,9,6,8 };
int arr_size = sizeof(arr) / sizeof(int);
int linearSearch(int target) {
// ์ฐพ์ ๊ฐ์ index ๋ฐํ, ์์ผ๋ฉด -1 ๋ฐํ
int result = -1;
for (int i = 0; i < arr_size; i++) {
if (arr[i] == target) {
result = i;
break;
}
}
return result;
}
์ด์ง ํ์
์ด๋ถ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ์ด์ง ํ์์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ์ ์ฉํ๊ธฐ ์ข์ ํ์ ๋ฐฉ๋ฒ์ด๋ค. ์์ ์ค๋ช ํ๋ฏ์ด ํ์์ ํ๋ ๋ฐฉ๋ฒ์๋ ์ ๋ ฌ๋ ์ํด์๋ค๊ณ ํ๋๋ฐ, ์ ๋ ฌ ํ ์ด์ง ํ์์ ์ด์ฉํ๊ฒ ๋๋ฉด ์ฌ๋ฌ ๋ฒ ๋ฎ์ ์๊ฐ ๋ณต์ก๋๋ก ์์๋ฅผ ํ์ํ ์ ์๋ค. ๋ฌผ๋ก ์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋๊น์ง ์๊ฐํ๋ค๋ฉด ๋จ์ํ ์ ํ ํ์์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํ ์๋ ์์ง๋ง, ์ ๋ ฌ์ ๋ฆฌ์คํธ์ ๋ํด ํ๋ฒ๋ง ์ํ๋์ด๋ ๋๋ฏ๋ก ๋ฐ๋ณต์ ์ธ ํ์์ ์๊ฐํ๋ค๋ฉด ์ ๋ ฌ ํ ์ด์ง ํ์ ๋ฐฉ๋ฒ์ด ๋ ์ข์ ์๋ ์๋ค.
์ด์ง ํ์์ ์ฐ์ ์ฃผ์ด์ง ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ์์ ์์ํ๋ค. ์ดํ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๊ฐ์ด๋ฐ์ ์๋ ์์์ ์ฐพ๊ณ ์ํ๋ ๊ฐ์ ๋น๊ตํ๋ค. ๋์๊ด๊ณ์ ๋ฐ๋ผ ํด๋น ์์๊ฐ ๋ง๋์ง, ์๋๋ฉด ์ผ์ชฝ ๋ฆฌ์คํธ์ ์๋์ง ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ์ ์๋์ง๋ฅผ ํ๋จํ๋ค. ์ฐพ๊ณ ์ํ๋ ๊ฐ๋ณด๋ค ๊ฐ์ด๋ฐ์ ์๋ ์์๊ฐ ๋ ์์์ ๋ ํฐ ๋ฒ์์์ ์ฐพ์์ผํ๋ค๋ฉด ํด๋น ์์ ์ค๋ฅธ์ชฝ์ ์ ๋ ฌ๋์ด์๋ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์ ์์๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
๋ฆฌ์คํธ์ ์ํ๋ ์์๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ์ต์
์ผ๋ก ์๊ฐํด๋ณด๋ฉด, ๋ฆฌ์คํธ์ ์์๋ฅผ 1/2์ฉ ์ค์ฌ๊ฐ๋ฏ๋ก ์ต์
์ ๊ฒฝ์ฐ lgn
๋ฒ์ ๋น๊ต๊ฐ ํ์ํ๋ค. ๋ฐ๋ผ์ ์ด์ง ํ์์ ์๊ฐ๋ณต์ก๋๋ O(lgn)์ด๋ค.
๊ตฌํ
์์ฌ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
//value : ์ฐพ๊ณ ์ ํ๋ ๊ฐ
//index : ์ฐพ์ ๊ฐ์ ์์น
function binarySearch (start, end):
if start == end
if value == arr[start]
index = start
else
return
mid := start + end / 2
if mid == value
index = mid
break
else if mid > value
binarySearch(start, mid)
else if mid < value
binarySearch(mid+1, end)
end
c++๋ก ๊ตฌํํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
// ํธ์ถ ์์
quickSort(arr, 0, arr_size);
cout << "์ด์ง ํ์ ๊ฒฐ๊ณผ : " << binarySearch(0, arr_size, 2) << endl;
// ๊ตฌํ ์ฝ๋
int binarySearch(int start, int end, int target){
if (end-start<=1) {
if (target == arr[start])
return start;
return -1;
}
int result = -1;
int mid = (int)((start + end) / 2);
if (arr[mid] == target)
result = mid;
else if (arr[mid] > target)
result = binarySearch(start, mid, target);
else if (arr[mid] < target)
result = binarySearch(mid + 1, end, target);
return result;
}
๋ณด๊ฐ ํ์
์ด์ง ํ์์ ๋ฆฌ์คํธ์์ ์ค๊ฐ์ ์๋ ์์๋ฅผ ๊ธฐ์ ์ผ๋ก ํ๋จํ๋ค๋ฉด, ๋ณด๊ฐ ํ์์ ์์๊ฐ ์์ ๋งํ ์ธ๋ฑ์ค๋ฅผ ์์ธกํด์ ํด๋น ์ธ๋ฑ์ค์ ์๋ ์์๋ฅผ ๊ธฐ์ ์ผ๋ก ํ๋จํ๋ ํ์ ๋ฐฉ๋ฒ์ด๋ค. ์ฆ, ๋ฆฌ์คํธ๋ฅผ ๋ถ๊ท ๋ฑ ๋ถํ ํ์ฌ ํ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ํ๋ ํ์์ด๊ธฐ ๋๋ฌธ์ ๋ณด๊ฐ ํ์์ด ๋ ํจ์จ์ ์ผ ์๋ ์๋ค.
์ด์ง ํ์ ํธ๋ฆฌ (BST)
BST(Binary Search Tree)๋ ํธ๋ฆฌ์ ํ ์ข ๋ฅ์ด์ ์ด์งํ์์ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค. ์์์๋ ๋ฐฐ์ด์ ์ฌ์ฉํ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ ์ด์งํ์์ ๊ตฌํํ์์ง๋ง, ์ด๋ฒ์๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ํธ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์ด์ง ํ์ ํธ๋ฆฌ๋ฅผ ๊ตฌํํด๋ณด์. ๋ฆฌ์คํธ์ ํธ๋ฆฌ ๋ชจ๋ ๋ฐฐ์ด ๋๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํํ ์ ์์ง๋ง, ๊ฐ๊ฐ์ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๋ฆฌ์คํธ๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๊ณ ํธ๋ฆฌ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋๋ก ๊ตฌํํ์.
์ด์ง ํ์์ ๋ฆฌ์คํธ(๋ฐฐ์ด)๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๋ฃ์ ์ฝ์ / ์ญ์ ๊ฐ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค. ํ์ง๋ง ์ด์ง ํ์ ํธ๋ฆฌ๋ ํธ๋ฆฌ(์ฐ๊ฒฐ ๋ฆฌ์คํธ)๋ฅผ ์ฌ์ฉํด์ ์ฝ์ / ์ญ์ ๊ฐ ํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์ ์ฝ์ / ์ญ์ ๊ฐ ๋น๋ฒํ ์ด๋ฃจ์ด์ง๋ค๋ฉด ์ด์ง ํ์ ํธ๋ฆฌ๊ฐ ์ ๋ฆฌํ๋ค. ์ด์ง ํ์ ํธ๋ฆฌ๋ ์ฆ ์ด์ง ํ์์ด๋ผ๋ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ผ๋ ์ฝ์ / ์ญ์ ์ ํจ์จ์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ํ ํํ์ด๋ค. ์๋์ ํฌ์คํ ์ผ๋ก ๋ ์์ธํ ์ดํดํด๋ณด์.
ํด์ ํ์
(ํด์ ๋งํฌ)
ํด์ ํ์์ ํด์ ํจ์๋ฅผ ์ด์ฉํ ํ์ ๋ฐฉ๋ฒ์ด๋ค. ํด์ ํจ์๋ ์๋ '์์์ ๊ธธ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ๋ ๊ธธ์ด์ ๋ฐ์ดํฐ๋ก ๋งคํํ๋ ํจ์'๋ฅผ ์ผ์ปซ๋๋ฐ, ์ฝ๊ฒ ๋งํ๋ฉด ๋ค์ํ ํํ์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ฝ๊ฒ ๋ถ๋ฅํ๋ ํจ์์ด๋ค.
ํด์ ํจ์๋ฅผ ๊ฑฐ์น ํ ๋์ค๋ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์ ๋ ฅ๋ค์ ๋ถ๋ฅํ๋ ๊ณผ์ ์ ๋ฏธ๋ฆฌ ์ค๋นํด๋ ์์(ํด์ ํ ์ด๋ธ)์ ์ ๋ ฅ๋ค์ ๋ถ๋ฅํด์ ๋ด์๋๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค. ์ด๋ ๊ฒ ๋ฏธ๋ฆฌ ์์์ ๋ด์๋๋ฉด ๋์ค์ ํด๋น ์์๋ฅผ ์ฐพ๊ณ ์ ํ ๋ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ค.
ํด์ ํ์์ ํด์ ํจ์๋ฅผ ์ฌ์ฉํด ์ ๋ ฅ๋ค์ ๋ถ๋ฅ/์ ์ฅํ๋ ์์ ์ด ๋จผ์ ํ์ํ๊ณ , ๊ทธ ํ ์์๋ฅผ ํ์ํ ๋๋ ์ฐพ๊ณ ์ํ๋ ์์์ ํด์๊ฐ์ ์ด์ฉํด ๋น ๋ฅด๊ฒ ์์๋ฅผ ํ์ํ ์ ์๋ค.
๋ถ๋ฅ ์ ์ฅํ๋ ์์ ์์ ์ฃผ์ํ ์ ์ ํด์ ํจ์์ ์ํ ํด์ ๊ฐ์ด ๊ฒน์น ์๋ ์๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํด์๊ฐ ์ถฉ๋์ด๋ผ๊ณ ํ๊ณ , ํด์ ํจ์๋ ํด์๊ฐ ์ถฉ๋์ด ๋น๋ฒํ๊ฒ ์ผ์ด๋ ์๋ก ์ง์ด ์ ์ข๋ค๊ณ ํ๋จ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ ๋ ฅ์ ํฌ๊ธฐ์ 2๋ฐฐ๋ก ํด์ ๊ฐ ๋ฐฐ์ด์ ์ค๋นํ์ง๋ง, ๋ค๋ฅธ ์ ๋ ฅ์ ๋ํด์ ํด์ ๊ฐ์ด ๊ฒน์น๋ ๊ฒฝ์ฐ์๋ ๋ฐฐ์ด์ ๋ค์ ์ธ๋ฑ์ค๋ค์ ํ์ผ๋ฉด์ ๋น์ด์๋ ์ธ๋ฑ์ค์ ์ ์ฅํด์ผํ๋ค.
ํด์ ๊ฐ์ด ๊ฒน์น๋ ๊ฒฝ์ฐ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ๋ค. ๊ฐ์ ํด์ ๊ฐ์ ํด๋นํ๋ ์์๋ค์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๋ง๋ค์ด๋๋ ๋ฐฉ๋ฒ๋ ์๋ค. ์ด ๊ธ์์๋ ์ธ๋ฑ์ค๋ฅผ ์ฆ๊ฐ์ํค๋ฉด์ ๋น์ด์๋ ์ธ๋ฑ์ค์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
ํด์ ์ถฉ๋ ๋ฐ์์ ์กฐ์ฌํ๊ฒ ๋๋ ๋์ฒด ์นธ์ ๋ฒ์ง ๊ณ์ด์ด๋ผ๊ณ ํ๋ค.
๋ฒ์ง ๊ณ์ด์ด ๊ฒน์ณ์ ์ถฉ๋์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ๋ฅผ ํด๋ฌ์คํฐ ๋ผ๊ณ ํ๋ค.
๊ทธ ํ ์์๋ฅผ ํ์ํ ๋๋ ์ฒ์์๋ ํด์๊ฐ์ ์ด์ฉํด์ ๋น ๋ฅด๊ฒ ์์๋ฅผ ํ์ํ ์ ์์ง๋ง, ํด์๊ฐ ์ถฉ๋๋ก ์ธํด ๋ค๋ฅธ ์ธ๋ฑ์ค์ ์ ์ฅ๋์ด์์ ์ ์๊ธฐ ๋๋ฌธ์ ์ํ๋ ๊ฐ๊ณผ ์ผ์นํ์ง ์๋๋ค๋ฉด ๊ฒฐ๊ตญ ์ฐพ๋ ์ธ๋ฑ์ค๋ก๋ถํฐ ์์ฐจ ํ์ ํด๋ณด์์ผํ๋ค. ๋ฐ๋ผ์ ํด์ ํ์์ ํด์ ํจ์์ ์ง์ด ์ข์ ๋๋ง ํจ์จ์ ์ผ๋ก ์๋ํ๋ค.
๊ตฌํ
#include <iostream>
#include <string>
using namespace std;
int hashFunction(int data) {
// ํด์ ํจ์
return data % 10;
}
void classifyData(int data, int* table) {
// ๋ฐ์ดํฐ ๋ถ๋ฅ ๋ฐ ์ ์ฅ
int hashValue = hashFunction(data);
int flag = 0;
while (hashValue<20) {
if (table[hashValue] == -1) { // ํด๋น ์นธ์ ์์๊ฐ ์์ผ๋ฉด
table[hashValue] = data;
flag = 1;
break;
}
hashValue++; // ๋ค์ ์นธ์ผ๋ก ์ด๋
}
if(!flag)
cout << "์ ์ฅ ์คํจ, ๊ณต๊ฐ ๋ถ์กฑ" << endl;
}
bool searchData(int data, int* table) {
// ๋ฐ์ดํฐ ํ์
int hashValue = hashFunction(data);
while (hashValue<20) {
if (table[hashValue] == data) { // ๋ฐ๊ฒฌํ์ผ๋ฉด
return true;
}
hashValue++;
}
return false;
}
void printHashTable(int* table) {
for (int i = 0; i < 20; i++) {
cout << table[i] << " ";
}
cout << endl;
}
int main() {
// ์ฃผ์ด์ง input์ hashTable๋ก ๋ถ๋ฅํ๊ณ ํ์ํ๋ ํ๋ก๊ทธ๋จ
int input[10] = { 41,24,35,26,12,33,44,5,2,1 };
int hashTable[20];
memset(hashTable, -1, sizeof(hashTable));
for (int i = 0; i < 10; i++) {
classifyData(input[i], hashTable);
}
printHashTable(hashTable);
string result = searchData(33, hashTable) ? "์์" : "์์";
cout << "33 ํ์ : " + result << endl;
int a; cin >> a;
}
ํน์ง
ํด์ ํ์์์๋ ์ํ๋ ์์๋ฅผ ํ์ํ ๋ ์์์ ์๊ฐ๋ณต์ก๋๋ก ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์์์ ์ธ๊ธํ๋ฏ์ด ํด์ ํจ์์ ์ง์ด ์ข์ง ์๋ค๋ฉด, ๋ ๋ณต์กํด์ง ์๋ ์๋ค.
๋ํ ๊ธฐ์กด ์ ๋ ฅ์ 2๋ฐฐ ์ด์์ ๋ฐฐ์ด์ด ํ์ํ๋ฏ๋ก ๊ณต๊ฐ ๋ณต์ก๋ ์ธก๋ฉด์์๋ ์ข์ง ์์ ์ ํ์ด๋ค.
์ฐธ๊ณ : https://pwnwiz.tistory.com/9
Comment