key
์ ๋ํ hash
๊ฐ์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ์ฌ key-value
์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์กฐํํ๋ฉฐ, key-value ์์ ๋ฐ์ดํฐ์ ๊ฐ์์ ๋ฐ๋ผ ๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
hash table์ array
๋ก ์ด๋ฃจ์ด์ ธ์๊ณ array ๊ฐ๊ฐ์ ์ฃผ์๋ฅผ bucket
์ด๋ผ ๋ถ๋ฅธ๋ค.
hash function ์ key-value์ key๊ฐ์ array์ index๋ก ๋งคํ
์ํค๋ ํจ์์ด๋ค.
ํด์ ํจ์๋ ์์ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ํฌ๊ธฐ์ ๊ฐ์ผ๋ก ๋งคํํ๋๋ฐ ์ฌ์ฉ๋๋ ํจ์์ด๋ค.
- hash function๋ก hash table์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ array์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์์น(index)๋ฅผ ๊ตฌํ ์ ์๋ค.
- index๋ฅผ ๊ตฌํ ๋, ๋ณดํต
mod
์ฐ์ฐ์ ์ฌ์ฉํ๋ค. - hash function์ ํตํด index๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์
hashing
์ด๋ผ๊ณ ํ๋ค.
- index๋ฅผ ๊ตฌํ ๋, ๋ณดํต
1/m ํ๋ฅ ์ ํด์ ์ถฉ๋ (hash table์ ํฌ๊ธฐ: m)
hash function์ ํํ๋ฒ์๋ฅผ m์ผ๋ก ์ขํ์ผ๋ก์จ ์๋ก ๋ค๋ฅธ hashCode๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด๊ฐ 1/m ์ ํ๋ฅ ๋ก ๋์ผํ ํด์ ๋ฒํท ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง ์ ์๋ ํด์ ์ถฉ๋(hash collision) ์ด ๋ฐ์ํ๋ค. ํด์ ์ถฉ๋์ hash function์ ์๋ฌด๋ฆฌ ์ ๊ตฌํํ์ฌ๋ ์๊ด์์ด ๋ฐ์ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ค๋ hash bucket์ด ์ด๋ฏธ ์ฌ์ฉ์ค์ด๋ผ๋ฉด ๋น์ด์๋ bucket์ ์ฐพ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ์์ด๋ค.
- Worst Case์ ๊ฒฝ์ฐ ๋น์ด์๋ bucket์ ์ฐพ์ง ๋ชปํ๊ณ ํ์์ ์์ํ ์์น๋ก ๋๋์์ฌ ์ ์๋ค.
- ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ bucket์ด ๋ชจ์ฌ์์ผ๋ฉด Worse Case ๋ฐ์ ๋น๋๊ฐ ๋์์ง๋ค.
- ๋น์ด์๋ bucket์ ํ์ํ๋ ๋ฐฉ์์๋ Linear Probing, Quadratic Probing, Double Hashing ์ด ์๋ค.
- Linear Probing(์ ํ ํ์)
- ํด์ ์ถฉ๋์ด ๋ฐ์ํ ํ์ฌ bucket index๋ถํฐ ๊ณ ์ ํญ
n
๋งํผ ์ด๋ํ๋ฉด์ ๋น์ด์๋ bucket์ ์ฐพ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค. Primary Clustering
๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.- ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ filled bucket๋ค์ด ๋ชจ์ฌ์๋ค๋ฉด ๋น์ด์๋ bucket์ ์ฐพ๊ธฐ ๊น์ง์ ํ์ ์๊ฐ์ด ๋์ด๋๋ค. Primary Cluster๊ฐ ํ์ฑ๋๋ฉด ๋น ๋ฅด๊ฒ ์ปค์ง๊ณ ๊ฒฐ๊ตญ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ๊ธฐํ๋ค.
- ํด์ ์ถฉ๋์ด ๋ฐ์ํ ํ์ฌ bucket index๋ถํฐ ๊ณ ์ ํญ
- Quadratic Probing(์ ๊ณฑ ํ์)
- ํด์ ์ถฉ๋์ด ๋ฐ์ํ ํ์ฌ bucket index๋ถํฐ
n^2
๋งํผ ์ด๋ํ๋ฉด์ ๋น์ด์๋ bucket์ ์ฐพ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก Linear Probing ๋ฐฉ์์ Primary Clustering ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค. Secondary Clustering
๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.n^2
๊ฐ๊ฒฉ์ผ๋ก filled bucket์ด ์กด์ฌํ์ฌ key์ hash๊ฐ(index) ๋ณด๋ค ํจ์ฌ ๋จ์ด์ง ๊ณณ์ ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋๋ ํ์์ด๋ค. ์ด๋ filled bucket ๊ตฐ์ง์ ํฌ๊ฒ๋ง๋ค์ง ์๊ธฐ ๋๋ฌธ์ Primary Clustering ๋ณด๋ค ๋ ์ฌ๊ฐํ ๋ฌธ์ ์ด๋ค.
- ํด์ ์ถฉ๋์ด ๋ฐ์ํ ํ์ฌ bucket index๋ถํฐ
- Double Hashing(์ด์ค ํด์ฑ)
- hash๊ฐ์ ๋ค๋ฅธ hash function์ผ๋ก ํ๋ฒ ๋ ํด์ฑํ์ฌ hash์ ๊ท์น์ฑ์ ์์ ๋ ๋ฐฉ์์ผ๋ก Secondary Clustering ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค.
- Linear Probing(์ ํ ํ์)
- ํ์
- target ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ฑฐ๋ empty bucket์ ๋๋ฌํ๊ธฐ ์ ๊น์ง ํ์(probing)์ ์งํํ๋ค. target ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์ ์์ empty bucket์ ๋๋ฌํ๋ฉด ํ์(probing)์ ์ข ๋ฃํ๋ ๋ฌธ์ ์ ์ด ์๋ค.
- ์ญ์
- ์ค๊ฐ ์์๋ฅผ ์ญ์ ํ๊ฒ ๋๋ฉด ํ์ ์ค empty bucket์ ๋ง๋ ํ์์ ์ข ๋ฃํ๊ฒ ๋์ด ์ํ๋ ์์๋ฅผ ํ์ํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ์ญ์ ํ ๋ฐ์ดํฐ์ bucket์ dummy node ๋ฅผ ๋ฃ๊ฑฐ๋ flag (Occupied, Empty, Deleted) ๋ฅผ ํ์ฉํ์ฌ ํ์์ด ์ฌ๋ฐ๋ฅด๊ฒ ์งํ๋๋๋ก ํ ์ ์๋ค.
๊ฐ๊ฐ์ hash bucket์ LinkedList๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก ๊ตฌ์ฑํ์ฌ ํด์ ์ถฉ๋์ ํด๋น bucket์ LinkedList์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด๋ค.
-
์ผ๋ฐ์ ์ผ๋ก Seperate Chaining ๋ฐฉ์์ Open Addressing ๋ฐฉ์๋ณด๋ค ๋น ๋ฅด๋ค.
- Open Addressing์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ bucket์ด ๋ชจ์ฌ์์ผ๋ฉด Worst Case ๋ฐ์ ๋น๋๊ฐ ๋์์ง๋ค
- Seperate Chaining์ ํด์ ์ถ๋์ ํผํ๋๋ก ๋ณด์กฐ ํด์ ํจ์๋ฅผ ์กฐ์ ํ๋ฉด Worse Case์ ๊ฐ๊น์์ง๋ ๋น๋๋ฅผ ์ค์ผ ์ ์๋ค.
-
Java 7์์ HashMap์ Seperate Chaining ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด์๋ค.
-
Seperate Chaining ๋ฐฉ์์ ๋ณด์กฐ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํด์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ค์ธ๋ค.
-
Red Black Tree๋ก ๊ตฌํํ Separate Chaining
-
ํ๋์ hash bucket์ ํด๋นํ๋ LinkedList์ ๋ฐ์ดํฐ ๊ฐ์๊ฐ 8๊ฐ๊ฐ ๋๋ฉด ๊ตฌ์กฐ๋ฅผ LinkedList -> Red-Black Tree ๋ก ๋ณํํ๋ค. LinkedList ํ์ ์ฑ๋ฅ์ Worst Case๋ O(N) ์ด์ง๋ง Red-Black Tree์ ๊ฒฝ์ฐ O(logN)์ด๊ธฐ ๋๋ฌธ์ด๋ค.
-
ํ๋์ hash bucket์ ํ ๋น๋ ๋ฐ์ดํฐ ๊ฐ์๊ฐ 6๊ฐ์ด๋ฉด ๊ตฌ์กฐ๋ฅผ Red-Black Tree -> LinkedList๋ก ๋ณํํ๋ค. ๋ฐ์ดํฐ ๊ฐ์๊ฐ ์ ์ผ๋ฉด Red-Black Tree์ LinkedList๊ฐ์ ํ์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๊ฑฐ์ ์๊ณ , Red-Black Tree๋ LinkedList๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ง๊ธฐ ๋๋ฌธ์ด๋ค.
-
๋ณํ ๊ธฐ์ค์ 6๊ฐ, 8๊ฐ ์ฒ๋ผ 2๊ฐ๋ผ๋ ์ฌ์ ๋ฅผ ๋์ด ๊ณผ๋ํ ๊ตฌ์กฐ ๋ณํ์ ๋ง์ ์ ์๋ค. ๋ง์ฝ ๋ณํ ๊ธฐ์ค์ด 6๊ฐ , 7๊ฐ ์ด๋ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์ฝ์ , ์ญ์ ๋๋ ๊ฒฝ์ฐ ๋ถํ์ํ LinkedList โ Tree ๋ณํ์ด ์ผ์ด๋ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
-
Open Addressing | Seperate Chaining | |
---|---|---|
Worst Case | O(M) | O(M) |
์บ์ ํจ์จ | ์ข๋ค (์ฐ์๋ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค) | Open Addressing ๋ณด๋ค ์ข์ง ์๋ค (ํด์ ์ถฉ๋์ LinkedList์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค) |
๊ณต๊ฐ ํจ์จ | ์ข๋ค (ํด์ ์ถฉ๋์ด ๋ฐ์ํ ๊ฒฝ์ฐ์๋ probing์ ํตํด ๋น bucket์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ด๋ค) | Open Addressing ๋ณด๋ค ์ข์ง ์๋ค (ํด์ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด LinkedList์ ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ๋์ง ์๋ bucket์ด ์กด์ฌํ๋ค) |
Resizing ๋น๋ | ๋๋ค (bucket ์ฌ์ฉ๋ฅ ์ด ๋์ load factor์ ์๊ณ์ ์ ์ฝ๊ฒ ๋๋ฌํ๊ธฐ ๋๋ฌธ์ด๋ค) | Open Addressing ๋ณด๋ค ๋ฎ๋ค (bucket ์ฌ์ฉ๋ฅ ์ด ๋ฎ๊ธฐ ๋๋ฌธ์ด๋ค) |
hash bucket์ ๊ฐ์๊ฐ ์ ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์๋ ์ ์์ง๋ง ํด์ ์ถฉ๋๋ก ์ธํด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์๋ฐ์ HashMap์ load factor
๊ฐ ์๊ณ์ (0.75)
์ ๋์ด๊ฐ ๊ฒฝ์ฐ์ hash bucket ๊ฐ์๋ฅผ 2๋ฐฐ๋ก ๋๋ฆฐ๋ค.