ํด์ํ ์ด๋ธ(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) |
๊ฒฐ๋ก
ํด์ฑ์ย ๊ณต๊ฐ์ ์กฐ๊ธ ๋ ์ฌ์ฉํ๋ ๋์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ํญ ์ค์ด๋ย ํธ๋ ์ด๋์คํ๋ฅผ ์ ๊ณตํ๋ค. ์ข์ ํด์ํจ์์ ์ ์ ํ ์ถฉ๋ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ ํํ๋ค๋ฉด, ๋๋ถ๋ถ์ ์ค์ฉ์ ์ธ ์ํฉ์์ ๋งค์ฐ ํจ์จ์ ์ธ ์ฑ๋ฅ์ ์ป์ ์ ์๋ค.
ํนํ ๋ฐ์ดํฐ์ ๋น๋ฒํ ๊ฒ์, ์ฝ์ , ์ญ์ ๊ฐ ํ์ํ๊ณ ๋ฐ์ดํฐ์ ์์๊ฐ ์ค์ํ์ง ์์ ๊ฒฝ์ฐ์ ํด์ํ ์ด๋ธ์ด ์ต์ ์ ์ ํ์ด ๋ ์ ์๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ์ด์ง ํธ๋ฆฌ์ ๊ฐ์ ๊ฒ์๊ณผ ์ฝ์ , ์ญ์ ๊ฐ ์ ์ ํ ๋น ๋ฅธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋๊ฒ ํจ์ฌ ์ด๋์ด๋๊น ๋ง์ด๋ค.