๐ ์๋ฃ๊ตฌ์กฐ - HashMap๊ณผ ํด์ ์ถฉ๋
HashMap
key, value ํํ๋ก ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ
HashMap์ ํ๋์ key๊ฐ ํ๋์ value์ ๋งคํ๋๋๋ก ๊ตฌ์ฑ๋ ์๋ฃ๊ตฌ์กฐ.
- ์์) ์ฃผ๋ฏผ๋ฒํธ
์์๋ก, ํ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค๊ณ ํ ๋:
- key: ํ์ ๊ณ ์ ๋ฒํธ
- value: ํ์์ ์ธ๋ถ ์ ๋ณด (์: ์ด๋ฆ)
1
2
3
1 : ์ด๋์
2 : ์ด๋์
3 : ์ต๊ธ๋
์ฌ๊ธฐ์ number
๊ฐ key
๋ผ๋ฉด, value
๋ ๊ทธ ํ์์ ๋ํ ์ ๋ณด
๋ฅผ ์๋ฏธํจ.
HashMap์ ๊ฐ์ฅ ํฐ ํน์ง์ ์ฝ์ , ์ญ์ , ๊ฐฑ์ , ํ์์ด ์์ ์๊ฐ์ ์ฒ๋ฆฌ๋๋ค๋ ์ ์ด๋ค.
ํน์ง
์์ ์๊ฐ์ ์ฒ๋ฆฌ๋๋ค๋ ๊ฒ์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ์๊ด์์ด ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ํ๋๋ค๋ ์๋ฏธ์ด๋ฉฐ, ์๊ฐ ๋ณต์ก๋๋ O(1)
์ด๋ค.
์๋ฅผ ๋ค์ด, ํ๊ตญ์ ์๋ฅ์ธ ์ธ๊ธฐ ํฌํ์ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด๊ฒ ๋ค. ํฌํ ์ฐธ์ฌ์๊ฐ ์ ๊ตญ๋ฏผ 5,500๋ง ๋ช
์ผ ๋, key
๋ฅผ ์ด๋ฆ, value
๋ฅผ ๋ํ์๋ก ์ค์ ํด HashMap์ ์ฌ์ฉํ๋ฉด, ๋งค๋ฒ ์ด๋ฆ์ ๊ฒ์ํด ์๋ก์ด ๋ํ๋ฅผ ์ถ๊ฐํ๋ ์์
์ด ์์ ์๊ฐ์ ๊ฐ๋ฅํด์ง๋ค. ์ด๋ฅผ List ๊ตฌ์กฐ๋ก ์ฒ๋ฆฌํด ์ฒ์๋ถํฐ ์นด์ดํธํ๋ ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ์ฌํด์ง์ง๋ง, HashMap์ ์ฌ์ฉํ๋ฉด ์๋ก์ด ์ด๋ฆ์ด ๋์ฌ ๋๋ง๋ค ๋น ๋ฅด๊ฒ ์นด์ดํธํ ์ ์์ด ์๋๊ฐ ๋น ๋ฅด๊ณ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ ์ค์ผ ์ ์๋ค.
์ฅ์
HashMap์ ์ฅ์ ์ ์ฝ์ /์ญ์ /๊ฐฑ์ /ํ์์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ด๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ ์ ๊ฒ ๋ฐ์ํ๋ค.
HashMap (Hash table)
- ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๊ตฌํ
- ํด์ ํจ์(hash function) : key๋ฅผ ๋ฐฐ์ด ํฌ๊ธฐ ๋ด์ ์ธ๋ฑ์ค๋ก ๋ฐ๊ฟ์ฃผ๋ ํจ์
key๊ฐ ๋ฌธ์์ด, ์ด๋์์ด ๋ค์ด๊ฐ๋ค๊ณ ํ ๋ ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด์ ์ ์ฅ๋ ์ ์๋ ๊ฒ. ํด์ ํจ์๊ฐ ์ด key๋ฅผ index์ ์ฌ์ฉ๋ ์ ์๋ integer ์ ์๋ก ๋ฐ๊พธ์ด ์ฃผ๊ฒ ๋๊ณ ์ด ์ ์๋ฅผ ํตํด ์ ์ ํ ์์น์ ํด๋นํ๋ ๊ฐ๋ค์ ๋ฃ์ด์ฃผ๊ฒ ๋๋ ๊ฒ.
๋ด๋ถ ๊ตฌํ
๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๊ตฌํ
๋ฐฐ์ด์ ์ ์ฅํ๊ธฐ ์ํด key์ hash๋ฅผ ๊ตฌํด์ผํจ
hash function์ผ๋ก key์ hash๋ฅผ ๊ตฌํจ
๊ตฌํด์ง hash๋ฅผ ๋ฐฐ์ด ์ฌ์ด์ฆ๋ก modular(%) ํ ๊ฐ์ index๋ก ์ฌ์ฉ
- hash map ์์์ ์ฌ์ฉ๋๋ hash function์ด ๋ฐํํ๋ ๋ฐ์ดํฐ์ ํ์ ์ ์ ์์ฌ์ผ ๋๋ค.
1
2
3
4
array[hf(key) % M] = value
hf : hash function,
M : hash_map size
์ฌ๊ธฐ์ hf
๋ ํด์ ํจ์(hash function)๋ก, key
๋ฅผ ํน์ ๋ฐฐ์ด ํฌ๊ธฐ ๋ด์ ์ธ๋ฑ์ค๋ก ๋ณํํด์ฃผ๋ ์ญํ ์ ํ๋ค. ์๋ฅผ ๋ค์ด, key
๊ฐ ๋ฌธ์์ด โ์ด๋์โ์ด๋ผ๋ฉด, ํด์ ํจ์๊ฐ ์ด key
๋ฅผ ๋ฐฐ์ด์์ ์ฌ์ฉํ ์ ์๋ ์ ์ํ ์ธ๋ฑ์ค๋ก ๋ฐ๊ฟ ์ ์ ํ ์์น์ ํด๋น ๊ฐ์ ๋ฃ๋๋ค.
ํด์ ์ถฉ๋( Hash Collision)
HashMap์์ ์๋ก ๋ค๋ฅธ key
๋ค์ด ๊ฐ์ hash
๋ฅผ ๊ฐ์ง ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ํด์ ์ถฉ๋์ด๋ค.
key1!=key2
์ด์ง๋งhf(key1)==hf(key2)
hf(key1) != hf(key2)
์ด์ง๋งhf(key1) % M == hf(key2) % M
1๋ฒ์ ๋ฐฉ๋ฒ ๋ฟ๋ง ์๋๋ผ 2๋ฒ์ ๋ฐฉ๋ฒ๋ ํด์ ์ถฉ๋์ ์๋ฏธํ๋ค.
๊ทธ๋ ๋ค๋ฉด ํด์ ์ถฉ๋์ด ์ ๋ฐ์ํ ๊น?
์๋ฒฝํ ํด์ ํจ์(perfect hash function) ๊ตฌํ์ ์ด๋ ค์
- perfect hash function:
key1 โ key2
์ผ ๋hf(key1) โ hf(key2)
๋ฅผ ๋ง์กฑํ๋ ํด์ ํจ์์ด๋ค. ํ์ง๋ง ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ด๋ ค์ด ์ด์ ๋ ํด์ ํจ์์ ํน์ฑ์ ์ ๋ ฅ๊ฐ์ ํฌ๊ธฐ๊ฐ ๊ฑฐ์ ๋ฌดํ๋๋ผ๊ณ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ ๋ ฅ๊ฐ์ ๋ณดํต ๋ฌธ์์ด๋ก ์ด๋ฃจ์ด์ ธ ์์ด ๊ฐ๋ฅํ ๊ฐ์ ๋ฒ์๊ฐ ๋งค์ฐ ๋์ง๋ง, ํด์ ํจ์์ ์ถ๋ ฅ์ 4๋ฐ์ดํธ ํฌ๊ธฐ์ ์ ์ํ ๊ฐ์ผ๋ก ์ ํ๋๋ค. ์ฆ, ๋ฌดํ๋์ ๊ฐ๊น์ด ์ ๋ ฅ๊ฐ์ 4๋ฐ์ดํธ์ ์ ํ๋ ๊ณต๊ฐ์ผ๋ก ๋งคํํด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋ง์น 7์ธ์น ์ฐจ์ 20~30๋ช ์ ํ์ฐ๋ ค๋ ๊ฒ๊ณผ ๊ฐ์ ์ฆ, ์ ํ๋ ๊ณต๊ฐ ๋ด์์ ์ถฉ๋์ด ๋ฐ์ํ ์๋ฐ์ ์๋ค.
- perfect hash function:
key์ ์ฌ์ด์ฆ์ ๋นํด HashMap ์ฌ์ด์ฆ๊ฐ ์๊ธฐ ๋๋ฌธ
- ์ฐ๋ฆฌ๋๋ผ ์ธ๊ตฌ๊ฐ 5,500๋ง ๋ช ์ด์ง๋ง, ๋ด ์๋น์ค ๊ฐ์ ์๋ฅผ ๋ชจ๋ 5,500๋ง ๋ช ์ผ๋ก ์์ํ์ฌ HashMap์ ์ค์ ํ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ์ฌํด์ง๋ค. ๊ทธ๋์ HashMap ํฌ๊ธฐ๋ฅผ ์ฝ 2์ฒ ๊ฐ๋ก ์ก๋๋ค๊ณ ๊ฐ์ ํ๋ฉด, ์๋ key์ ๋ฒ์์ธ 5,500๋ง์ ๋นํด ๋งตํํ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์๋ค. ๊ทธ๋ฌ๋ ๋ด ์๋น์ค๋ฅผ ์ค์ ๋ก ๋๊ฐ ์ฌ์ฉํ ์ง๋ ์ ์ ์๊ณ , ๊ฐ๋ฅํ 5,500๋ง ๊ฐ์ ๋ฒํธ๋ฅผ ํด์ ํจ์๋ฅผ ํตํด ํด์ ๊ฐ์ผ๋ก ๋ณํํ ๋ค, 2์ฒ ๊ฐ ํฌ๊ธฐ๋ก modular ์ฐ์ฐ์ ์ํํด์ผ ํ๋ค. ์ด ๊ฒฝ์ฐ, ์ ํ๋ ํฌ๊ธฐ์ธ 2์ฒ ๊ฐ ์์ ์๋ง์ key๋ฅผ ๋งคํํ๊ฒ ๋๋ฉด์ ์ถฉ๋์ด ๋ฐ์ํ ์๋ฐ์ ์๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก modular ์ฐ์ฐ ๋๋ฌธ์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ํญ์ ์กด์ฌํ๊ฒ ๋๋ค.
ํด์ ์ถฉ๋ ํด๊ฒฐ๋ฐฉ๋ฒ
๊ฐ๋ณ ์ฒด์ด๋(Separate chaining) : ์ถ๊ฐ์ ์ธ ๊ณต๊ฐ์ ํ์ฉํ์ฌ ํด๊ฒฐํ๋ ๋ฐฉ์
Linked List ์ฌ์ฉ
๊ฐ๋ณ ์ฒด์ด๋์ ์ถฉ๋ ๋ฐ์ ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ด๋ค. ์ถ๋์ด ๋ฐ์ํ โ์ค์โ์ โ์ํโ์ ๋ค์ ์์ดํ ์ด โ์ํโ์ธ ํํ๋ก ์๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์ฐ๊ฒฐ๋๋ค.
- ํค์ ํด์ ๊ฐ์ ๊ณ์ฐํ๋ค.
- ํด์ ๊ฐ์ ์ด์ฉํด ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๊ตฌํ๋ค.
- ๊ฐ์ ์ธ๋ฑ์ค๊ฐ ์๋ค๋ฉด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์ฐ๊ฒฐํ๋ค.
- ๋จ์ : ๊ตฌํ์ ์ํ๋ค๋ฉด ํ์์ O(1)์ด์ง๋ง ์ต์ ์ ๊ฒฝ์ฐ, ๋ชจ๋ ํด์ ์ถฉ๋์ด ๋ฐ์ํ๋ค๊ณ ํ๋ฉด O(n)์ด ๋๋ค.
ํด๋น ์ด๋ฏธ์ง๋ ์คํ ์ด๋๋ ์ฑ์ ์ ํ ํ์ฌ(Linear Probing) ๋ฐฉ์์.
์คํ ์ด๋๋ ์ฑ(Open addressing) : ์ถฉ๋ ๋ฐ์ ์ ์ธ์ ํ ๋น์ด์๋ ๊ณต๊ฐ(bucket)์ ์ ์ฅ
์ ํ ํ์ฌ(Linear probing) : ๊ณ ์ ํญ์ผ๋ก ์ด๋ํ์ฌ ๋น ๊ณต๊ฐ์ ์ฐพ์
์ ํ ํ์ฌ ๋ฐฉ์์ ์ถฉ๋์ด ๋ฐ์ํ ๊ฒฝ์ฐ ํด๋น ์์น๋ถํฐ ์์ฐจ์ ์ผ๋ก ํ์ฌ๋ฅผ ํ๋์ฉ ์งํํจ. ํน์ ์์น์ ๊ฐ์ด ๋ค์ด๊ฐ ์์ผ๋ฉด ๋ฐ๋ก ๊ทธ ๋ค์ ์์น๋ฅผ ํ์ธํ๋ ๋ฐฉ์. ์ด๋ ๊ฒ ํ์ฌ๋ฅผ ์งํํ๋ค ๋น์ด์๋ ๊ณต๊ฐ์ ๋ฐ๊ฒฌํ๋ฉด ์ฝ์ ํ๊ฒ ๋จ. ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ์ฅ ๊ฐ๊น์ด ๋ค์ ๋น ์์น๋ฅผ ํ์ฌํด ์ ํค๋ฅผ ์ฝ์ ํ๋ ๊ฒ์ด๋ค.
๋จ์ : ํด์ ํ ์ด๋ธ์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ค์ด ๊ณ ๋ฅด๊ฒ ๋ถํฌ๋์ง ์๊ณ ๋ญ์น๋ ๊ฒฝํฅ์ด ์์. ํด์ ํ ์ด๋ธ ์ด๊ณณ ์ ๊ณณ์ ์ฐ์๋ ๋ฐ์ดํฐ ๊ทธ๋ฃน์ด ์๊ธฐ๋ ํ์์ ํด๋ฌ์คํฐ๋ง(Clustering)์ด๋ผ๊ณ ํ๋๋ฐ ํด๋ฌ์คํฐ๋ค์ด ์ ์ ์ปค์ง๊ฒ ๋๋ฉด ์ธ๊ทผ ํด๋ฌ์คํฐ๋ค๊ณผ ์๋ก ํฉ์ณ์ง๋ ์ผ์ด ๋ฐ์ํ๋ค. ์ด๋ ๊ฒ ๋๋ฉด ํด์ ํ ์ด๋ธ์ ํน์ ์์น์๋ ๋ฐ์ดํฐ๊ฐ ๋ชฐ๋ฆฌ๊ณ , ๋ค๋ฅธ ์์น์๋ ์๋์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ์๋ ์ํ๊ฐ ๋ ์ ์๋ค. ์ด๋ฌํ ํด๋ฌ์คํฐ๋ง ํ์์ ํ์ฌ ์๊ฐ์ ์ค๋ ๊ฑธ๋ฆฌ๊ฒ ํ๊ณ ์ ์ฒด์ ์ผ๋ก ํด์ฑ ํจ์จ์ ๋จ์ด๋จ๋ฆฌ๋ ์์ธ์ด ๋๋ค.
์ฃผ์ํ ์ : ์ค๊ฐ ์ฐ๊ฒฐ๊ณ ๋ฆฌ ์ญํ ์ ํ๋ key์ ์ญ์ ์, ์ด๋ฏธ ์๋ ๊ฐ๋ ์๋ค๊ณ ํ๋จํ ์ ์์.
- ํด๊ฒฐ์ฑ
: ์ญ์ ์ DELETE ๊ฐ์ ์์ง์ ์ธ ํํ๋ก ํ์
DELETE ํ์๋ฅผ ๋ณด๊ณ ๋ค์ ์์น๋ ํ์ธํด๋ด์ผํจ์ ์ ์ ์์. ๋จ์ : DELETE๋ฅผ ๋ง๋๋ฉด ๋ฌด์กฐ๊ฑด ๋ค์ ์์น๋ฅผ ํ์ธํด์ผ ํจ.
์ญ์ ์์น ๋ค์์ open addressing๋ key๋ค์ ํ ๋จ๊ณ์ฉ ์์ผ๋ก ์ฎ๊ฒจ์ค๋ค. ๋จ์ : ์ด๋์ํค๋ ์ถ๊ฐ์ ์ธ ๋น์ฉ ๋ฐ์.
- ํด๊ฒฐ์ฑ
: ์ญ์ ์ DELETE ๊ฐ์ ์์ง์ ์ธ ํํ๋ก ํ์
์ ๊ณฑ ํ์ฌ(Quadratic probing) : ์ ๊ณฑ์๋งํผ ์ด๋ํ์ฌ ๋น ๊ณต๊ฐ์ ์ฐพ์
์ด์ค ํด์ฑ(Double Hashing) : ๋ ๋ค๋ฅธ hash function์ ์ฌ์ฉํ์ฌ ๋น ๊ณต๊ฐ์ ์ฐพ์
Java์์๋ ํด์ ์ถฉ๋์ ์ด๋ป๊ฒ ํด๊ฒฐํ์๊น?
jdk7
๊น์ง๋linked list
๋ฅผ ์ฌ์ฉํseparate chaining
์ ํ์ฉjdk8
์์linked list
์red black tree
๋ฅผ ํผ์ฉํseparate chaining
์ ํ์ฉ
์ ๋ฆฌ
HashMap์ ๋ฐฐ์ด์ด ์์ ์๊ฐ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ ์ ํ์ฉํ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ํตํด ์ฝ์ , ์ญ์ , ๊ฐฑ์ , ์กฐํ๋ฅผ ๋น ๋ฅด๊ฒ ํ ์ ์์ง๋ง, ์ธ๋ฑ์ค๊ฐ ์์ ์ ์์ฌ์ผ ํ๋ค๋ ์ ํ์ด ์๋ค. ๊ทธ๋์ HashMap์์๋ ๋ค์ํ key ๊ฐ์ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ก ๋ณํํ๊ธฐ ์ํด ํด์ ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ์ด ํด์ ํจ์๊ฐ ์ฃผ์ด์ง key๋ฅผ ์ ์ ํ ์ธ๋ฑ์ค๋ก ๋ฐ๊ฟ์ฃผ์ด, ๊ทธ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๊ฒ ํ๋ค.