ํด์ ํ
์ด๋ธ(Hash Table)์ ํค๋ฅผ ํด์ ํจ์๋ฅผ ํตํด ์ ์ ์ธ๋ฑ์ค๋ก ๋ณํํ ๋ค ํด๋น ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ด ๊ณผ์ ์ ํตํด ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด์ฒ๋ผ ๋น ๋ฅธ ์ ๊ทผ ์๋๋ฅผ ์ป์ ์ ์๋ค.
Map: ํค-๊ฐ ์(key โ value) ์ ์ฅ
Set: ๊ฐ์ ์กด์ฌ ใ
์ฌ๋ถ๋ง ์ ์ฅ (์ค๋ณต ํ์ฉ X)
๋ ์๋ฃ๊ตฌ์กฐ ๋ชจ๋ ๋ด๋ถ์ ์ผ๋ก ํด์ ํ
์ด๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ ํ์/์ฝ์
/์ญ์ ๋ชจ๋ ํ๊ท ์ ์ผ๋ก O(1)์ ์ฑ๋ฅ์ ๊ธฐ๋ํ ์ ์๋ค.
ํด์ ํ
์ด๋ธ์ ํต์ฌ์ ์๋ ์ธ ๊ฐ์ง ์์์ด๋ค.
์
๋ ฅ๊ฐ(key)์ ๋ฐ์ ๊ณ ์ ๋ ์ ์๋ก ๋ณํํ๋ ํจ์๋ก ๋์ผํ ํค๋ ํญ์ ๋์ผํ ํด์๊ฐ์ ๋ฐํํด์ผ ํ๋ค. ๋ํ ์๋ก ๋ค๋ฅธ ํค๋ ๊ฐ์ ํด์๊ฐ์ด ๋์ฌ ์ ์์ผ๋ฏ๋ก ๊ท ๋ฑ ๋ถํฌ๊ฐ ์ค์ํ๋ค.
ํด์ ํจ์๋ ํค๋ฅผ ์ ์๋ก ๋ฐ๊พธ๋ ์ผ๋ง ํ๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ํด์๊ฐ์ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ก ๋ณํํ๋ ๊ฒ์ด ๋ฒํท ์ธ๋ฑ์ฑ์ด๋ค.
index = hash(key) % capacity
ํด์ ํจ์๋ก ๋์จ ์ ์๊ฐ์ ์ ์ฒด ๋ฒํท ์๋ก ๋๋จธ์ง๋ฅผ ๊ตฌํด ์ธ๋ฑ์ค๋ฅผ ๊ฒฐ์ ํ๋ค. ๋๋จธ์ง ์ฐ์ฐ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฐฐ์ด์ ๊ฒฝ์ฐ ๊ณ ์ ๋ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ํด์๊ฐ์ด ์๋ฌด๋ฆฌ ์ปค๋ ๋ฐฐ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๋๋ก ํ๊ธฐ ์ํจ์ด๋ค.
ํด์ ํจ์๋ ๋ค์ํ ํค๋ฅผ ํ์ ๋ ์ธ๋ฑ์ค ๊ณต๊ฐ์ ๋ฐฐ์ด์ ๋งคํํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ ๋ค๋ฅธ ํค์์๋ ๋ถ๊ตฌํ๊ณ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋๋ฐ ์ด๋ฅผ ์ถฉ๋(Collision)์ด๋ผ๊ณ ํ๋ค.
"dog" -> hash = 42 -> index = 42 % 16 = 10
"god" -> hash = 58 -> index = 58 % 16 = 10 (์ถฉ๋)
์ถฉ๋์ด ํด๊ฒฐ๋์ง ์์ผ๋ฉด ๊ธฐ์กด ๊ฐ์ ๋ฎ์ด์ฐ๊ฒ ๋์ด ๋ฐ์ดํฐ ์์ค์ด ์ผ์ด๋๊ณ ์ฝ์
/ํ์/์ญ์ ๊ฐ ์คํจํ๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ถฉ๋์ ์ด๋ป๊ฒ ๋ค๋ฃจ๋๋์ ๋ฐ๋ผ ํด์ ํ
์ด๋ธ์ ์ฑ๋ฅ์ด ๊ฒฐ์ ๋๋ค.
[๋ํ์ ์ธ ์ถฉ๋ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ]
1) ์ฒด์ด๋ (Chaining, ๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ)
๊ฐ์ ์ธ๋ฑ์ค์ ๋ค์ด์จ ํค๋ค์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(ํน์ ํธ๋ฆฌ)๋ก ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐฐ์ด์ ๊ฐ ์นธ์ด ๋
ธ๋์ ์ฒด์ธ์ ๊ฐ์ง๋ค.
bucket[10] -> [("dog", var1)] -> [("god", var2)] -> ...
์ฅ์ : ๊ตฌํ์ด ๊ฐ๋จํ๋ฉฐ ์ญ์ ๊ฐ ์ฝ๊ณ *๋ก๋ ํฉํฐ๊ฐ 1์ ๋์ด๋ ๋์์ด ๊ฐ๋ฅํ๋ค.
๋ก๋ ํฉํฐ(Load Factor)๋?
ํด์ ํ ์ด๋ธ์ด ์ผ๋ง๋ ์ฐจ์๋์ง๋ฅผ ๋ํ๋ด๋ ๋น์จ
๊ณต์) ๋ก๋ ํฉํฐ ฮฑ = ์ ์ฅ๋ ์์ ์ / ์ ์ฒด ๋ฒํท ์
๋จ์ : ๊ฐ ๋ฒํท์ด ํฌ์ธํฐ๋ฅผ ๊ฐ๊ฒ ๋์ด ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ์์น๊ฐ ์ฐ์์ ์ด์ง ์์ ์บ์์ ์นํ์ ์ด์ง ์๋ค.
Java์ HashMap์ ์ด ์ฒด์ด๋ ๋ฐฉ์์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ ์ฒด์ธ ๊ธธ์ด๊ฐ ๋๋ฌด ๊ธธ์ด์ง๋ฉด Red-Black Tree๋ก ์๋ ์ ํํ์ฌ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ง๋๋ค.
2) ์คํ ์ด๋๋ ์ฑ (Open Addressing, ๊ฐ๋ฐฉ ์ฃผ์๋ฒ)
์ถฉ๋์ด ๋ฐ์ํ๋ฉด ํ
์ด๋ธ ๋ด์์ ๋ค์ ๋น ์๋ฆฌ๋ฅผ ์ฐพ์์ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ๋ฐฐ์ด ์์ฒด ์์์ ๋ชจ๋ ๊ฐ์ ์ ์ฅํ๊ฒ ๋๋ค.
bucket[10] -> ์ด๋ฏธ ์ฌ์ฉ์ค ->
bucket[11] ํ์ธ -> ๋น์ด์์ -> ์ ์ฅ
์ฅ์ : ๋ฐฐ์ด๋ง์ผ๋ก ๋์ํ๋ฏ๋ก ํฌ์ธํฐ๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ฐ์ ๋ณ๋ ๊ตฌ์กฐ์ฒด๊ฐ ํ์ํ์ง ์์ผ๋ฉฐ ์บ์ ์นํ์ ์ด๋ค.
๋จ์ : ์ญ์ ์ ๊ฐ์ ๋จ์ํ ์ ๊ฑฐํ๋ฉด ํ์ ๊ฒฝ๋ก๊ฐ ๋๊ฒจ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๊ณ ๊ณต๊ฐ์ด ์ ์ ์ฑ์์ง์๋ก ๋น ์๋ฆฌ๋ฅผ ์ฐพ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฏ๋ก ๋ก๋ ํฉํฐ๊ฐ ๋ฎ์์ผ ์ฑ๋ฅ์ด ์ ์ง๋๋ค.
๋ก๋ ํฉํฐ๊ฐ ์ค์ ํ ์๊ณ์น๋ฅผ ์ด๊ณผํ๋ฉด ํด์ ํ
์ด๋ธ์ ์์ฒด์ ์ผ๋ก ํฌ๊ธฐ๋ฅผ 2๋ฐฐ๋ก ๋๋ฆฌ๊ณ ๋ชจ๋ ๊ฐ์ ๋ค์ ํด์ฑ(rehash)ํ๊ฒ ๋๋ค. ์ด ๊ณผ์ ์ ๋ฆฌ์ฌ์ด์ฆ(resize) ๋๋ ๋ฆฌํด์(rehash) ๋ผ๊ณ ํ๋ค. ๋ฐ๋ผ์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ๊ฒ์ด ์์๋๋ ๊ฒฝ์ฐ ์ด๊ธฐ ์ฉ๋์ ๋ฏธ๋ฆฌ ์ถฉ๋ถํ ์ค์ ํ๋ ๊ฒ์ด ์ข๋ค.
