์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- .net
- React
- ์์
- minimalAPI
- lazy loading
- scanner
- ๋ผ๋๋ฌด์คdvd
- JSON
- ์ฝ๋ํ๋ก๊ทธ๋๋จธ์ค
- Request
- ์ค๋ ์์ฐ์
- extraParams
- LINQ
- vscode
- c#
- Store
- ๋์ ๋ณธ์์์
- ViewModel
- ORM
- extjs
- dbContext
- ์์ค๊ฐ๋ ์ค๋
- mac
- ๋ช ์์ ์ธ๋ํค
- JavaScript
- intellij
- Config
- EFCore
- c#์ฝ๋ฉ์๊ธฐ์ ์ค์ ํธ
- error
- Today
- Total
ejyoo's ๊ฐ๋ฐ ๋ ธํธ
ํด์(Hash) ์๊ณ ๋ฆฌ์ฆ ๋ณธ๋ฌธ
๐์ค๋ ์์ ๋์ค ํด์ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ๋ค์๋๋ฐ.
์ ๋ณด๋ฅผ ์กฐ๊ธ ๋ ์ฐพ์๋ณด๊ธฐ๋ก ํ๋ค.
๋ณธ ๊ธ์ ํ ๋ธ๋ก๊ทธ์์ ๋ฐ์ทํ ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ๋์์ผ๋ฉฐ, ์์ฑ์๊ฐ ์์ ์ ๋ค์ ๋ด์ฉ๋ ์กฐ๊ธ ์ถ๊ฐ๊ฐ ๋์ด์๋ค.
๊ตฌ๊ธ ๊ฒ์ ๊ธฐ์ค ์์ 5๊ฐ๋ฅผ ์ฐธ๊ณ ํ์๊ณ .
๊ทธ์ค ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ๋ ๋ธ๋ก๊ทธ๋ ์๋ ๋ธ๋ก๊ทธ์ด๋ค.(๋๊ณ ๋๊ณ ๋ณผ ์์ ์ด๋ค.)
hyeonstorage.tistory.com/265?category=578561
[์๋ฃ๊ตฌ์กฐ] Java ํด์ฌ(Hash) ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ๊ตฌ์กฐ (๋ถ๋ฆฌ์ฐ๊ฒฐ๋ฒ)
Java ํด์ฌ(Hash) ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ๊ตฌ์กฐ 1. ํด์ฌ(Hash)์ ๊ฐ์ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ , ๊ฒ์, ์ญ์ ํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ช๊ฐ์ง ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด์๋ค. ๋ฆฌ์คํธ, ์คํ, ํ ๋ฑ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์ด๋ก ๊ตฌํํ๊ฑฐ๋ ์ฐ
hyeonstorage.tistory.com
๐ก ํด์์ ๋ฑ์ฅ๋ฐฐ๊ฒฝ
ํด์์ ๋ฑ์ฅ๋ฐฐ๊ฒฝ์ ๋ฐฐ์ด๊ณผ ๋ฆฌ์คํธ๋ก ์ธํจ์ด์๋ค.
๋ฐฐ์ด์ ๋ด๋ถ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ฌ ์๋ฃ์ ๊ฒ์์ด ํ๋ฒ์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ ๊ฒ์ ์๋๋ฅผ ๋ณด์ด๋ ๋ฐ๋ฉด
๋ฐ์ดํฐ์ ์ฝ์ , ์ญ์ ์ ๋ง์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ฆฌ๊ฑฐ๋ ๋น์๋ฆฌ๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ์ด๋ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ง์ ์๊ฐ์ด ์์๋๋ค.
๋ฐ๋ฉด์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ฝ์ , ์ญ์ ์ ์ธ๊ทผ ๋ ธ๋๋ค์ ์ฐธ์กฐ ๊ฐ๋ง ์์ ํด ์ค์ผ๋ก์จ ๋น ๋ฅธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ์๋ค.
๋จ ์ฒ์ ๋ ธ๋ ๋ง์ง๋ง ๋ ธ๋ ์ด์ธ์ ์์น์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ , ์ญ์ ํ ๊ฒฝ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ๊ฒฝ์ฐ๋ค๋ ํด๋น ๋ ธ๋๋ฅผ ์ฐพ๊ธฐ ์ํ์ฌ ์ฒ์๋ถํฐ ์ํ ๊ฒ์์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ์๊ฐ ๋ง์์ง์๋ก ํจ์จ์ด ๋จ์ด์ง ์ ๋ฐ์ ์๋ ๊ตฌ์กฐ๋ค.
์ด๋ฌํ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํ์ฌ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ํด์ฌ(Hash)์ด๋ค.
๐ก ํด์(Hash)๋ ?
ํด์๋ ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ ๊ฒ์ ์๋๋ฅผ ๊ฐ์ง๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ์ ์ฝ์ ๊ณผ ์ญ์ ์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ด๋ด๊ฑฐ๋ ์ฑ์ฐ๋ ์์ ์ด ํ์ ์๋๋ก ํน๋ณํ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ์ ์ฐ๊ด๋ ๊ณ ์ ํ ์ซ์๋ฅผ ๋ง๋ค์ด ๋ธ ๋ค ์ด๋ฅผ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๋ค.
ํน์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์ธ๋ฑ์ค๋ฅผ ๊ทธ ๋ฐ์ดํฐ๋ง์ ๊ณ ์ ํ ์์น์ด๊ธฐ ๋๋ฌธ์ ์ฝ์ ์ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ์ฌ์ด์ ๋ผ์ด๋ค๊ฑฐ๋ ์ญ์ ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ก ์ฑ์ธ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ฝ์ ๊ณผ ์ญ์ ์ ๋ฐ์ดํฐ์ ์ด๋์ด ์๋๋ก ๋ง๋ค์ด์ง ๊ตฌ์กฐ์ด๋ค.
ํด์๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฐ์ด์ Hash Table์ด๋ผ๊ณ ํ๋ฉฐ ๊ทธ ํฌ๊ธฐ์ ๋ฐ๋ผ์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๋ง์ด ๋ ์ ์๋ค.
- ํด์๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ๋ฒ ์ค ํ๋์ด๋ค.
- ํด์๋ ๊ฒ์๊ณผ ์ ์ฅ์์ ์์ฃผ ์ฐ์ํ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
- ํด์์ ํต์ฌ์ KEY, VALUE๋ฅผ ํจ๊ป ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
- KEY์ VALUE ๊ฐ ํ ์์ผ๋ก ์กด์ฌํ๋ค. = Hash Table์ด๋ผ๊ณ ํจ.
- ๋ฐฐ์ด์ ์ธ๋ฑ์ค์ ๋ค๋ฅด๊ฒ ์์ฐจ์ ์ผ๋ก ์ ์ฅ๋๋ ๊ฒ์ด ์๋, ์ ์์ญ์ ๊ณ ๋ฅด๊ฒ ๋ถํฌ๋์ด ์ ์ฅ๋๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค. (๐ค ๋ฐฐ์ด๋ณด๋ค ๋น ๋ฅด๊ฒ ๊ฐ์ ์ฐพ์ ์ ์๋ค. )
- ์ฐ๊ด ๋ฐฐ์ด ๊ตฌ์กฐ : Key์ Value๊ฐ 1:1๋ก ์ฐ๊ด๋์ด ์๋ ์๋ฃ๊ตฌ์กฐ. Key๋ฅผ ์ด์ฉํด Value๋ฅผ ์์๋ผ ์ ์๋ค.
๐ก ํด์ ๋ฉ์๋
ํด์๋ HashTable์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
์ด๋ ํน๋ณํ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ๊ณ ์ ํ ์ซ์๊ฐ์ ๋ง๋ค์ด ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๋๋ฐ
์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ๋ฉ์๋๋ฅผ Hash Method ๋ผ๊ณ ํ๋ฉฐ
Hash Method์ ์ํด ๋ฐํ๋ ๋ฐ์ดํฐ ๊ณ ์ ์ ์ซ์ ๊ฐ์ hash Code๋ผ๊ณ ํ๋ค.
Java์์๋ Object ํด๋์ค์ hashCode() ๋ผ๋ ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ ๊ฐ์ฒด์ Hash Code๋ฅผ ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
๐ก ํด์ ๋ฉ์๋ Java Object ํด๋์ค ์ ๋ฆฌ
Hash Method๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ง๋ง ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋๋จธ์ง ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ์ ๊ณ ์ ํ hashCode๋ฅผ ๊ตฌํ ๋ค hashCode๋ฅผ ํ ์ด๋ธ ํฌ๊ธฐ๋ก ๋๋จธ์ง ์ฐ์ฐ์ ํ ๊ฒฐ๊ณผ๋ฅผ ํด๋น ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์๋ฅผ๋ค์ด "a", "b", "c"์ hashCode๊ฐ ๊ฐ๊ฐ 97,98,99๋ผ๊ณ ํ๊ณ Hash Table์ ํฌ๊ธฐ๊ฐ 10์ด๋ผ๊ณ ํ์ ๋ ํ ์ด๋ธ์ ์ ์ฅ๋ ์ธ๋ฑ์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
97 % 10 = 7
98 % 10 = 8
99 % 10 = 9
์ฆ, Hash Table์ ์ธ๋ฑ์ค 7์๋ "a"๋ฅผ ์ ์ฅํ๊ณ 8์๋ "b", 9์๋ "C"๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
์ดํ์ "a"๋ฅผ ๊ฒ์ํ ๋์๋ "a"์ hashCode๋ฅผ ๊ฐ์ง๊ณ ๋๋จธ์ง ์ฐ์ฐ์ ํ ๊ฒฐ๊ณผ์ธ 7๋ฒ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๋ก ์ฐธ์กฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ผ ์ ์๋ค.
๋ ๋ค๋ฅธ ์๋ฅผ ๋ค์ด๋ณด์
4,8,12,16,20,24,28,32 ๋ผ๋ hashCode๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ํ์ ๋, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด Hash Table์ ํฌ๊ธฐ๋ฅผ 8๋ก ์ง์ ํ๋ค๋ฉด ํ ์ด๋ธ์ ์ ์ฅ๋ ์ธ๋ฑ์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
4 % 8 = 4
8 % 8 = 0
12 % 8 = 4
16 % 8 = 0
20 % 8 = 4
24 % 8 = 0
28 % 8 = 4
32 % 8 = 0
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์ธ๋ฑ์ค๊ฐ 0๋ฒ๊ณผ 4๋ฒ์ ์ง์ค๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด์ฒ๋ผ hashCode๊ฐ ๋ค๋ฅด๋๋ผ๋ ๋๋จธ์ง ์ฐ์ฐ์ ํ ๊ฒฐ๊ณผ๋ ๊ฐ์ ์ ์์ผ๋ฏ๋ก Hash Table์ ๋์ผํ ์ธ๋ฑ์ค์ ์ ์ฅ์ ์๋ํ๋ ค ํ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ ๊ฒ ์ ์ฅํ๋ ค๋ ์์น์ ์ด๋ฏธ ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ์์ด์ ์ ์ฅ์ ํ ์ ์๋ ํ์์ ์ถฉ๋(collision)์ด๋ผ๊ณ ํ๋ฉฐ ์ด๋ฐ ์ถฉ๋์ ์ต์ํ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋๋จธ์ง ์ฐ์ฐ์ ๊ฐ์ด ์ต๋ํ ์ค๋ณต๋์ง ์๋๋ก ํ ์ด๋ธ์ ํฌ๊ธฐ๋ฅผ ์์(prime number)๋ก ๋ง๋๋ ๊ฒ์ด๋ค.
๋ค์์ 8๋ณด๋ค ํฐ ์์์ธ 11์ ํ ์ด๋ธ์ ํฌ๊ธฐ๋ก ์ง์ ํ์ ๋ ๊ฐ ๋ฐ์ดํฐ๋ค์ด ํ ์ด๋ธ์ ์ ์ฅ๋ ์ธ๋ฑ์ค ๊ฐ์ด๋ค.
4 % 11 = 4
8 % 11 = 8
12 % 11 = 1
16 % 11 = 5
20 % 11 = 9
24 % 11 = 2
28 % 11 = 6
32 % 11 = 10
์ด์ ๋ ์ถฉ๋์ด ๋ฐ์ํ์ง์๋๋ค. ํ์ง๋ง Hash Table์ ํฌ๊ธฐ๋ฅผ ์์๋ก ๋ง๋๋ ๊ฒ์ ์ถฉ๋์ ์ค์ด๋ ๋ฐฉ๋ฒ์ด์ง ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์๋๋ค. ์ถ๊ฐ์ ์ผ๋ก 10์ ์ ์ฅํ๋ ค๊ณ ํ๋ค๋ฉด 10 % 11 = 10์ด ๋๋ฏ๋ก ์ด๋ฏธ 10๋ฒ์ ์ธ๋ฑ์ค์๋ 32๊ฐ ๋ค์ด์๊ธฐ ๋๋ฌธ์ ์ถฉ๋์ด ๋ฐ์ํ๋ค.
์ด์ฒ๋ผ ์ถฉ๋์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ฉฐ ์ถฉ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ๋ฐฉ์ฃผ์๋ฒ๊ณผ ๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ ๋๊ฐ์ง๊ฐ ์๋ค.
๐ก KEY?
- Hash ์์ ๋งคํํ ๋ ์ฌ์ฉํ๋ ์ธ๋ฑ์ค์ด๋ค.
- Key๋ ์ ๋๋ก ์ค๋ณต๋์ง ์๋๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.(๊ณ ์ ํ ๊ฐ)
- ํด์ ํจ์์ input์ด ๋จ.
- ๋ง์ฝ Key๊ฐ ์ค๋ณต์ด๋ผ๋ฉด ๋์ค์ ๋ค์ด์จ ๊ฐ๋ง ๋จ๋๋ค.[ํด์ ์ถฉ๋(Hash Collision)]
- ํค ๊ฐ ๊ทธ๋๋ก ์ ์ฅ์์ ์ ์ฅํ ๊ฒฝ์ฐ ๋ค์ํ ํค์ ๊ธธ์ด๋งํผ ํฌ๊ธฐ๋ฅผ ๊ตฌ์ฑํด๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ผ์ ํ ๊ธธ์ด์ ํด์๋ก ๋ณ๊ฒฝํ๋ค.
๐ก VALUE?
- Key๋ก ๋งคํ ์ ๋์ค๋ ๊ฐ์ด๋ค.
- ์ ์ฅ์(bucket, slot)์ ์ต์ข ์ ์ผ๋ก ์ ์ฅ๋๋ ๊ฐ์ผ๋ก hash์ ๋งค์นญ๋์ด ์ ์ฅ.
๐ก HashTable
- ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํค๋ฅผ ํด์๊ฐ์ผ๋ก ๋งคํํ๊ณ ์ด ํด์๊ฐ์ ์ฃผ์๋ก ์ผ์ ๋ฐ์ดํฐ(value)๋ฅผ key์ ํจ๊ป ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ
- ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณณ์ ๋ฒํท ๋๋ ์ฌ๋กฏ์ด๋ผ๊ณ ํจ.
- ํด์ํ ์ด๋ธ์ ๊ธฐ๋ณธ ์ฐ์ฐ์ ์ฝ์ , ์ญ์ , ํ์์ด๋ค.
๐ key๋ hash function์ ํตํด hash๋ก ๋ณ๊ฒฝ์ด ๋๋ฉฐ hash๋ value์ ๋งค์นญ๋์ด ์ ์ฅ์์ ์ ์ฅ์ด ๋๋ค.
๐ ์ฅ์ : ํด์ ํ ์ด๋ธ์ key-value ๊ฐ 1:1๋ก ๋งคํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฝ์ , ์ญ์ , ๊ฒ์ ๊ณผ์ ์์ ๋ชจ๋ ํ๊ท ์ ์ผ๋ก 0(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๐ ๋จ์
1) ํด์ ์ถฉ๋์ด ๋ฐ์
2) ์์/๊ด๊ณ๊ฐ ์๋ ๋ฐฐ์ด์ ์ด์ธ๋ฆฌ์ง ์๋๋ค. => ์์์ ์๊ด์์ด key๋ง์ ๊ฐ์ง๊ณ ์ฝ์ ๊ฒ์ ์ญ์ ํ๊ธฐ ๋๋ฌธ
3) ๊ณต๊ฐ ํจ์จ์ฑ์ด ๋จ์ด์ง => ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ ์ฅ๊ณต๊ฐ์ ํ๋ณดํด์ผํ๊ธฐ ๋๋ฌธ. ๊ณต๊ฐ์ด ๋ถ์กฑํ๊ฑฐ๋ ์์ ์ฑ์์ง์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ฐ์
4) hash function์ ์์กด๋๊ฐ ๋๋ค => ํ๊ท ์๊ฐ ๋ณต์ก๋๊ฐ 0(1) ์ด์ง๋ง ํด์ํจ์๊ฐ ๋งค์ฐ ๋ณต์กํ๋ค๋ฉด ํด์ ํ ์ด๋ธ์ ์ฐ์ฐ ์๋๋ ์ฆ๊ฐ.
ํค์ ์ ์ฒด ๊ฐ์์ ๋์ผํ ํฌ๊ธฐ์ ๋ฒํท์ ๊ฐ์ง ํด์ํ ์ด๋ธ์ Direct-address table ์ด๋ผ๊ณ ํ๋ค.
Direct-address table์ ์ฅ์ ์ ํค์ ๊ฐ์์ ํ ์ด๋ธ์ ํฌ๊ธฐ๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์ ํด์ ์ถฉ๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
ํ์ง๋ง ์ค์ ์ฌ์ฉํ๋ ํค๊ฐ ์ผ๋ง ์๋ ๊ฒฝ์ฐ, ์ฆ ์ ์ฒดํค 100๊ฐ ์ค์ ์ค์ ๋ก๋ 10๊ฐ ํค๋ง ์ฌ์ฉํ๋ค ํ์ ๋, 100๊ฐ ํฌ๊ธฐ์ ๋ฐ์ด๋ธ์ ์ ์งํ๋ค๋ ๊ฒ์ด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น์ด๋ค.
๋ฐ๋ผ์ ๋ณดํต์ ๊ฒฝ์ฐ ์ค์ ์ฌ์ฉํ๋ ํค ๊ฐ์๋ณด๋ค ์ ์ ํด์ํ ์ด๋ธ์์ด์ฉํ๋๋ฐ, ์ด๋ฐ ์ด์ ๋ก ํด์ ์ถฉ๋์ด ๋ฐ์ํ๊ณ ํด์ ์ถฉ๋์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ค์ํ ๋ฐฉ๋ฒ์ด ๊ณ ์๋์๋ค.
๐ก Hash์ฝ๋?
- Hash๋ก ๊ฐ ์์ฑ ์, ๊ณ ์ ์ ์ฃผ์๊ฐ์ด ์์ฑ๋จ ๐ค ์ด๊ฒ์ ์ซ์๋ก ๋ณํํ ๊ฒ์ ํด์์ฝ๋๋ผ๊ณ ๋ถ๋ฆ.
- ์๋ฐ์์ ํด์์ฝ๋๋ Heap ์์ญ์ ์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ ๊ฐ์ด๋ผ๊ณ ๋ ๋ถ๋ฅผ ์ ์๋ค.
๐ก Hash Function(ํด์ํจ์)
- Key๋ฅผ ๊ณ ์ ๋ ๊ธธ์ด์ hash๋ก ๋ณ๊ฒฝํด์ฃผ๋ ์ญํ ์ ํ๋ค. ์ด ๊ณผ์ ์ hashing์ด๋ผ๊ณ ํ๋ค.
- ์๋ก ๊ฐ์ key๊ฐ ๊ฐ์ hash๊ฐ์ ๊ฐ๊ฒ ๋๋ ๊ฒฝ์ฐ ํด์ ์ถฉ๋์ด๋ผ๊ณ ํ๋ค.
- ํด์ ์ถฉ๋์ด ํด์๊ฐ ์ ์ฒด์ ๊ฑธ์ณ ๊ท ๋ฑํ๊ฒ ๋ฐ์ํ๋๋ก ํ๋ ๊ฒ๋ ์ค์ํ๋ค.
ex) ๋ชจ๋ ํค๊ฐ 02๋ผ๋ ๋์ผํ ํด์ ๊ฐ์ผ๋ก ๋งคํ์ด ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ์ก์ธ์ค ํ ๋ ๋นํจ์จ์ฑ์ด ์ปค์ง๊ณ ๋ณด์์ด ์ทจ์ฝํด์ ธ ๊ตณ์ด ํด์๋ฅผ ๋์ ํด ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ด์ ๊ฐ ์์ด์ง๋ค.(์๋ก ๋ค๋ฅธ ํค์ธ๋ฐ๋ ๋์ผํ ํด์๊ฐ)
- ์๋ ๊ทธ๋ฆผ์์ Keys๊ฐ ๋ค์ด์์ hashfunction์ ๊ฑฐ์ณ hashes(HashValue)๊ฐ ๋๋ ๊ฒ์ด๋ค.
- ํน์ ๊ฐ์ ์น์ฐ์น์ง ์๊ณ ํด์๊ฐ์ ๊ณ ๋ฅด๊ฒ ๋ง๋ค์ด๋ด๋ ํด์ํจ์๊ฐ ์ข์ ํด์ํจ์๋ผ๊ณ ํ ์ ์๋ค.
division method
์ซ์๋ก ๋ ํค๋ฅผ ํด์ํ ์ด๋ธ์ ํฌ๊ธฐm์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ํด์๊ฐ์ผ๋ก ๋ณํํ๋ค.
๊ฐ๋จํ๋ฉด์ ๋น ๋ฅธ ์ฐ์ฐ์ด ๊ฐ๋ฅํ ๊ฒ์ด ์ฅ์ ์ด๋ค.
- h(k) = k mod m
- ์ : m = 20 and k = 91 ==> h(k) = 11
- ์ฅ์ : ํ๋ฒ์ mod ์ฐ์ฐ์ผ๋ก ๊ณ์ฐ, ๋น ๋ฆ
- ๋จ์ : ์ด๋ค m ๊ฐ์ ๋ํด์๋ ํด์ ํจ์๊ฐ์ด ํค๊ฐ์ํน์ ๋ถ๋ถ์ ์ํด์ ๊ฒฐ์ ๋๋ ๊ฒฝ์ฐ๊ฐ์์
2^p์ด๋ฉด ํค์ ํ์ p๋นํธ๊ฐ ํด์ ํจ์๊ฐ ๋จ.
multiplication method
- 0์์ 1์ฌ์ด์ ์์A๋ฅผ ์ ํ : 0 < A < 1
- kA์ ์์๋ถ๋ถ๋ง์ ํํจ.
- ์์๋ถ๋ถ์ m์ ๊ณฑํ ํ ์์์ ์๋๋ฅผ ๋ฒ๋ฆฐ๋ค.
- ์ : m=8, word size = w = 5, k = 21
A = 13/32 ๋ฅผ ์ ํ
kA = 21*13/32 = 273/32 = 8 +17/32
m (kA mod 1) = 8 * 17/32 = 17/4 = 4.xxx
h(21) = 4
๊ผญ ์์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ํด์ ํจ์๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ๊ฒ์ ์๋๋ค. ํด์ํจ์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ค ํ๋์ผ ๋ฟ์ด๋ค.
์ซ์ ํค k,A๋ 0๊ณผ 1 ์ฌ์ด์ ์ค์์ผ ๋,
h(k) = (kA mod 1)*m
2์ง์์ฐ์ฐ์์ต์ ํ๋ ์ปดํจํฐ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ ํด์ํจ์๋ผ๊ณ ํ๋ค.
๋๋์ ๋ฒ๋ณด๋ค๋ ๋ค์ ๋๋ฆฌ๋ค.
univeral hashing
๋ค์์ ํด์ ํจ์๋ฅผ ๋ง๋ค๊ณ ,์ด ํด์ํจ์์ ์งํฉh์์ ๋ฌด์์๋ก ํด์ํจ์๋ฅผ ์ ํํด ํด์๊ฐ์ ๋ง๋๋ ๊ธฐ๋ฒ
h์์ ๋ฌด์์๋ก ๋ฝ์ ํด์ ํจ์๊ฐ ์ฃผ์ด์ก์ ๋ ์์์ ํค๊ฐ์ ์์์ ํด์๊ฐ์ ๋งคํํ ํ๋ฅ ์ 1/m๋ก ๋ง๋๋ ค๋ ๊ฒ์ด ๋ชฉ์
๋ค์๊ณผ ๊ฐ์ ํน์ ์กฐ๊ฑด์ ํด์ ํจ์์งํฉ h๋ 1/m์ผ๋ก ๋ง๋๋๊ฒ๊ฐ๋ฅํ๋ค๊ณ ์ํ์ ์ผ๋ก์ฆ๋ช ๋์๋ค๊ณ ํ๋ค.
- ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ m์ ์์๋ก ์ ํ๋ค.
- ํค๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด r+1๊ฐ๋ก ์ชผ๊ฐ ๋ค : k0, k1,...,kr
- 0๋ถํฐ m-1 ์ฌ์ด์ ์ ์ ๊ฐ์ด๋ฐ ํ๋๋ฅผ ๋ฌด์์๋ก ๋ฝ๋๋ค. ๋ถ๋ฆฌ๋ ํค ๊ฐ์ ๊ฐ์(r+1)๋งํผ ๋ฐ๋ณตํด์ ๋ฝ๋๋ค.
์ด๋ฅผ a=[a0,a1,...,ar]๋ก ๋๋ค. ๋ฐ๋ผ์ a์ ๊ฒฝ์ฐ์ ์๋ ๋ชจ๋ mr+1๊ฐ์ง์ด๋ค.
- ํด์ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ค.
- a๊ฐ mr+1๊ฐ์ง์ด๋ฏ๋ก ํด์ํจ์์ ์งํฉ H์ ์์ ์๋ํ mr+1๊ฐ์ด๋ค.
์์ ๊ฐ์ ์กฐ๊ฑด์์๋ ํค๊ฐ ๋์ผํ๋๋ผ๋ a๊ฐ ์ผ๋ง๋ ์ง ๋๋คํ๊ฒ ๋ฌ๋ผ์ง ์์๊ณ ,์ด์ ํด๋นํ๋ ํด์ํจ์ha ๋ํ ์์ดํด์ง๊ธฐ ๋๋ฌธ์ H๋ ์ ๋๋ฒ์ ํจ์๊ฐ ๋๋ค.
๐ก ์ข์ ํด์ ํจ์๋?
- ํ์ค์์๋ ํค๋ค์ด ๋๋คํ์ง์์
- ๋ง์ฝ ํค๋ค์ ํต๊ณ์ ๋ถํฌ์ ๋ํด ์๊ณ ์๋ค๋ฉด ์ด๋ฅผ ์ฌ์ฉํด์ ํด์ ํจ์๋ฅผ ๊ณ ์ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ฒ ์ง๋ง ํ์ค์ ์ผ๋ก์ด๋ ค์
- ํค๋ค์ด ์ด๋คํน์ ํ (๊ฐ์์ ์ธ)ํจํด์ ๊ฐ์ง๋๋ผ๋ ํด์ํจ์ ๊ฐ์ด ๋ถ๊ท์น์ ์ด ๋๋๋ก ํ๋๊ฒ ๋ฐ๋์งํจ.
* ํด์ ํจ์ ๊ฐ์ด ํค์ ํน์ ๋ถ๋ถ์ ์ํด์๋ง ๊ฒฐ์ ๋์ง ์์์ผํจ.
๐ก ํด์ ์ถฉ๋
๊ฐ์ Key์ ๊ฐ์ ๋ฃ์ผ๋ฉด ์ด์ ๊ฐ์ ์ฌ๋ผ์ง๊ณ ๋์ค์ ๋ค์ด์จ ๊ฐ๋ง ๋จ๋๋ค.
ํด์ ์ถฉ๋์ด ๋ฐ์ํ๊ฒ ๋๋ฉด ๊ฒ์ถ ์๋๋ฅผ ๋๋ฆฌ๊ฒ ๋ง๋ค๊ณ ๋ฒํท ์ค๋ฒํ๋ก์ฐ(?)๋ฅผ ๋ฐ์์ํค๋ ๋ฌธ์ ๊ฐ ๋ํ๋๋ค.
- ๋ฒํท ์ค๋ฒํ๋ก์ฐ ? ๋ฒํท์ ํฌ๊ธฐ๊ฐ ์์ผ๋ฉด ์๋ก ๋ค๋ฅธ ํค๋ฅผ ํด์ํจ์ํ์ฌ ๊ฐ์ ํด์ ๊ฐ์ด ๋์ ๋ฒํท์ด ํฌ๊ธฐ๋ฅผ ๋์ ์ ์์.
- ํด์ ์ถฉ๋ ๋ฐ์ ํ๋ฅ ์ด ์ ์์๋ก ์ข๋ค.
๋ฐ๋ผ์ ํด์ ์ถฉ๋์ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
์์ ๊ทธ๋ฆผ์์ john๊ณผ sandra์ hash๊ฐ 02๋ก ๊ฐ๋ค. ์ด๋ฐ ํ์์ hash collision์ด๋ผ๊ณ ํใด๋ค.
ํด์ ํจ์๋ก ํด์๋ฅผ ๋ง๋๋ ๊ณผ์ ์์ ์๋ก ๋ค๋ฅธ key๊ฐ ๊ฐ์ ํด์๋ก ๋ณ๊ฒฝ๋๋ฉด ๊ฐ์ ๊ณต๊ฐ์ 2๊ฐ์ value๊ฐ ์ ์ฅ๋๋ฏ๋ก key-value๊ฐ 1:1๋ก ๋งคํ๋์ด์ผ ํ๋ ํด์ ํ ์ด๋ธ์ ํน์ฑ์ ์๋ฐฐ๋๋ค.
ํด์ ์ถฉ๋์ ํ์ฐ์ ์ผ๋ก ๋ํ๋ ์ ๋ฐ์ ์๋ค.
Hash Table์ ์ด๋ฏธ ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ๋ชปํ๋ ์ถฉ๋์ด ๋ฐ์ํ๋ค๊ณ ํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ฐ๋ฐฉ์ฃผ์๋ฒ๊ณผ ๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ์ด ์์ง๋ง ๊ฐ๋ฐฉ์ฃผ์๋ฒ์ ์ถฉ๋์ด ๋ง์ด์ผ์ด๋ ๊ฒฝ์ฐ ์ฌ๊ฐํ ์ฑ๋ฅ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.(ํน์ ๋ธ๋ก๊ทธ๋ ๊ฐ๋ฐฉ์ฃผ์๋ฒ์ ์์ ์ค๋ช ์์ํ์)
๐ก ํด์ ์ถฉ๋ ํด๊ฒฐ ๋ฒ 1) - Chaning (JAVA - linkedList ํ์ฉ) (๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ)
- ํด์ ํ ์ด๋ธ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ์์ ์ฌ์ฉํ๋ Node๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฒ.
์ฆ Hash Table์ ์ ๋ง๋ค ์ฐ๊ฒฐ๋ฆฌ์คํธ ํ๋ ์ฉ ์ ์ฅํ๋๋ก ํ๊ณ ์ถฉ๋์ด ๋ฐ์ํ๋ ๋ฐ์ดํฐ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ค์ ๋ ธ๋๋ก ๊ณ์ ์ถ๊ฐํด ๊ฐ๋ ๊ฒ์ด๋ค.
์ดํ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ๋์๋ hash table์ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์ ํ ์ ์ ์ฐ๊ฒฐ๋ ๋ฆฌ์คํธ๋ฅผ ์์ฐจ์ ์ผ๋กํ์ํ๋ฉฐ ์ฐพ์ผ๋ ค๋ hashCode์ ์ ์ฅ๋ ๋ ธ๋์ hashCode๋ฅผ ๋น๊ตํ๋ ๊ฒ์ด๋ค.
- ํด์ ์ถฉ๋์ด ์ผ์ด๋๋ฉด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ค์ ์ฐ๊ฒฐํ๋ ๋ฐฉ์
- ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด์ฉํด ๋์ผํ bucket(๋ฉ๋ชจ๋ฆฌ๋ผ๊ณ ํ๋ฉด ๋๊ฒ ๋ค) ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ์ ์ฅํจ.
- ๊ผฌ๋ฆฌ์ก๊ธฐ ์ฒ๋ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ด ํ๋์ ๋ ธ๋๊ฐ ๋์ด ์ฐจ๋ก๋๋ก ์ฐ๊ฒฐ๋๋ ๊ฒ์ ์๋ฏธํจ.
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ง ์ฌ์ฉํ๋ฉด ๋๋ฏ๋ก ๋ณต์กํ์ง ์๊ณ ๊ฐ์ ์ฃผ์ ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์.
- ํ์ง๋ง, ํน์ ์ฃผ์์ ๊ณ์ ์์ด๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ด ํ์ ํ๊ฒ ๋ฎ์์ง๊ณ ๋ง์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ก์๋จน์
์ฒด์ด๋์ ์ ์ฅ์(bucket)์์ ์ถฉ๋์ด ์ผ์ด๋๋ฉด ๊ธฐ์กด ๊ฐ๊ณผ ์๋ก์ด ๊ฐ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด ์ฐ๊ฒฐ์ํค๋ ๋ฐฉ๋ฒ์ด๋ค.
๐ ์ฅ์
- ํ์ ๋ ์ ์ฅ์๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. => ๋ฏธ๋ฆฌ ์ถฉ๋์ ๋๋นํด ๋ง์ ๊ณต๊ฐ์ ์ก์๋์ ํ์๊ฐ ์๋ค.
- ํด์ ํจ์๋ฅผ ์ ํํ๋ ์ค์์ฑ์ด ์๋์ ์ผ๋ก ์ ๋ค => ์ถฉ๋์ด ๋๋ ๊ทธ๋ฅ ์ฐ๊ฒฐํ๋ฉด ๋๋๊น.
๐ ๋จ์
- ํ hash์ ์๋ฃ๋ค์ด ๋ง์ด ์ฐ๊ฒฐ๋๋ฉด ๊ฒ์ ํจ์จ์ด ๋ฎ์์ง๋ค.(์ ๋ฆผํ์)
- ์ธ๋ถ ์ ์ฅ๊ณต๊ฐ์ ์ฌ์ฉํ๋ค.
๐ก ๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ์์ด์ฉํ Hash ๊ตฌํ
package util;
public class Hash{
//ํด์ฌ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ Entry๋ ๊ฐ๊ณผ ๋ค์ Entry๋ฅผ ๊ฐ์ง๋ค.
private class Entry{
private int value;
public Entry next;
}
private int size;
private Entry[] hTable;
// Hash Table์ size์ ๋ฐฐ์ด ํ
์ด๋ธ์ ์์ฑํ๋ค.
public Hash(int size) {
this.size = size;
this.hTable = new Entry[size];
}
// data๋ฅผ ๊ฐ์ง๊ณ hashCode๋ฅผ ์์ฑํ์ฌ key๋ฅผ ์ถ์ถํ๋ค.
// ์ค์ Hash ์๋ ํน๋ณํ ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ฉ๋์ด hashCode๋ฅผ ์์ฑํ์ง๋ง
// ๋ณธ ์ฝ๋์์๋ data ๊ฐ์ key๋ก ํจ.
public int getKey(int data) {
return data;
}
// key ๊ฐ์ผ๋ก HashTable์ ์ ์ฅํ index๋ฅผ ๊ฒฐ์ ํ์ฌ ๋ฐํํ๋ค.
public int hashMethod(int key) {
return key % size;
}
// data๋ฅผ HashTable์ ์ ์ฅํ๋ค.
// Hash์ ๋ฐ์ดํฐ ์ฝ์
์ ํค์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๊ณ HashTable์์ ํด๋น ์ธ๋ฑ์ค๋ฅผ ํ์ธํ๋ค.
// ํด๋น ์ธ๋ฑ์ค๊ฐ ๋น์ด์์ผ๋ฉด Entry๋ฅผ ์ ์ฅํ๋ฉด ๋๊ณ
// ํด๋น ์ธ๋ฑ์ค์ ๊ฐ์ด ์๋ค๋ฉด ์ฒซ๋ฒ์งธ Entry๋ถํฐ ์์ฐจ์ ์ผ๋ก ํ์ํ์ฌ Key๊ฐ ์ฝ์
๋ ์์น๋ฅผ ์ฐพ์ ์ฝ์
ํ๋ค.
// Entry ๋ฆฌ์คํธ๋ ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ด๋ฉฐ ์์๊ฐ๋ถํฐ ํฐ๊ฐ ์์๋ก ์ ๋ ฌ๋์ด ์๋ค.
public int add(int data) {
// data์ hashCode๋ฅผ key์ ์ ์ฅํ index๋ฅผ ์ป๋๋ค.
int key = getKey(data);
int hashValue = hashMethod(key);
// ์ ์ฅํ Entry ์์ฑ
Entry entry = new Entry();
entry.value = data;
// hashTable์ ์ ์ฅํ index๊ฐ ๋น์ด์๋ค๋ฉด, Entry๋ฅผ ์ ์ฅํ๊ณ ๋๋ธ๋ค.
if(hTable[hashValue] == null) {
hTable[hashValue] = entry;
return 0;
}
// ํด๋น ์ธ๋ฑ์ค์ ๊ฐ์ด ์๋ค๋ฉด ์ฒซ๋ฒ์งธ Entry๋ถํฐ ์์ฐจ์ ์ผ๋ก ํ์ํ์ฌ Key๊ฐ ์ฝ์
๋ ์์น๋ฅผ ์ฐพ์ ์ฝ์
ํ๋ค.
// Entry ๋ฆฌ์คํธ๋ ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ด๋ฉฐ ์์๊ฐ๋ถํฐ ํฐ๊ฐ ์์๋ก ์ ๋ ฌ๋์ด ์๋ค.
Entry pre = null;
Entry cur = hTable[hashValue];
// ํด๋น index์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๊ฐ์ ํฌ๊ธฐ๊ฐ ์์ ๊ฐ๋ถํฐ ํฐ ์์๋ก ์ ๋ ฌ๋์ด ์๋ค.
while(true) {
if(cur == null) {//Hash Table์ ์ ์ฅํ index๊ฐ ๋น์ด์์ผ๋ฉด
hTable[hashValue] = entry; //ํด๋น index์ Entry๋ฅผ ์ ์ฅํ๋ค.
return 0;
}else if(cur.value < key) {//ํด๋น index์ ์ปค์๋
ธ๋ ๊ฐ์ด key๋ณด๋ค ์์ผ๋ฉด
//์ปค์๋ฅผ ํ๋ ๋ค๋ก ์ฎ๊ธด๋ค.
pre = cur;
cur =cur.next;
}else {//ํด๋น index์ ์ปค์ ๋
ธ๋ ๊ฐ์ด key๋ณด๋ค ํฌ๋ค.(์ฌ๊ธฐ์ ์ ์ฅ)
// ์ปค์๋
ธ๋๊ฐ hashTable์ ์ฒซ๋ฒ์งธ ๋
ธ๋์ด๋ฉด
if(cur == hTable[hashValue]) {
// ์ฝ์
๋
ธ๋๋ฅผ ์ฒซ๋ฒ์ฌ ๋
ธ๋๋ก ์ฝ์
ํ๊ณ ๋ค์ ๋
ธ๋๋ฅผ ์ปค์ ๋
ธ๋๋ก ์ง์ ํ๋ค.
entry.next = cur;
hTable[hashValue] = entry;
return 0;
}else {//์ฒซ๋ฒ์งธ ๋
ธ๋๊ฐ ์๋๋ฉด
// ์ฝ์
๋
ธ๋์ ๋ค์ ๋
ธ๋๋ก ์ปค์ ๋
ธ๋๋ฅผ ์ง์ ํ๊ณ
// ์ ๋
ธ๋์ ๋ค์ ๋
ธ๋๋ฅผ ์ฝ์
๋
ธ๋๋ก ์ง์ ํ๋ค.
entry.next = cur;
pre.next = entry;
return 0;
}
}
}
}
// data๊ฐ ์๋ ์์น๋ฅผ ์ป๋๋ค.
// ๋ฐ์ดํฐ์ ์์น ํ์์ hashMethod()๋ก index๋ฅผ์ป์ ํ ํด๋น index์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ํ๋ค.
// ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด index๋ฅผ ๋ฐํํ๊ณ ์์ผ๋ฉด -1์ ๋ฐํํ๋ค.
public int get(int data) {
int key = getKey(data);
int hashValue = hashMethod(key);
// data๊ฐ ์๋ index์ ์ฒซ๋ฒ์งธ ๋
ธ๋๋ฅผ ์ป๋๋ค.
Entry cur = hTable[hashValue];
while(true) {
if(cur==null) {//index๊ฐ ๋น์ด์๋ค๋ฉด -1๋ฐํ
return -1;
}else if(cur.value == key) {//์ปค์์ ๊ฐ๊ณผ ํค๊ฐ ๊ฐ์ผ๋ฉด 0 ๋ฐํ
return hashValue;
}else if(cur.value > key) {//์ปค์์ ๊ฐ์ด ํค๋ณด๋ค ํฌ๋ฉด -1 ๋ฐํ
// ๋ฆฌ์คํธ๋ ์์ ๊ฐ์์ ํฐ๊ฐ์ผ๋ก ์ ๋ ฌ๋์ด ์๋ค.
return -1;
}else {//์ปค์์ ๊ฐ์ด ํค๋ณด๋ค ์์ผ๋ฉด ๋ค์ ๋
ธ๋๋ก ์ปค์ ์ด๋
cur = cur.next;
}
}
}
// data๊ฐ ์๋ ๋
ธ๋๋ฅผ ๋ฐํํ๋ค.
private Entry getEntry(int data) {
int key = getKey(data);
int hashValue = hashMethod(key);
// HashTable์ index์ ์ฒซ๋ฒ์งธ ๋
ธ๋์ ๋๋ฒ์งธ ๋
ธ๋
Entry pre = hTable[hashValue];
Entry cur = pre.next;
while(true){
if(cur == null){ // ์ปค์ ๋
ธ๋๊ฐ null ์ด๋ฉด null ๋ฐํ
return null;
}else if(cur.value == key){ // ์ปค์ ๋
ธ๋์ ๊ฐ์ด ํค์ ๊ฐ์ผ๋ฉด ์ ๋
ธ๋๋ฅผ ๋ฐํ
return pre;
}else if(cur.value > key){ // ์ปค์์ ๊ฐ์ด ํค๋ณด๋ค ํฌ๋ฉด null ๋ฐํ
return null;
}else{ // ์ปค์์ ๊ฐ์ด ํค๋ณด๋ค ์์ผ๋ฉด ์ปค์๋ฅผ ๋ค์์ผ๋ก ์ด๋
pre = cur;
cur = cur.next;
}
}
}
// data ๋ฅผ ์ ๊ฑฐ๋ฅผ ์ํด์๋ data์ ํด๋นํ๋ index์ Entry๋ฆฌ์คํธ์์ data์ ์ ๋
ธ๋๊ฐ ๋ค์ ๋
ธ๋๋ฅผ data์ ๋ท ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๋ฉด ๋๋ค.
public int remove(int data){
Entry pre = null;
// data๊ฐ ์๋ ๋
ธ๋์ ์ ๋
ธ๋๋ฅผ ๊ฐ์ ธ์ค๊ณ null์ด๋ฉด -1 ๋ฐํ
if((pre=getEntry(data))== null){
return -1;
}
// ์ ๋
ธ๋๊ฐ data์ ๋ค์๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๋ค.
// data ๋
ธ๋๋ฅผ ๊ฑด๋๋ฐ๊ฒ ์ฐ๊ฒฐํ๋ค (์ ๊ฑฐ)
Entry cur = pre.next;
pre.next = cur.next;
return 0;
}
public String toString(){
StringBuffer result = new StringBuffer();
Entry cur = null;
for(int i=0; i<size; i++){
result.append("[" + i + "]\t");
cur = hTable[i];
if(cur == null){
result.append("n ");
}else{
while(cur!=null){
result.append(cur.value + "");
cur = cur.next;
}
}
result.append("\n");
}
return result.toString();
}
}
๐ก ํด์ ์ถฉ๋ ํด๊ฒฐ ๋ฒ 2) ๊ฐ๋ฐฉ ์ฃผ์๋ฒOpen Addressing : ํด์ ์ถฉ๋์ด์ผ์ด๋๋ฉด ๋ค๋ฅธ buket์ ์ฝ์
- ๊ฐ๋ฐฉ ์ฃผ์๋ฒ์ ๋น์ด์๋ hash๋ฅผ ์ฐพ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ธฐ๋ฒ. ๋ฐ๋ผ์ ๊ฐ๋ฐฉ์ฃผ์๋ฒ์ ํด์ ํ ์ด๋ธ์ hash์ value ๊ฐ 1:1 ๊ด๊ณ๋ฅผ ์ ์งํ๋ค.
- ๊ฐ๋ฐฉ ์ฃผ์๋ฒ์ chaning ์ฒ๋ผ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ ์๋ค๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์๋ค.
- ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ชจ๋ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์, ํฌ์ธํฐ๋ฅผ ์ธ ์ผ์ด์์ด ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๋ํ๋๋ ์ค๋ฒํค๋๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
์์ ๊ทธ๋ฆผ์์ Jone๊ณผ Sandra์ hash๊ฐ ๋์ผํด ์ถฉ๋์ด ์ผ์ด๋๋ค. ์ด๋ sandra๋ ๋ฐ๋ก ๊ทธ ๋ค์ ๋น์ด์๋ 153 hash์ ๊ฐ์ ์ ์ฅํ๋ค. ๊ทธ ๋ค์ ted๊ฐ ํ ์ด๋ธ์ ์ ์ฅ์ ํ๋ ค ํ์ผ๋ ๋ณธ์ธ์ hash์ ์ด๋ฏธ sandra๋ก ์ฑ์์ ธ์์ด ted๋ sandra์ฒ๋ผ ๋ฐ๋ก ๋ค์ ๋น์ด์๋ 154hash์ ๊ฐ์ ์ ์ฅํ๋ค.
์ด๋ฐ์์ผ๋ก ์ถฉ๋์ด ๋ฐ์ํ ๊ฒฝ์ฐ ๋น์ด์๋ hash๋ฅผ ์ฐพ์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด ๊ฐ๋ฐฉ์ฃผ์๋ฒ์ด๋ค.
์ด๋, ๋น์ด์๋ hash๋ฅผ ์ฐพ์๊ฐ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.
๐ก ๊ฐ๋ฐฉ ์ฃผ์๋ฒ์ ๊ท์น
- ๊ฐ๋ฐฉ ์ฃผ์๋ฒ์ ๋ํ์ ์ผ๋ก 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์ถ๊ฐ์ ์ผ๋ก ๊ฐ์ง๊ณ ์์.
1) ์ ํํ์(Linear Probing)
- ํด์ ์ถฉ๋ ๋ฐ์ ์ ๋ค์ bucket ์ด๋ ๋ช ๊ฐ์ bucket์ ๊ฑด๋ ๋ฐ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ์
- ํด๋น ํด์ ๊ฐ์์ ๊ณ ์ ํญ(+n)์ ๊ฑด๋ ๋ฐ์ด ๋น์ด์๋ ํด์์ ์ ์ฅ
- ํน์ ํด์ ๊ฐ ์ฃผ๋ณ ๋ฒํท์ด ๋ชจ๋ ์ฑ์์ ธ ์๋ primary clustring ๋ฌธ์ ์ ์ทจ์ฝ
์ต์ด ํด์ ๊ฐ์ด 52์ด๊ณ ๊ณ ์ ํญ์ด 1์ผ ๊ฒฝ์ฐ 4๋ฒ์ํ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํจ.
๐ chining์ ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ๋ฅผ ์ ์ฐํ๊ฒ ๋ง๋ค๊ณ , open addressing์ ํด์ ํ ์ด๋ธ ํฌ๊ธฐ๋ ๊ณ ์ ์ํค๋ ์ ์ฅํด ๋์์น๋ฅผ ์ ์ฐพ๋๋ฐ ๊ด์ฌ์ ๋ ๊ตฌ์กฐ
2) ์ ๊ณฑํ์(Quadratic Probing) : ํด์ ์ถฉ๋ ๋ฐ์ ์ ์ ๊ณฑ๋งํผ ๊ฑด๋ ๋ฐ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ์
์ถฉ๋์ด์ผ์ด๋ ํด์์ ์ ๊ณฑ์ ํ ํด์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
(1^2์นธ -. 2^2์นธ -. 3^2์นธ...)
์ฌ๋ฌ๊ฐ์ ์๋ก ๋ค๋ฅธํค๋ค์ด ๋์ผํ์ด๊ธฐ ํด์๊ฐ(์๋์์ initial probe)๋ฅผ ๊ฐ๋ secondary clustering์ ์ทจ์ฝ
์ด๊ธฐ ํด์ ๊ฐ์ด ๊ฐ์ผ๋ฉด ๋์ผํ ํญ์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ฑ์ด ๋จ์ด์ง
3) ์ด์คํด์ฑ(Double Hashing) : ํด์ ์ถฉ๋ ์ ๋ค๋ฅธ ํด์ ํจ์๋ฅผ ํ๋ฒ ๋ ์ ์ฉ์ํด.
๋ค๋ฅธ ํด์ํจ์๋ฅผ ํ๋ฒ ๋ ์ ์ฉํด ๋์จ ํด์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
์ด์ค ํด์ฑ์ ํ๋ฉด์ต์ด ํด์๊ฐ์ด ๋ฌ๋ผ์ง๋ฏ๋ก ํ์ฌ ์ด๋ํญ์ด ๋ฌ๋ผ์ง๊ณ , ํ์ฌ ์ด๋ํญ์ด ๊ฐ๋๋ผ๋ ์ต์ด ํด์ ๊ฐ์ด ๋ฌ๋ผ์ ธ primary, secondary clustering์ ์ํํ ์ ์์
์ฅ์ - ๋ ๋ค๋ฅธ ์ ์ฅ๊ณต๊ฐ ์์ด ํด์ ํ ์ด๋ธ ๋ด์์ ๋ฐ์ดํฐ์ ์ ์ฅ ๋ฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅ
๋จ์ - ํด์ํจ์์ ์ฑ๋ฅ์ ๋ฐ๋ผ ํด์ ํ ์ด๋ธ์ ์ฑ๋ฅ์ด ์ข์ฐ๋๋ค.
- ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ ๋์ด๋๋ฉด ๊ทธ์ ํด๋นํ๋ ์ ์ฅ์๋ฅผ ๋ง๋ จํด๋์ด์ผ ํ๋ค.
๐ก ๊ฒฐ๊ณผ
Hash ๋ ํ์์ด ๋น ๋ฅธ ๋ฐฐ์ด์ ์ฅ์ ๊ณผ ์ฝ์ / ์ญ์ ์ ๋ฐ์ดํฐ์ ๋ฐ์ด๋ด๊ธฐ ์ด๋์ด ํ์์๋ ์ฅ์ ์์ด์ฉํด ์ฑ๋ฅ์ ํฅ์์ํจ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ๋ฒ์ด๋ค.
๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ์ ๋ฐฐ์ด๊ณผ ๋จ์์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ํผํฉํ์ฌ ๋ฐ์ดํฐ์ ์ฝ์ /์ญ์ /ํ์์ ์ฑ๋ฅ์ ๋์ธ๋ค.
๊ฐ๋ฐฉ ์ฃผ์๋ฒ์ ๋ฐฐ์ด๋ง์ ์ฌ์ฉํ๋ฉฐ, ์ ์ฅ ์ธ๋ฑ์ค๊ฐ ๊ฒน์น ๊ฒฝ์ฐํด๋น ์ธ๋ฑ์ค์์์ธ๋ฑ์ค์ ์ ์ฅํ๋ ๋ฐฉ์์ด๋คใ .์ด๋ ์ ์ธ๋ฑ์ค์์ ๋ฐ์ดํฐ ์ถฉ๋์ด๋๋ค์ ์ผ์ด๋๋ฉด ๋ค์ ์์ธ๋ฑ์ค๋ก ์ ์ฅํ๋ค. ๋ฐ๋ผ์ ์ถฉ๋ ๋ฐ์ดํฐ๊ฐ ๋ง์ด ๋ฐ์ํ๋ฉด ์ฑ๋ฅ์ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๋จ์ ์ด์๋ค.
๐ก JAVA์์์ hash
HashMap๊ณผ HashTable
HashTable์ด๋ JDK 1.0๋ถํฐ ์๋ Java์ API์ด๊ณ , hashMap์ Java 2์์ ์ฒ์ ์ ๋ณด์ธ JavaCollections Framework์ ์ํ API์ด๋ค.
HashTable ๋ํ Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๊ธฐ ๋๋ฌธ์ HashMap๊ณผ HashTable์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๊ฐ๋ค.
์ฐจ์ด์
1. ๋ณด์กฐ ํด์ ํจ์
HashMap์ ๋ณด์กฐ ํด์ ํจ์(Additional Hash Function)๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ณด์กฐ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๋ HashTable์ ๋นํ์ฌ ํด์ ์ถฉ๋(hash collision)์ด ๋ ๋ฐ์ํ ์์์ด ์๋์ ์ผ๋ก ์ฑ๋ฅ์ ์ด์ ์ด ์๋ค.
2. ๋๊ธฐํ
HashMap์ ๊ฒฝ์ฐ ๋๊ธฐํ๋ฅผ ์ง์ํ์ง ์๋๋ค. ๊ทธ๋์ Hashtable์ ๋๊ธฐํ ์ฒ๋ฆฌ๋ผ๋ ๋น์ฉ ๋๋ฌธ์ HashMap์ ๋นํด ๋ ๋๋ฆฌ๋ค๊ณ ํ๋ค. ํ๋ก๊ทธ๋๋ฐ ์์ํธ์์ฑ ๋๋ฌธ์ ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์๋ Hashtable์ ์ฐ๊ธฐ๋ณด๋ค๋ hashMap์ ๋ค์ ๊ฐ์ธ์
Map m = Collections.synchronizedMap(new HashMap(...));
๊ณผ ๊ฐ์ ํํ๊ฐ ์ต๊ทผ์๋ ๋ ์ ํธํ๋ค.
๐ก HashMap ์ดํด๋ณด๊ธฐ
1) ํด์ ์ถฉ๋ ๊ธฐ๋ฒ
Java HashMap์์ ์ฌ์ฉํ๋ ๋ฐฉ์์ Separate Channing์ด๋ค. Open Addressing์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๋ ์ฒ๋ฆฌ๊ฐ ํจ์จ์ ์ด๊ธฐ ์ด๋ ค์ด๋ฐ, HashMap์์ remove() ๋ฉ์๋๋ ๋งค์ฐ ๋น๋ฒํ๊ฒ ํธ์ถ๋ ์ ์๊ธฐ๋๋ฌธ์ด๋ค.
๊ฒ๋ค๊ฐ HashMap์ ์ ์ฅ๋ ํค-๊ฐ ์ ๊ฐ์๊ฐ ์ผ์ ๊ฐ์ ์ด์์ผ๋ก๋ง์์ง๋ฉด ์ผ๋ฐ์ ์ผ๋ก Open Addressing์ Separate Chaining ๋ณด๋ค ๋๋ฆฌ๋ค. Open Addressing์ ๊ฒฝ์ฐ ํด์ ๋ฒํท์ ์ฑ์ด ๋ฐ๋๊ฐ ๋์์ง์๋ก Worst Case ๋ฐ์ ๋น๋๊ฐ ๋ ๋์์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ฉด Separate Chaning ๋ฐฉ์์ ๊ฒฝ์ฐ ํด์ ์ถฉ๋์ด ์ ๋ฐ์ํ์ง ์๋๋ก '์กฐ์ 'ํ ์ ์๋ค๋ฉด Worst Case ๋๋ Worst Case์ ๊ฐ๊น์ด ์ผ์ด ๋ฐ์ํ๋ ๊ฒ์ ์ค์ผ ์ ์๋ค.
2) ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ํธ๋ฆฌ
์์์ ์ฒด์ด๋ ๋ฐฉ์์ ๋ณดํต ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด value๋ค์์ฐ๊ฒฐํ๋ค๊ณ ํ๋ค HashMap๋ํ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์์ง๋ง Java8๋ถํฐ ๋ฒํท์ ๋ฐ์ดํฐ๊ฐ ์ผ์ ๊ฐ์ ์ด์์ผ ๋๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋์ ํธ๋ฆฌ(Red-Black tree)๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
์ด๋ ๊ฒ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ใณ์ผ๋ก ๋ณ๊ฒฝํ ๊ธฐ์กด get()๋ฉ์๋ ํธ์ถ์ ๋ํ ๊ธฐ๋๊ฐ
์์
์ผ๋ก ์ฑ๋ฅ์ด ํฅ์๋์๋ค.
ํ๋์ ํด์ ๋ฒํท์ 8๊ฐ ์ด์์ ํค-๊ฐ ์์ด ๋ชจ์ด๋ฉด๋งํฌ๋๋ฆฌ์คํธ๋ฅผ ํธ๋ฆฌ๋ก ๋ณ๊ฒฝํ๋ค. ๊ทธ๋ฆฌ๊ณ 6๊ฐ์์ด๋ฅด๊ฒ๋๋ฉด ๋ค์ ๋งํฌ๋๋ฆฌ์คํธ๋ก ๋ณ๊ฒฝํ๋ค. ํธ๋ฆฌ๋ ๋งํฌ๋ ๋ฆฌ์คํธ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ง๊ณ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ์ ์ ๋ ํธ๋ฆฌ์ ๋งํฌ๋๋ฆฌ์คํธ์ WorstCase ์ํ์๊ฐ ์ฐจ์ด๋น๊ต๋ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;
๐ก ํด์ ๋ฒํท ๋์ ํ์ฅ
์๊น ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ํจ์จ์ฑ์ ์ํด์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฒดํค์ ํฌ๊ธฐ๋ณด๋ค ์๊ฒ ๋ง๋ ๋ค๊ณ ํ๋ค. ํ์ง๋ง ์ด๋ก ์ธํด ํด์ ์ถฉ๋์ด ๋ฐ์ํ๊ณ ์ฑ๋ฅ์ ์์ค์ด ๋ฐ์ํ๋ค.
๊ทธ๋์ HashMap์ key-value ์ ๋ฐ์ดํฐ ๊ฐ์๊ฐ ์ผ์ ๊ฐ์ ์ด์์ด ๋๋ฉด, ํด์ ๋ฒํท์ ์๋ฅผ ๋๋ฐฐ๋ก ๋๋ฆฐ๋ค. ํด์ ๋ฒํท์ ์๋ฅผ ๋๋ ค ํด์ ์ถฉ๋์ ํ๋ฅ ์ ์ค์ด๋ ๊ฒ์ด๋ค.
ํด์ ๋ฒํท ๊ฐ์์ ๊ธฐ๋ณธ๊ฐ์ 16์ด๊ณ , ๋ฒํท์ ์ต๋ ๊ฐ์๋ 230๊ฐ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ๋ฒํท ๊ฐ์๊ฐ ๋๋ฐฐ๋ก ์ฆ๊ฐํ ๋๋ง๋ค, ๋ชจ๋ ํค-๊ฐ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์๋ก์ด Separate Chaining์ ๊ตฌ์ฑํด์ผํ๋ ๋ฌธ์ ๊ฐ ์๋ค.
HashMap ์์ฑ์์ ์ธ์๋ก ์ด๊ธฐ ํด์ ๋ฒํท ๊ฐ์๋ฅผ ์ง์ ํ ์ ์์ผ๋ฏ๋ก, ํด๋น HashMap ๊ฐ์ฒด์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ์ด๋ ์ ๋์ธ์ง ์์ธก ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ ์ด๋ฅผ ์์ฑ์์ ์ธ์๋ก ์ง์ ํ๋ฉด ๋ถํ์ํ๊ฒ Separate Chaining์ ์ฌ๊ตฌ์ฑํ์ง ์๊ฒ ํ ์ ์๋ค.
resize๋ฅผ ํ๊ฒ ๋๋ฉด ์ ํด์ ๋ฒํท์ ์์ฑํ ๋ค์, ๊ธฐ์กด ๋ชจ๋ ํด์ ๋ฒํท์ ์ํํ๋ฉด์ ๊ฐ ํด์ ๋ฒํท์ ์๋ ๋งํฌ๋๋ฆฌ์คํธ๋ฅผ ์ํํ๋ฉฐ key-value์์ ์ ์ฅํ๋ค. ์ด๋ ํด์ ๋ฒํท๊ฐ์๊ฐ ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ index๊ฐ(hashCode % M)์ ๋ค์ ๊ณ์ฐํด์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํด์ ๋ฒํท ํฌ๊ธฐ๋ฅผ ๋ ๋ฐฐ๋ก ํ์ฅํ๋ ๊ฒ์๋ ๊ฒฐ์ ์ ์ธ ๋ฌธ์ ๊ฐ ์๋ค. ํด์ ๋ฒํท์ ๊ฐ์ M์ด 2a ํํ๊ฐ ๋๊ธฐ ๋๋ฌธ์, index = X.hashCode() % M์ ๊ณ์ฐํ ๋ X.hashCode()์ ํ์ a๊ฐ์ ๋นํธ๋ง ์ฌ์ฉํ๊ฒ ๋๋ค๋ ๊ฒ์ด๋ค. ์ฆ ํด์ ํจ์๊ฐ32๋นํธ ์์ญ์ ๊ณ ๋ฅด๊ฒ ์ฌ์ฉํ๋๋ก๋ง๋ค์๋ค ํ๋๋ผ๋ ํด์๊ฐ์ 2์ ์น์๋ก ๋๋๋ฉด ํด์ ์ถฉ๋์ด ์ฝ๊ฒ ๋ฐ์ํ ์ ์๋ค.
์ด๋๋ฌธ์ ๋ณด์กฐ ํด์ ํจ์๊ฐ ํ์ํ๋ค.
๐ก ๋ณด์กฐ ํด์ ํจ์
๋ณด์กฐ ํด์ ํจ์์ ๋ชฉ์ ์ key์ ํด์๊ฐ์ ๋ณ๊ฒฝํด ํด์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ค์ด๋ ๊ฒ์ด๋ค.
//java 8 ๋ณด์กฐ ํด์ ํจ์
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
Java 8 HashMap ๋ณด์กฐ ํด์ ํจ์๋ ์์ 16๋นํธ ๊ฐ์ XOR ์ฐ์ฐํ๋ ๋งค์ฐ ๋จ์ํ ํํ์ ๋ณด์กฐ ํด์ ํจ์๋ก ๋ณ๊ฒฝ๋์๋ค.
์ด์ ๋ก๋ ๋๊ฐ์ง๊ฐ ์๋๋ฐ, ์ฒซ๋ฒ์งธ๋Java 8์์๋ ํด์ ์ถฉ๋์ด ๋ง์ด ๋ฐ์ํ๋ฉด ๋งํฌ๋๋ฆฌ์คํธ ๋์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ํด์ ์ถฉ๋ ์ ๋ฐ์ํ ์์๋ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์ํ๋์๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ฒ์งธ๋ก๋ ์ต๊ทผ์ ํด์ ํจ์๋ ๊ท ๋ฑ ๋ถํฌ๊ฐ ์ ๋๊ฒ ๋ง๋ค์ด์ง๋ ๊ฒฝํฅ์ด ๋ง์, Java 7 ๊น์ง ์ฌ์ฉํ๋ ๋ณด์กฐ ํด์ ํจ์์ ํจ๊ณผ๊ฐ ํฌ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ฒ์งธ ์ด์ ๊ฐ ์ข ๋ ๊ฒฐ์ ์ ์ธ ์์ธ์ด ๋์ด Java8์์๋ ๋ณด์กฐ ํด์ ํจ์์ ๊ตฌํ์ ๋ฐ๊พธ์๋ค.
๐ก Hashing in Java
- Java์ Object ํด๋์ค๋ hashCode() ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ํด๋์ค๋ hashCode()๋ฉ์๋๋ฅผ ์์๋ฐ๋๋ค.
- ์ด ๋ฉ์๋๋ ํ๋์ 32๋นํธ ์ ์๋ฅผ ๋ฐํํ๋ค.
- 32๋นํธ์ ์๋ผ๋ ๊ฒ์ ์์์ผ ์๋ ์๋ค๋ ์ด์ผ๊ธฐ์ด๋ค.
- ๋ง์ฝ x.equals(y)์ด๋ฉด x.hashCode() == y.hashCode() ์ด๋ค. ํ์ง๋ง ์ญ์ ์ฑ๋ฆฝํ์ง ์๋๋ค.
- Object ํด๋์ค์ hashCode() ๋ฉ์๋๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐํํ๋ ๊ฒ์ผ๋ก์๋ ค์ ธ ์๋ค.
(but it's implementation-dependent.)
- ํ์์ ๋ฐ๋ผ ๊ฐ ํด๋์ค๋ง๋ค ์ด ๋ฉ์๋๋ฅผ overrideํ์ฌ ์ฌ์ฉํ๋ค.
(์) Integer ํด๋์ค๋ ์ ์๊ฐ์ hashCode๋ก ์ฌ์ฉ
๐ก ํด์ํจ์์ ์ : hashCode() for String in Java
public final class String{
private final char[] s;
...
public int hashCode(){
int hash = 0;
for (int i = 0 ; i < length() ; i++)
hash = s[i] + (31 * hash);
return hash;
}
}
๐ก ์ฌ์ฉ์ ์ ์ ํด๋์ค์ ์
- ๋ชจ๋ ๋ฉค๋ฒ๋ค์ ์ฌ์ฉํ์ฌ hashCode๋ฅผ ์์ฑํ๋ค.
public class Record{
private String name;
private int id;
private double value;
...
public int hashCode(){
int hash = 17; //nonzero constant
hash = 31 * hash + name.hachCode();
hash = 31 * hash + Integer.valueOf(id).hashCode();
hash = 31 * hash + Double.valueOf(value).hashCode();
return hash;
}
}
๐ก hashCode์ hash ํจ์
- hash code : -2^31์์ 2^31์ฌ์ด์ ์ ์
- hash ํจ์ : 0์์ M-1๊น์ง์ ์ ์(๋ฐฐ์ด์ธ๋ฑ์ค)
* 0x7fffffff์ &์ฐ์ฐํ๋ ์ด์ ๋ ์์์ผ ๊ฒฝ์ฐ ์์๋ก ๋ฐ๊ฟ์ฃผ๋ ์์ ์ด๋ค.
* ๋๋จธ์ง ์ฐ์ฐ์ ํผ์ฐ์ฐ์๊ฐ์์์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
private int hash(Key key){
return (key.hashCode() & 0x7fffffff) % M;
}
๐ก HashMap in Java
- TreeMapํด๋์ค์ ์ ์ฌํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณต(๋ ๋ค java.util.Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ)
- ๋ด๋ถ์ ์ผ๋ก ํ๋์ ๋ฐฐ์ด์ ํด์ ํ ์ด๋ธ๋ก ์ฌ์ฉ
- ํด์ ํจ์๋ 24ํ์ด์ง์ ๊ฒ๊ณผ ์ ์ฌํจ
- chaining์ผ๋ก ์ถฉ๋ ํด๊ฒฐ
- Load factor๋ฅผ ์ง์ ํ ์ ์์(0~1์ฌ์ด์ ์ค์)
- ์ ์ฅ๋ ํค์ ๊ฐ์๊ฐ load factor๋ฅผ ์ด๊ณผํ๋ฉด ๋ ํฐ ๋ฐฐ์ด์ ํ ๋นํ๊ณ ์ ์ฅ๋ ํค๋ฅผ ์ฌ๋ฐฐ์น(re-hashing)
๐ก HashSet in Java
HashSet<MyKey> set = new HashSet<MyKey>();
set.add(MyKey);
if (set.contains(theKey))
...
int k = set.size();
set.remove(theKey);
Iterator<MyKey> it = set.iterator();
while(it.hasNext()){
MyKey key = it.next();
if(Key.equals(aKey)
it.remove()
}
โผ ์ฐธ๊ณ ๋ธ๋ก๊ทธ
'BackEnd > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ArrayList (0) | 2021.03.06 |
---|---|
Stack๊ณผ Queue (0) | 2021.03.06 |
JDK ๋ฒ์ ๋ณ ์ปดํ์ผ๋ฌ ์ง์๊ธฐ๋ฅ ์ ๋ฆฌ (0) | 2021.03.05 |
Set & TreeSet (0) | 2021.03.05 |
Java equals(), HashCode() (2) | 2021.03.04 |