ํด์ํ ์ด๋ธ(Hash Table)
ํด์ฑ์ ๋๊ธฐ: TLB์์ ์ ์ฌ์ฑ
CPU๊ฐ ์ฐ์ฐ์ ํ ๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค. ํ๋ ์ปดํจํฐ๋ ๊ฐ ํ๋ก์ธ์ค๋ง๋คย ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ฃผ์ ๋ฅผ ๋ถ์ฌํ๋๋ฐ, ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ํจ์จ์ฑ๊ณผ ๋ณด์์ ์ฅ์ ์ด ์๋ค.
ํ์ง๋ง CPU๊ฐ ์ค์ ์ฐ์ฐ์ ํ ๋๋ ๊ฐ์ ์ฃผ์๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ณํํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด TLB(Translation Lookaside Buffer) ๋ฅผ ์ฌ์ฉํ๋ค.
TLB๋ ๊ฐ์ ์ฃผ์์ ๋ฌผ๋ฆฌ ์ฃผ์๋ฅผ ๋งคํํ ํ ์ด๋ธ๋ก, ๋น ๋ฅธ ์ฃผ์ ๋ณํ์ ์ ๊ณตํ๋ค. ํด์ฑ ์๊ณ ๋ฆฌ์ฆ๋ ์ด์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์๋ํด์ ๊ธฐ์กด ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
ํด์ฑ์ ์๊ฐ ๋ณต์ก๋ : ํ๊ท O(1) ์ต์ O(n)
ํด์ฑ์ด ํ์ํ ์ด์
์์: ์ฒ์์ผ๋ก ๋ฐ๋ณต๋๋ ๋ฌธ์ ์ฐพ๊ธฐ
๋ฌธ์์ด์์ ์ฒ์์ผ๋ก ๋ฐ๋ณต๋๋ ๋ฌธ์๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐํด๋ณด์.
๋ฐฉ๋ฒ 1: ์ด์ค ๋ฐ๋ณต๋ฌธ
for i in range(len(s)):
for j in range(i+1, len(s)):
if s[i] == s[j]:
return s[i]
์๊ฐ ๋ณต์ก๋: O(nยฒ)
๋ฐฉ๋ฒ 2: ๋ฐฐ์ด ์นด์ดํฐ ์ฌ์ฉ
count = [0] * 128 # ASCII ๋ฌธ์ ๊ฐ์
for char in s:
count[ord(char)] += 1
if count[ord(char)] == 2:
return char
์๊ฐ ๋ณต์ก๋: O(n)
๋ฌธ์์ ๊ฒฝ์ฐ ASCII ์ฝ๋๋ก ์ ํํ ๋ฒ์๋ฅผ ๊ฐ์ง๋ฏ๋ก ๋ฏธ๋ฆฌ ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ ์ ์ ์๋ค. ํ์ง๋งย ์์ฐ์์ฒ๋ผ ๊ฐ๋ฅํ ์ ์ฒด ์งํฉ U์ ํฌ๊ธฐ๊ฐ ์ค์ ์ฌ์ฉ๋๋ ์งํฉ K์ ํฌ๊ธฐ๋ณด๋ค ์๋ฑํ ํฐ ๊ฒฝ์ฐ์๋ ํด์ฑ์ด ์ฌ์ฉ๋๋ค.
ํด์ํ ์ด๋ธ์ ๊ตฌ์ฑ ์์
1. ํด์ํ ์ด๋ธ (Hash Table)
ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์์ ์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์๋ฃ๊ตฌ์กฐ๋ค.
- ํค(Key): ๋ฐ์ดํฐ๋ฅผ ์๋ณํ๋ ๊ณ ์ ํ ๊ฐ
- ๊ฐ(Value): ์ค์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ
- ์ธ๋ฑ์ค ๊ธฐ๋ฐ ์ ๊ทผ: ํ๊ท O(1) ์๊ฐ์ ๋ฐ์ดํฐ ์ ๊ทผ ๊ฐ๋ฅ
2. ํด์ํจ์ (Hash Function)
ํด์ฑ์์ ๊ฐ์ฅ ํต์ฌ์ ์ธ ์์๋ก, ํค๋ฅผ ํด์ํ ์ด๋ธ์ ์ธ๋ฑ์ค๋ก ๋ณํํ๋ ํจ์๋ค.
ํด์ํจ์์ ์ค์ํ ํน์ฑ:
- ๋น ๋ฅธ ์ฐ์ฐ: ํด์ํจ์ ์์ฒด๊ฐ ๋๋ฆฌ๋ฉด ํด์ฑ์ ์ฅ์ ์ด ์ฌ๋ผ์ง๋ค
- ๊ท ๋ฑ ๋ถํฌ: ๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ ์ ์ฒด์ ๊ณ ๋ฅด๊ฒ ๋ถ์ฐ์์ผ์ผ ํ๋ค
- ๊ฒฐ์ ์ : ๊ฐ์ ์ ๋ ฅ์ ๋ํด ํญ์ ๊ฐ์ ์ถ๋ ฅ์ ๋ด์ผ ํ๋ค
- ์ถฉ๋ ์ต์ํ: ์๋ก ๋ค๋ฅธ ํค๊ฐ ๊ฐ์ ์ธ๋ฑ์ค๋ก ๋งคํ๋๋ ๊ฒ์ ์ต์ํํด์ผ ํ๋ค
์ผ๋ฐ์ ์ธ ํด์ํจ์ ์์:
- Division Method:ย
h(k) = k mod m - Multiplication Method:ย
h(k) = floor(m * (k*A mod 1)) - Universal Hashing
์ถฉ๋(Collision) ์ฒ๋ฆฌ
์๋ก ๋ค๋ฅธ ๋ ํค๊ฐ ๊ฐ์ ์ธ๋ฑ์ค๋ก ๋ณํ๋๋ ํ์์ ์ถฉ๋์ด๋ผ๊ณ ํ๋ค.
์ถฉ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ
1. ์ฒด์ด๋(Chaining)
- ๊ฐ์ ์ธ๋ฑ์ค์ ๋งคํ๋๋ ๋ชจ๋ ์์๋ฅผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด๋ค
- ๊ตฌํ์ด ๊ฐ๋จํ๊ณ ํ ์ด๋ธ์ด ๊ฐ๋ ์ฐจ๋ ์ฑ๋ฅ ์ ํ๊ฐ ์๋งํ๋ค
- ํ์ง๋ง ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค
2. ๊ฐ๋ฐฉ ์ฃผ์๋ฒ(Open Addressing)
- ์ถฉ๋ ๋ฐ์ ์ ๋ค๋ฅธ ๋น ์ฌ๋กฏ์ ์ฐพ์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด๋ค
- ์ ํ ํ์ฌ(Linear Probing), ์ด์ฐจ ํ์ฌ(Quadratic Probing), ์ด์ค ํด์ฑ(Double Hashing) ๋ฑ์ด ์๋ค
- ๋ฉ๋ชจ๋ฆฌ๋ ํจ์จ์ ์ด์ง๋ง ํด๋ฌ์คํฐ๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค
ํด์ฑ์ ์ฅ๋จ์
์ฅ์
- ๋น ๋ฅธ ์ ๊ทผ: ํ๊ท O(1) ์๊ฐ์ ์ฝ์ , ์ญ์ , ๊ฒ์์ด ๊ฐ๋ฅํ๋ค
- ์ ์ฐ์ฑ: ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ ํค๋ก ์ฌ์ฉํ ์ ์๋ค
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ: ํ์ํ ๋งํผ๋ง ๊ณต๊ฐ์ ์ฌ์ฉํ๋ค (์ฒด์ด๋์ ๊ฒฝ์ฐ)
๋จ์
- ์ต์ ์๊ฐ ๋ณต์ก๋: O(n) (๋ชจ๋ ํค๊ฐ ๊ฐ์ ์ธ๋ฑ์ค๋ก ํด์ฑ๋๋ ๊ฒฝ์ฐ)
- ์์ ๋ณด์ฅ ์์: ๋ฐ์ดํฐ๊ฐ ์ฝ์ ์์๋๋ก ์ ์ฅ๋์ง ์๋๋ค
- ํด์ํจ์ ์์กด์ฑ: ์ข์ง ์์ ํด์ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ๊ธ๊ฒฉํ ์ ํ๋๋ค
- ๊ณต๊ฐ ์ค๋ฒํค๋: ์ถฉ๋ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ถ๊ฐ ๊ณต๊ฐ์ด ํ์ํ๋ค
ํด์ฑ vs ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ
| ์๋ฃ๊ตฌ์กฐ | ํ๊ท ๊ฒ์ | ํ๊ท ์ฝ์ | ํ๊ท ์ญ์ | ๊ณต๊ฐ ๋ณต์ก๋ | | -------- | -------- | -------- | -------- | ------ | | ํด์ํ ์ด๋ธ | O(1) | O(1) | O(1) | O(n) | | ์ด์ง ํ์ ํธ๋ฆฌ | O(log n) | O(log n) | O(log n) | O(n) | | ๋ฐฐ์ด (์ ๋ ฌ๋) | O(log n) | O(n) | O(n) | O(n) | | ์ฐ๊ฒฐ๋ฆฌ์คํธ | O(n) | O(1) | O(n) | O(n) |
๊ฒฐ๋ก
ํด์ฑ์ย ๊ณต๊ฐ์ ์กฐ๊ธ ๋ ์ฌ์ฉํ๋ ๋์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ํญ ์ค์ด๋ย ํธ๋ ์ด๋์คํ๋ฅผ ์ ๊ณตํ๋ค. ์ข์ ํด์ํจ์์ ์ ์ ํ ์ถฉ๋ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ ํํ๋ค๋ฉด, ๋๋ถ๋ถ์ ์ค์ฉ์ ์ธ ์ํฉ์์ ๋งค์ฐ ํจ์จ์ ์ธ ์ฑ๋ฅ์ ์ป์ ์ ์๋ค.
ํนํ ๋ฐ์ดํฐ์ ๋น๋ฒํ ๊ฒ์, ์ฝ์ , ์ญ์ ๊ฐ ํ์ํ๊ณ ๋ฐ์ดํฐ์ ์์๊ฐ ์ค์ํ์ง ์์ ๊ฒฝ์ฐ์ ํด์ํ ์ด๋ธ์ด ์ต์ ์ ์ ํ์ด ๋ ์ ์๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ์ด์ง ํธ๋ฆฌ์ ๊ฐ์ ๊ฒ์๊ณผ ์ฝ์ , ์ญ์ ๊ฐ ์ ์ ํ ๋น ๋ฅธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋๊ฒ ํจ์ฌ ์ด๋์ด๋๊น ๋ง์ด๋ค.
%%
ํด์ฑ
CPU๊ฐ ์ฐ์ฐ์ ํ ๋ ๋ฉ๋ชจ๋ฆฌ(ํน์ ๋์คํฌ)์์ ์๋ฃ๋ฅผ ๊ฐ์ ธ์ ์ฐ์ฐ์ ํ๋ค.
x + y๋ฅผ ์ฐ์ฐํ ๋ x์ y์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ธ์จ๋ค.
์์ฆ ์ปดํจํฐ๋ ๊ฐ ํ๋ก์ธ์ค๋ง๋ค ๋ณ์์๊ฒ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ถ์ฌํ๊ณ ์ฌ์ฉํ๋๋ฐ (๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ํจ์จ์ฑ๊ณผ ๋ณด์์ ์ฅ์ ์ด ์๋ค๊ณ ํ๋ค.), ๊ทธ๋ฌ๋ฉด cpu๊ฐ ๊ฐ ๋ณ์๋ค์ ๊ฐ์ง๊ณ ์ฐ์ฐ์ ํ ๋ ๋ง๋ค ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐพ์์ผ ํ๋ค. ๊ทธ๋์ TLB(Translation Lookaside Buffer) ๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋๋ฐ, TLB์๋ ๊ฐ๋จํ ๋ณ์์ ๊ฐ์ ์ฃผ์์ ๊ทธ์ ๋ง๋ ๋ฌผ๋ฆฌ ์ฃผ์๊ฐ ์ ํ์๋ ํ ์ด๋ธ์ธ๋ฐ, TLB์์ ๋ฌผ๋ฆฌ ์ฃผ์๊ฐ ์์ผ๋ฉด ๊ตณ์ด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ฐพ์ ํ์ ์์ด ๋ฐ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ด TLB๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋งค์ฐ ๋น ๋ฅธ๋ฐ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ๋ ์ด์ ๋น์ทํ๊ณ ๊ธฐ์กด์ ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๋ค. ํด์ฑ์ ์ต์ ์ ๊ฒฝ์ฐ ๋ณต์ก๋๋ O(n) ์ด์ง๋ง **ํ๊ท ๋ณต์ก๋๋ O(1)**์ด๋ค.
'ํด์ฑ'์ด๋?
์ฃผ์ด์ง ๋ฌธ์์ด์์, ์ฒ์์ผ๋ก ๋ฐ๋ณต๋๋ ๊ธ์๋ฅผ ์ถ๋ ฅํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ณ ์ํด๋ณด์.
- ์ผ๋จ for๋ฌธ ์ค์ฒฉ์ ํตํด ๊ตฌํ ํ ์ ์์๊ฒ์ด๋ค. $O(n^2)$
- ๋ ๋์ ๋ฐฉ๋ฒ์ผ๋ก๋ ACII์ฝ๋ ๊ฐ์ ๋งํผ์ ๋ฐฐ์ด์ ๋ง๋ค๊ณ , ACSCII๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ทธ ๊ธ์๊ฐ ๋ฑ์ฅํ ๋ ๋ง๋ค ํด๋น ์ธ๋ฑ์ค์ ๊ฐ์ 1 ์ฌ๋ ค์ ์นด์ดํฐ๊ฐ 2๊ฐ ๋๋ ๊ธ์๋ฅผ ์ฐพ์ผ๋ฉด ๋ฐํํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ตฌํํ ์ ์๋ค. $O(n)$
๊ธ์์ ๊ฒฝ์ฐ ์ด์จ๋ ๊ฒฝ์ฐ์ ์๊ฐ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ ํ ์ด๋ธ์ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ์์ง๋ง, ๋ง์ฝ ์์ฐ์๋ฅผ ๊ฐ์ง๊ณ ๋๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ ค๋ฉด? ์์ฐ์์ ๊ฒฝ์ฐ์ฒ๋ผ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์ ์ฒด ์งํฉ U์ ํฌ๊ธฐ๊ฐ ์ค์ ์ฌ์ฉ๋๋ ์งํฉ K์ ํฌ๊ธฐ๋ณด๋ค ์๋ฑํ ํฐ ๊ฒฝ์ฐ์๋ ํด์ฑ์ด ์ฌ์ฉ๋๋ค.
ํด์ ํ ์ด๋ธ
ํด์ ํ ์ด๋ธ์ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์์ ์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด์๋ ๊ณณ์ด๋ค. ํค(์ธ๋ฑ์ค) ์ ๊ฐ(๋ฐ์ดํฐ) ์ ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฃผ ๋น ๋ฅด๊ฒ (ํ๊ท O(1) ๋ณต์ก๋)๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
ํด์ ํจ์
ํด์ฑ์์ ๊ฐ์ฅ ์ค์ํ ์์๋ก, ๋ฐ์ดํฐ๋ค์ ํด์ ํ ์ด๋ธ์ ์ธ๋ฑ์ค๋ก ์ ์ ํ ๋ณํ์ํค๋ ํจ์๋ค. (ํค๋ฅผ ์ธ๋ฑ์ค๋ก ๋ณํ)
์ค์ํ๊ฒ์ ํด์ฑ์ ๋ชฉ์ ์์ฒด๊ฐ ๋ฏธ๋ฆฌ ํ ์ด๋ธ์ ๋ง๋ค์ด๋์ด ๊ณต๊ฐ์ ๋ง์ด ์ฐจ์งํ๋ ๋์ , ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋ํ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ํค๋ฅผ ์ธ๋ฑ์ค๋ก ๋ณํํ๋ ๊ณผ์ ์ด ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋นจ๋ผ์ผ ํ๋ค๋ ์ ์ด๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ์ด์ง ํธ๋ฆฌ์ ๊ฐ์ ๊ฒ์๊ณผ ์ฝ์ ,์ญ์ ๊ฐ ์ ์ ํ ๋น ๋ฅธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋๊ฒ ํจ์ฌ ์ด๋์ด๋๊น ๋ง์ด๋ค.
์ถฉ๋
๊ทธ๋ฆฌ๊ณ ํจ์จ์ ์ธ ํด์ ํจ์๋ ์ถฉ๋์ ์ต์ํ ํด์ผํ๋ค. ์ถฉ๋์ด๋, ๋ค๋ฅธ ๋ ํค๊ฐ ๊ฐ์ ์ธ๋ฑ์ค๋ก ๋ณํ๋๋ ๊ฒ์ธ๋ฐ ๋ณดํต์ ์ด๋ด๋ ์ฒด์ด๋ ์ด๋ผ๊ณ ํด์, ๊ฐ์ ์ธ๋ฑ์ค์ ์ค๋ณต๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ๋ ํ๋ค. ์ ๋ง๋ค์ด์ง ํด์ํจ์๋ ์ถฉ๋์ด ์ ๊ฒ ๋ฐ์ํ๊ณ , ๊ทธ๋์ ๊ฐ์ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๊ฐ ์ค์ฒฉ๋์ด ์๋ค๊ณ ํด๋ ๊ทธ๋ ๊ฒ ๋ง์ ์๊ฐ์ด ์์๋์ง๋ ์๋๋ค.
%%