HashTable
๊ฐ์ฅ ์์ฃผ ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ์ธ HashMap์ ๋ํด ๋ ๊น์ด ์ดํดํ๊ธฐ ์ํด ์์ฑํฉ๋๋ค.
HashTable, HashMap์ ๋ํด
- HashTable์ Dictionary, HashMap์ AbstractMap์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
- Dictionary์ AbstractMap์ ์ธํฐํ์ด์ค๋ ๋์ผํ๋ Java8 document์์ Map์ ์ฌ์ฉํ๊ธฐ๋ฅผ ๊ถํ๊ณ ์์ต๋๋ค.
Dictionary Document
NOTE: This class is obsolete. New implementations should implement the Map interface, rather than extending this class.
HashMap์ ๋ํด
- Key๊ฐ์ Hash Function์ ํตํด HashCode๋ฅผ ์ป์ด ํด๋น Bucket์ Value๋ฅผ ์ ์ฅํ๋ ํํ์ ๋๋ค.
Hash Function
์์์ ๊ธธ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ๋ ๊ธธ์ด์ ๋ฐ์ดํฐ๋ก ๋งคํํ๋ ํจ์์ ๋๋ค.
๋๋๋ ๋ฐฉ๋ฒ
- hash(key) = key % size
- bucket size์ ํฌ๊ธฐ๋ฅผ ์ ํ ๋
2์ ์ง์์น ๊ฐ์ ๊ทผ์ ํ์ง ์๋ ์์
๋ฅผ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- bucket size์ ํฌ๊ธฐ๋ฅผ ์ ํ ๋
- size๊ฐ ํฌ๋ฉด ํด์๋ก ์ถฉ๋ํ๋ ํ๋ฅ ์ด ๋ฎ์์ง๋๋ค.
๊ณฑํ๊ธฐ ๋ฐฉ๋ฒ
- hash(key) = [size * (key*A % 1)] :: 0 < A < 1
- key * A๋ฅผ ํตํด ์์๋ถ๋ถ์ ์ถ์ถํฉ๋๋ค.
- size๋ฅผ ๊ณฑํ ํ์ ๋ด๋ฆผ ์ฐ์ฐ์ ํฉ๋๋ค.
- ๊ณฑํ๊ธฐ์ ์ฅ์ ์ size๊ฐ์ด ๊ทธ๋ ๊ฒ ์ค์ํ์ง ์์ต๋๋ค.
- ๋๋๋ ๋ฐฉ๋ฒ๋ณด๋ค๋ ๋ค์ ๋๋ฆฝ๋๋ค.
Universe Hashing
- ๋ค์์ ํด์ํจ์๋ฅผ ๋ง๋ค๊ณ , ์ด ํด์ํจ์์ ์งํฉ H์์ ๋ฌด์์๋ก ํด์ํจ์๋ฅผ ์ ํํด ํด์๊ฐ์ ๋ง๋๋ ๊ธฐ๋ฒ์ ๋๋ค.
- ์ํธํ์์ ์ ์ผํ ์๋ณ์๋ก ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค.
์ต์์ ์ ํ์ Hashing์ด ๋ ์๋ฃ์ ํน์ฑ์ ์ดํดํ๋ ๊ฒ์ ๋๋ค.
Direct-Address Tables
- ํค์ ์ ์ฒด ๊ฐ์์ ๋์ผํ ํฌ๊ธฐ์ ๋ฒํท์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋ฌธ์ ์ ์ ์์๊น์?
- ํ์ฌ ์ฌ์ฉํ์ง ์๋ Key์ ๋ํด์ ๋ฏธ๋ฆฌ Memory๋ฅผ ํ ๋น๋ฐ์ ์ฌ์ฉํ๊ณ ์๋ ๋จ์ ์ด ์์ต๋๋ค.
- HashMap ํฌ๊ธฐ(size)๋ ์ค์ ์ฌ์ฉํ๋ ํค ๊ฐ์(key)๋ณด๋ค ์ ๊ฒ ์ค์ ํฉ๋๋ค.
- load factor(ฮฑ) : key/size
- ํด์ํ ์ด๋ธ์ ํ ๋ฒํท์ ํ๊ท ๋ช ๊ฐ์ ํค๊ฐ ๋งคํ๋๋๊ฐ๋ฅผ ๋ํ๋ด๋ ์งํ์ ๋๋ค.
- load factor > 1 ์ธ ๊ฒฝ์ฐ์๋ Hash Collision์ด ๋ฐ์ํฉ๋๋ค.
Java8์ HashMap Load Factor
์ถฉ๋์ ํด๊ฒฐํ๊ธฐ ์ํด์๋?
Dynamic resizing
- Bucket Size๋ฅผ ๋จ์ํ 2๋ฐฐ๋ก ๋๋ฆฐ ํ Key๊ฐ์ ์ฌ๋ฐฐ์ดํฉ๋๋ค.
Open-Addressing
- Open Addressing์ ์ฐ์๋ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ Separate Chaining์ ๋นํ์ฌ ์บ์ ํจ์จ์ด ๋์ต๋๋ค.
- ๋ฐ์ดํฐ ๊ฐ์๊ฐ ์ถฉ๋ถํ ์ ๋ค๋ฉด Open Addressing์ด Separate Chaining๋ณด๋ค ๋ ์ฑ๋ฅ์ด ์ข์ต๋๋ค.
Linear Probing
- ์ถฉ๋์ด ๋ฐ์ํ ๊ฒฝ์ฐ์ ์ผ์ Offset ๊ฐ๊ฒฉ์ผ๋ก Bucket์ผ๋ก ์ ๊ทผํ์ฌ Search, Insert๋ฅผ ์งํํฉ๋๋ค.
- ๊ตฌํ์ ๋งค์ฐ ์ฌ์ด ์ฅ์ ์ด ์์ต๋๋ค.
- Value๊ฐ ํน์ Area๋ก ๋ชจ์ด๊ฒ ๋๋ Clustering์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ํ๊ท ๊ฒ์ ์๊ฐ์ ์ ์ ์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค.
Quadratic Probing
- Linear Probing์ ํด๊ฒฐํ๊ธฐ ์ํด 2์ฐจ์๊ณผ ๊ด๋ จ๋ Offset์ผ๋ก ์ ๊ทผํฉ๋๋ค.
- Linear Probing๋ณด๋ค ๊ฐ๋ฒผ์ด Clustering์ด ๋ฐ์ํฉ๋๋ค.
- ์ด๊ธฐ Hashing๊ฐ์ด ๋์ผํ ๊ฒฝ์ฐ์๋ ์ถฉ๋์ด ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Double Hashing
- ์ด๊ธฐ Hashing๊ฐ๊ณผ Offset์ ์ป๋ Hashing์ ๋ฐ๋ก ๋๋ ๋ฐฉ์์
๋๋ค.
- Cluserting ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
Seperate Chaining With LinkedList
- ์ถฉ๋์ด ๋ฐ์ํ๊ฒ ๋๋ฉด LinkedList๋ก ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๊ฐ์ ์ ์ฅํฉ๋๋ค.
- LinkedList์ ํน์ฑ์ ์ต์ ์ ๊ฒฝ์ฐ O(N)์ด๊ธฐ ๋๋ฌธ์ Red-Black Tree์ ๊ฐ์ ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
Reference
- https://ratsgo.github.io/data%20structure&algorithm/2017/10/25/hash/
- https://d2.naver.com/helloworld/831311
- https://www.codingeek.com/data-structure/complete-guide-open-addressing-classification-eliminate-collisions/
- http://docs.likejazz.com/hash-table-implementations/#separate-chainingwith-linked-lists