๋ชฉ์ฐจ
- ํด์๋?
- ํด์ํจ์๋?
- ํด์ ์ถฉ๋ ์ํ ๋ฐฉ๋ฒ
- Java์์ HashMap ๋์ ๋ฐฉ๋ฒ
ํด์(Hash)๋?
ํด์(Hash) ๊ตฌ์กฐ๋, key-value์์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก์จ, ํด์ ๊ตฌ์กฐ์์๋ key๋ฅผ ์ด์ฉํ์ฌ value๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
ํ์ด์ฌ์ Dicitionary, ๋ฃจ๋น์ Hash, Java์ HashMap, C++์ unordered_map์ด ํด์ ํ ์ด๋ธ์ ๋ํ์ ์ธ ์์ ๋๋ค.
ํด์ ํจ์(Hash Function)์ด๋?
ํด์ ํจ์๋, ์์ ๊ธธ์ด์ ์ ๋ ฅ ๊ฐ์ ๊ณ ์ ๊ธธ์ด์ ์ํธํ๋ ์ถ๋ ฅ์ผ๋ก ๋ณํํด์ฃผ๋ ํจ์์ ๋๋ค. key๋ฅผ ํด์ ํจ์์ ๋ฃ์ด์ ๋์ค๋ ๊ฒฐ๊ณผ๊ฐ hash์ด๋ฉฐ, ๊ฒฐ๊ตญ ํด์ ํจ์๋ key๋ฅผ hash๋ก ๋ง๋ค์ด๋ด๋ ํจ์์ ๋๋ค.
ํด์ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ํฌ๊ฒ ์ธ ๊ฐ์ง์ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ์ด๋ค ์ ๋ ฅ ๊ฐ์๋ ํญ์ ๊ณ ์ ๋ ๊ธธ์ด์ ํด์๊ฐ์ ์ถ๋ ฅํ๋ค.
- ์ ๋ ฅ ๊ฐ์ ์์ฃผ ์ผ๋ถ๋ง ๋ณ๊ฒฝ๋์ด๋ ์ ํ ๋ค๋ฅธ ๊ฒฐ๊ณผ ๊ฐ์ ์ถ๋ ฅํ๋ค.(๋์ฌํ ํจ๊ณผ)
- ์ถ๋ ฅ๋ ๊ฒฐ๊ด๊ฐ์ ํตํด ์ ๋ ฅ๊ฐ์ ์ ์ถํ ์ ์๋ค.
๊ฐ๊ฐ์ ํน์ง์ ํ๋์ฉ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ์ฒซ ๋ฒ์งธ, '์ด๋ค ์ ๋ ฅ ๊ฐ์๋ ํญ์ ๊ณ ์ ๋ ๊ธธ์ด์ ํด์๊ฐ์ ์ถ๋ ฅํ๋ค.'๋ผ๋ ํน์ง์ ์ ๋ ฅ๊ฐ์ด ์งง๋ ๊ธธ๋ ํญ์ ๋์ผํ ๊ธธ์ด์ ํด์๊ฐ์ผ๋ก ์ถ๋ ฅ๋๋ค๋ ์๋ฏธ์ ๋๋ค. ํด์๋ ํฌ๊ฒ MD ์๊ณ ๋ฆฌ์ฆ ํน์ SHA ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋ฐ, ๊ฐ๋จํ๊ฒ SHA ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ฒซ ๋ฒ์งธ ํน์ง์ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
์๋๋ ์ ๋ ฅ๊ฐ์ SHA256 ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ํด์ฌ๊ฐ์ ์์ฝ๊ฒ ์ถ๋ ฅ์์ผ ์ฃผ๋ ์ฌ์ดํธ์ ๋๋ค.(https://www.convertstring.com/ko/Hash/SHA256)
์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ณด๋ฉด ์ ๋ ฅ๊ฐ์ ๊ธธ์ด์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ๊ณ ์ ๋ ๊ธธ์ด์ ํด์๊ฐ์ ์ถ๋ ฅํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ํด์ ํจ์๋ ์ด๋ค ๊ธธ์ด์ ์ ๋ ฅ๊ฐ์ด ๋ค์ด์ค๋๋ผ๋ 256๋นํธ์ ๊ณ ์ ๋ ๊ฒฐ๊ด๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
๋ ๋ฒ์งธ, '์ ๋ ฅ ๊ฐ์ ์์ฃผ ์ผ๋ถ๋ง ๋ณ๊ฒฝ๋์ด๋ ์ ํ ๋ค๋ฅธ ๊ฒฐ๊ณผ ๊ฐ์ ์ถ๋ ฅํ๋ค.(๋์ฌํ ํจ๊ณผ)'๋ผ๋ ํน์ง์ ์ ๋ ฅ๊ฐ์ด ํ ๊ธ์๋ง ๋ฐ๋์ด๋ ์ด์ ๊ณผ ์ ํ ๋ค๋ฅธ ๊ฒฐ๊ด๊ฐ์ ์ถ๋ ฅํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์์ธํ ๋ณด๋ฉด ๋ง์นจํ ํ๋๋ง ์ ๊ฑฐํ์ ๋ฟ์ธ๋ฐ ์ฒ์์ ์ถ๋ ฅ๊ฐ๊ณผ ์์ ํ ๋ค๋ฅธ ๊ฒฐ๊ด๊ฐ์ ์ถ๋ ฅํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ถ๊ฐ์ ์ผ๋ก ํด์ํจ์๋ ์ ๋ ฅ๊ฐ์ผ ๋์ผํ ๊ฒฝ์ฐ์๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ด๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
์ธ ๋ฒ์งธ, '์ถ๋ ฅ๋ ๊ฒฐ๊ด๊ฐ์ ํตํด ์ ๋ ฅ๊ฐ์ ์ ์ถํ ์ ์๋ค'๋ผ๋ ํน์ง์ ๋ง ๊ทธ๋๋ก ์ถ๋ ฅ๊ฐ์ ํตํด ์ ๋ ฅ๊ฐ์ ์์๋ผ ์ ์๋ค๋ ๋ง์ ์๋ฏธํฉ๋๋ค. ์ ์ด๋ฏธ์ง๋ค์ ์ดํด๋ณด์์ ๋ ์ถ๋ ฅ๊ฐ์ ํตํด ์ ํ ์ ๋ ฅ๊ฐ์ ์ ์ถํ ์ ์์์ต๋๋ค.
ํด์ ์ถฉ๋(Hash Collision)์ด๋?
์์์ ์ดํด๋ณธ ํจ์์๋ ๋จ์ ์ด ์กด์ฌํ๋๋ฐ, ํด์ ํจ์๋ ์ ๋ ฅ ๊ฐ์ ๊ธธ์ด๊ฐ ์ด๋ป๋ ๊ณ ์ ๋ ๊ธธ์ด์ ๊ฐ์ ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ๊ฐ์ด ๋ค๋ฅด๋๋ผ๋ ๊ฐ์ ๊ฒฐ๊ด๊ฐ์ด ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ํด์ ์ถฉ๋(Hash Collision)์ด๋ผ๊ณ ํํํ๋ฉฐ, ํด์ ์ถฉ๋์ด ์ ์ ํจ์๊ฐ ์ข์ ํด์ํจ์๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
์ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด "ARGOS"์ "MINIBEEF"๋ผ๋ key๊ฐ์ด ํด์ ํจ์๋ฅผ ๊ฑฐ์ณค๋๋ฐ ๋ ๋ค 15๋ผ๋ ๋์ผํ ๊ฐ์ ์ถ๋ ฅํ์ต๋๋ค. ์ด๋ฅผ ํด์ ์ถฉ๋์ด๋ผ๊ณ ํ๋๋ฐ ์ข ๋ ์์ธํ๊ฒ ์์๋ณด๊ธฐ ์ํด์ ๋จผ์ ์ ์ฌ์จ(load factor)์ ๊ฐ๋ ์ ์์์ผ ํฉ๋๋ค.
์ ์ฌ์จ(load factor)์ด๋ ํด์ ํ ์ด์ ํฌ๊ธฐ์ ๋ํ ํค์ ๊ฐ์์ ๋น์จ์ ๋ปํฉ๋๋ค. ์ฆ ํค์ ๊ฐ์๋ฅผ K, ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ๋ฅผ N์ด๋ผ๊ณ ํ์ ๋ ์ ์ฌ์จ์ K/N์ด ๋ฉ๋๋ค.
ํด์ ์ถฉ๋์ด ๋ฐ์ํ์ง ์์ ๊ฒฝ์ฐ ํด์ ํ ์ด๋ธ์ ํ์, ์ฝ์ , ์ญ์ ์ฐ์ฐ์ ๋ชจ๋ O(1)์ ์คํ๋์ง๋ง, ์ถฉ๋์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋ ํ์๊ณผ ์ญ์ ์ฐ์ฐ์ด ํค์ ๊ฐ์์ธ O(K)๋งํผ์ด ๊ฑธ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
์์ ๊ฐ์ด HashMap์ ํค ์งํฉ์ธ ์ ์์ญ๊ณผ, ๊ฐ ์งํฉ์ธ ๊ณต์ญ์ ๋์์ ํด์ ํจ์๋ฅผ ์ด์ฉํ๊ธฐ์ ํด์ ์ถฉ๋์ด ํ๋๋ ์ผ์ด๋์ง ์๋ ํด์ ํจ์๋ฅผ ๋ง๋๋ ๊ฒ์ ๋น๋๊ธฐ์ง ์๋ฆฌ์ ์ํด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ ํด์ ์ถฉ๋์ ๋ํด ์์ ํ๋ค๋ ํด์ ํจ์๋ '์ถฉ๋์ด ๊ฑฐ์ ์ผ์ด๋์ง ์๋๋ค'๋ผ๋ ์๋ฏธ๋ฅผ ๋ปํฉ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ํด์ ํจ์๊ฐ ๋ฌดํํ ๊ฐ์ง์์ ์ ๋ ฅ๊ฐ์ ๋ฐ์ ์ ํํ ๊ฐ์ง์์ ์ถ๋ ฅ๊ฐ์ ์์ฑํ๋ ๊ฒฝ์ฐ์๋ ๋น๋๊ธฐ์ง ์๋ฆฌ์ ์ํด ํด์ ์ถฉ๋์ ํญ์ ์กด์ฌํ๋ฉฐ, ํด์ ํ ์ด๋ธ์ ์ถฉ๋์ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ํด์ ์ถฉ๋์ ์ํํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
ํด์ ์ถฉ๋ ์ํ ๋ฐฉ๋ฒ
ํด์ ์ถฉ๋์ ์ํํ๋ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ Open Addressing๊ณผ Separating Chaining ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- ๊ฐ๋ฐฉ ์ฃผ์๋ฒ(open addressing): ํด์ ํ ์ด๋ธ ํฌ๊ธฐ๋ ๊ณ ์ ํ๋ฉด์ ์ ์ฅํ ์์น๋ฅผ ์ฐพ๋๋ค.
- ๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ (separate chaining): ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ๋ฅผ ์ ์ฐํ๊ฒ ๋ง๋ ๋ค.
๊ฐ๊ฐ์ ๋ฐฉ๋ฒ์ ๋ํด ํ๋ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
1. ๊ฐ๋ฐฉ ์ฃผ์๋ฒ(open-address)
open addressing์ ํ ๋ฒํท ๋น ๋ค์ด๊ฐ ์ ์๋ ์ํธ๋ฆฌ๋ ํ๋์ด์ง๋ง ํด์ ํจ์๋ก ์ป์ ์ฃผ์๊ฐ ์๋, ๋ค๋ฅธ ์ฃผ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฆ, open addressing์ ์ฃผ์ ๋ชฉ์ ์ ์ ์ฅํ ์ํธ๋ฆฌ๋ฅผ ์ํ ๋ค์์ slot์ ์ฐพ๋ ๊ฒ์ธ๋ฐ ์์๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆผ์ ์ดํด๋ณด๋ฉด, John Smith์ Sandara Dee 152๋ฒ์ผ๋ก ๋์ผํ ๊ฐ์ด ๋์ต๋๋ค. ํด์ ์ถฉ๋์ด ์ผ์ด๋ ๊ฒฝ์ฐ์ธ๋ฐ, Sandara Dee๋ 152๋ฒ์ ๋ฎ์ด ์์์ง์ง ์๊ณ , ๋ค์ ๋น ๋ฒํท์ธ 153๋ฒ์ ๋ค์ด๊ฐ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ค์ key์ธ Ted Baker๋ 153์ด๋ผ๋ ๊ฐ์ด ๋์์ง๋ง ์ด๋ฏธ Sandra Dee๊ฐ ์ ์ฅ๋์ด ์๊ธฐ์ ์ถฉ๋์ด ๋ฐ์ํด์ ๋ค์ ๋น ๋ฒํท์ธ 154๋ฒ์ ์ ์ฅ๋์์ต๋๋ค.
์์๋ ๋ฌด์กฐ๊ฑด ํ ์นธ์ฉ ์ฐพ๋ ๋ฐฉ๋ฒ์ ์๋ก ๋ค์์ง๋ง ๋น์ด์๋ ์นธ์ ์ฐพ์๊ฐ๊ธฐ ์ํด์ ์๋์ ๊ฐ์ ๋ค์ํ ๋ฐฉ๋ฒ๋ค์ด ์กด์ฌํฉ๋๋ค.
- Linear probing(์ ํ ํ์ฌ๋ฒ)
- Quadratic probing(์ ๊ณฑ ํ์ฌ๋ฒ)
- Dobule hashing(์ด์ค ํด์ฑ)
Linear Probing(์ ํ ํ์ฌ๋ฒ)
๋ง ๊ทธ๋๋ก ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ ์ ํ์ผ๋ก ์์ฐจ์ ๊ฒ์์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํด์ ํจ์๋ก ๋์จ ํด์ ๊ฐ(index)์ ์ด๋ฏธ ๋ค๋ฅธ ๊ฐ์ด ์ ์ฅ๋์ด ์๋ค๋ฉด, ํด๋น ํด์๊ฐ์์ ๊ณ ์ ๋ ํญ๋งํผ ์ฎ๊ฒจ ๋ค์ ๋น์นธ์ ์ฐพ์๊ฐ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด 52๋ผ๋ ๊ฐ์ ํด์ฑํ์ฌ ํด์๊ฐ 2์ ์ ๊ทผํ์ง๋ง ์ด๋ฏธ ์กด์ฌํ์ฌ ์ถฉ๋์ด ๋ฌ์์ ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์์์ ๊ณ ์ ๋ ํฌ๊ธฐ์ธ ํ ์นธ์ฉ ์ฎ๊ฒจ์ ๋น์นธ์ ์ฐพ์๊ฐ๋ฉฐ ์ต์ข ์ ์ผ๋ก 6์ ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ์๋ ๊ฐ๋จํ์ง๋ง ํน์ ํด์ ๊ฐ์ ์ฃผ๋ณ์ด ๋ชจ๋ ์ฑ์์ ธ ์๋ ์ผ์ฐจ ๊ตฐ์งํ(primary clustering) ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ์ด๋ฏธ์ง๋ง ํด๋ 2~6๊น์ง ๋ฐ์ดํฐ๊ฐ ๋ชจ์ฌ์๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ, ๋ชจ๋ ํค๊ฐ 2๋ผ๋ ๊ฐ์ผ๋ก ํด์๊ฐ์ด ๋์ฌ ๊ฒฝ์ฐ ๊ตฐ์งํ ๋ ๊ฐ๋ค์ ์์ฐจ์ ์ผ๋ก ๋ฐฉ๋ฌธํ ํ ๋ฐ ํด์ ์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ Linear Probing(์ ํ ํ์ฌ๋ฒ)์ ํด์ ์ถฉ๋์ด ํด์ ๊ฐ ์ ์ฒด์ ๊ท ๋ฑํ๊ฒ ๋ฐ์ํ ๋ ์ ์ฉํ ๋ฐฉ๋ฒ์ ๋๋ค.
Quadratic probing(์ ๊ณฑ ํ์ฌ๋ฒ)
์ ๊ณฑ ํ์ฌ๋ฒ์ ์์ ์ ํ ํ์ฌ๋ฒ๊ณผ ๋์ผํ๋ฐ, ํ์ฌ ํญ์ด ๊ณ ์ ๋ ๊ฐ์ด ์๋๋ผ ์ ๊ณฑ์ผ๋ก ๋์ด๋๋ ์ ์ ์์ด ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ฆ, ๋น ๋ฒํท์ slot์ ์ฐพ๊ธฐ ์ํด ๊ณ ์ ๋ ๊ฐ์ด ์๋ 2^1, 2^2, 2^3.... ์ ๋ฐฉ์์ผ๋ก ์ด๋ํด์ ๋น์นธ์ ์ฐพ์ต๋๋ค.
์ ๊ณฑ ํ์ฌ๋ฒ์ ์ด์ฉํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ๋ฐ์ง๋๊ฐ ์ ํ ํ์ฌ๋ฒ๋ณด๋ค ๋ฎ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด์๊ฐ๊น์ง ์ํฅ์ ๋ฐ์์ ์ฐ์์ ์ผ๋ก ์ถฉ๋์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค. ํ์ง๋ง ์ ํ ํ์ฌ๋ฒ๋ณด๋ค๋ ์บ์์ ์ฑ๋ฅ์ด ๋จ์ด์ ธ์ ์๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ปค์ง๊ฒ ๋๋ฉด์ L1, L2 ์บ์ ์ ์ค๋ฅ (hit ratio)์ด ๋ฎ์์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
Dobule hashing(์ด์ค ํด์ฑ)
์ด์คํด์ฑ๋ฒ ๋๋ ์ฌํด์ฑ์ ํญ๋ชฉ์ ์ ์ฅํ ๋ค์ ์์น๋ฅผ ๊ฒฐ์ ํ ๋, ์๋ ํด์ ํจ์์ ๋ค๋ฅธ ๋ณ๊ฐ์ ํด์ ํจ์๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํญ๋ชฉ๋ค์ ์ด์ ๋ฐฉ๋ฒ๋ค๋ณด๋ค ํด์ ํ ์ด๋ธ์ ๋ณด๋ค ๊ท ์ผํ๊ฒ ๋ถํฌ์ํฌ ์ ์์ผ๋ฏ๋ก ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ด๋ผ ํ ์ ์์ต๋๋ค.
ํ๋๋ ์ฒ์์ key๋ฅผ ์ ์ฅํ index๋ฅผ ์ฐพ๊ธฐ ์ํ ๊ฒ์ด๊ณ , ๋๋จธ์ง ํ๋๋ ์ถฉ๋ ๋ฐ์ ์ ์ ์ฅํ index๋ฅผ ์ฐพ๊ธฐ ์ํ ๊ฒ์ด๋ฉฐ, ์ถฉ๋ ๋ฐ์ ์ ์ ์ฅํ index๋ฅผ ์ฐพ๊ธฐ ์ํ ํด์ ํจ์๋ ์ฒซ ๋ฒ์งธ ํด์ ํจ์์ ๋ฌ๋ผ์ผ ํฉ๋๋ค.
์ด์ค ํด์ฑ๋ฒ์ ์ถฉ๋์ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ฅ ์ ์ผ๋, ์บ์์ ์ฑ๋ฅ์ Linear Probing, Quadratic Probing๊ณผ ๋น๊ตํ์ ๋ ๊ฐ์ฅ ์ข์ง ์์ผ๋ฉฐ, ์ถ๊ฐ์ ์ธ ํด์ ์ฐ์ฐ์ด ๋ค์ด๊ฐ๊ธฐ์ ๊ฐ์ฅ ๋ง์ ์ฐ์ฐ๋์ ์๊ตฌํ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
๊ฐ๋ฐฉ ์ฃผ์๋ฒ(open-address) ์ ๋ฆฌ
ํ์ฌ ๋ฐฉ์์ ๋ฐ๋ผ open-addressing ํด์์ ์ฑ๋ฅ์ด ๋ฌ๋ผ์ง์ง๋ง, ๊ฐ์ฅ ์น๋ช ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ์์๋ ๋ฐ๋ก ํด์ฌ ํ ์ด๋ธ์ ์ ์ฌ์จ์ธ load factor(์ ์ฒด ์ฌ๋กฏ์์ ์ฌ์ฉ ์ค์ธ ์ฌ๋กฏ ๋น์จ)์ ๋๋ค. Load Factor๊ฐ 100%๋ก ์ฆ๊ฐํ ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ฑฐ๋ ์ฝ์ ํ๊ธฐ ์ํด ํ์ํ ํ์ฌ ํ์๋ ๋น์ฝ์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค. ์ผ๋จ ํ ์ด๋ธ์ด ๊ฝ ์ฐจ๊ฒ ๋๋ฉด probing์ด ์คํจํ์ฌ ๋๋๋ฒ๋ฆฌ๊ธฐ๋ ํ๋๋ฐ, ์๋ ํ๋ Load Factor์ ๋ฐ๋ฅธ ํ๊ท ์ฑ๊ณต ํ์์์ ์คํจ์๋ฅผ ๋ณด์ฌ์ค๋๋ค.(http://egloos.zum.com/sweeper/v/925740)
์ ํ๋ฅผ ์ ๋ณด๋ฉด ์๋ฌด๋ฆฌ ์ข์ ํด์ ํจ์๋ฅผ ์ฐ๋๋ผ๋ ์ผ๋ฐ์ ์ผ๋ก Load Factor๋ 80% ์ด๋ด๊น์ง๋ง ์ข์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ํนํ Linear probing ๋ฐฉ์์ด Load Factor๊ฐ ๋์์๋ก ๊ฐ์ฅ ๊ธ๊ฒฉํ๊ฒ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ Load Factor๊ฐ ์๊ณ์ ์ ๋์ด ํฐ ๊ฒฝ์ฐ์ ์ฑ๋ฅ์ double hashing > quadratic > linear์ ์์๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
2. ๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ (separate chaining)
๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ์ ๊ฐ๋ฐฉ ์ฃผ์๋ฒ(open-addressing)๊ณผ๋ ๋ฌ๋ฆฌ ํ ๋ฒํท(์ฌ๋กฏ) ๋น ๋ค์ด๊ฐ ์ ์๋ ์ํธ๋ฆฌ์ ์์ ์ ํ์ ๋์ง ์์ต๋๋ค. ์ด๋ ๋ฒํท์๋ ๋งํฌ๋ ๋ฆฌ์คํธ(linked list)๋ ํธ๋ฆฌ(tree)๋ฅผ ์ฌ์ฉํฉ๋๋ค.(์กฐ๊ธ ๋ค์ ์์ธํ๊ฒ ์ค๋ช ํ๊ฒ ์ง๋ง ์๋ฐ์์๋ ๋ ๋ค ์ฌ์ฉํฉ๋๋ค.)
์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ณด๋ฉด ๋์ผํ ๊ฐ๋ค์ ๋ฆฌ์คํธ๋ก ์ฐ๊ฒฐ๋์ด ์ ์ฅ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํด์ ์ถฉ๋์ด ์ผ์ด๋๋๋ผ๋ ๋ฆฌ์คํธ๋ก ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋๊ธฐ ๋๋ฌธ์ index๊ฐ ๋ณํ์ง ์๊ณ ๋ฐ์ดํฐ ๊ฐ์์ ์ ์ฝ์ด ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ํ์ง๋ง open addressing ๋ฐฉ๋ฒ๊ณผ ๋น๊ตํ์ ๋ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ์ํ๋ฉฐ, ํ ์ด๋ธ์ ์ ์ฌ์จ(Load Factor)์ ๋ฐ๋ผ ์ ํ์ ์ผ๋ก ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ ์ฌ์จ์ด ์์ ๊ฒฝ์ฐ ์ฆ, ๋ฐ์ดํฐ๊ฐ ์ ์ ๊ฒฝ์ฐ์๋ open addressing ๋ฐฉ์์ด ํ๊ท ์ ์ผ๋ก ๋ ๋น ๋ฆ ๋๋ค.
์์ 2๊ฐ์ง ๋ฐฉ๋ฒ ์ด์ธ์๋ ํด์ ํ ์ด๋ธ์ ์ ์ฌ์จ์ด ๋์์ง ๊ฒฝ์ฐ์๋ ํฌ๊ธฐ๊ฐ ๋ ํฐ ์๋ก์ด ํ ์ด๋ธ์ ๋ง๋ค์ด์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ฒจ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ํ ๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ์ ์ฌ์ฉํ์ ๊ฒฝ์ฐ์ ์ฌํด์ฑ์ ํตํด์ ๋๋ฌด ๊ธธ์ด์ง ๋ฆฌ์คํธ์ ๊ธธ์ด๋ฅผ ๋๋์ด์ ๋ค์ ์ ์ฅํ ์๋ ์์ต๋๋ค.
์ธ์ด๋ณ ํด์ ์ถฉ๋ ์ํ ๋ฐฉ๋ฒ
์ธ์ด | ๋ฐฉ์ |
C++ | ๊ฐ๋ณ ์ฒด์ด๋ |
Java | ๊ฐ๋ณ ์ฒด์ด๋ |
Go | ๊ฐ๋ณ ์ฒด์ด๋ |
Ruby | ์คํ ์ด๋๋ ์ฑ |
Python | ์คํ ์ด๋๋ ์ฑ |
Java์์ HashMap ๋์ ๋ฐฉ๋ฒ
์ฌ๊ธฐ์๋ถํฐ๋ ๋ค์ด๋ฒ d2์ ๋ฌธ์๋ฅผ ๋ณด๊ณ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์์ธํ ๋ณด๊ณ ์ถ์ ํด๋น ๋งํฌ๋ฅผ ํตํด ํ์ธํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋จผ์ ์๋ฐ์๋ HashMap๊ณผ HashTable์ด ์กด์ฌํฉ๋๋ค. ๋ ๋ค Java์์ ์ ๊ณตํ๋ API๋ก์จ ๋ ๋ค Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ต๋๋ค. ํ์ง๋ง HashMap์ ๋ณด์กฐ ํด์ ํจ์(Additional Hash Function)๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ณด์กฐ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๋ HashTable์ ๋นํ์ฌ ํด์ ์ถฉ๋(hash collision)์ด ๋ ๋ฐ์ํ ์ ์์ด ์๋์ ์ผ๋ก ์ฑ๋ฅ์ ์ด์ ์ด ์์ต๋๋ค. ๋ํ HashTable์ ์ฑ๋ฅ์ ๊ฐ์ ์ด ๋ ์ด์ ์ผ์ด๋์ง ์์ง๋ง, HashMap์ ์ง์์ ์ผ๋ก ๊ฐ์ ์ด ๋๊ณ ์์ต๋๋ค.
Java HashMap์์ ์ฌ์ฉํ๋ ๋ฐฉ์์ Separate Channing์ ๋๋ค. Open Addressing์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๋ ์ฒ๋ฆฌ๊ฐ ํจ์จ์ ์ด๊ธฐ ์ด๋ ค์ด๋ฐ, HashMap์์ remove() ๋ฉ์๋๋ ๋งค์ฐ ๋น๋ฒํ๊ฒ ํธ์ถ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ HashMap์ ์ ์ฅ๋ ํค-๊ฐ ์ ๊ฐ์๊ฐ ์ผ์ ๊ฐ์ ์ด์์ผ๋ก ๋ง์์ง๋ฉด, ์ผ๋ฐ์ ์ผ๋ก Open Addressing์ Separate Chaining๋ณด๋ค ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ค. Open Addressing์ ๊ฒฝ์ฐ ํด์ ๋ฒํท์ ์ฑ์ด ๋ฐ๋๊ฐ ๋์์ง์๋ก Worst Case ๋ฐ์ ๋น๋๊ฐ ๋ ๋์์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.(์ ์ฌ์จ)
๋ฐ๋ฉด Separate Chaining ๋ฐฉ์์ ๊ฒฝ์ฐ ํด์ ์ถฉ๋์ด ์ ๋ฐ์ํ์ง ์๋๋ก '์กฐ์ 'ํ ์ ์๋ค๋ฉด Worst Case์ ๊ฐ๊น์ด ์ผ์ด ๋ฐ์ํ๋ ๊ฒ์ ์ค์ผ ์ ์์ต๋๋ค.
Java 7๊ณผ Java 8์ HashMap์์์ Separate Chaining
Java 2๋ถํฐ Java 7๊น์ง์ HashMap์์ Separate Chaining ๊ตฌํ ์ฝ๋๋ ์กฐ๊ธ์ฉ ๋ค๋ฅด์ง๋ง, ๊ตฌํ ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ ๊ฐ์์ต๋๋ค. ํ์ง๋ง Java 8๋ถํฐ ๋ณ๊ฒฝ๋์๋๋ฐ ์ด์ ๊น์ง๋ Separate Chaining์์ ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ๊ณ ์ ์ ์ผ๋ก ์ฌ์ฉํ์ง๋ง Java 8 ์ดํ๋ถํฐ๋ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ๋ง์์ง๋ฉด ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ ๋๋ ์กฐํ์ ๋ํ ์๊ฐ๋ณต์ก๋๊ฐ O(N/M)์ ๋ณด์ฌ์คฌ์ง๋ง ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด O(log N/M)์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ์ผ์ ์ด์์ผ ๋์๋ ๋งํฌ๋ ๋ฆฌ์คํธ ๋์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ์ด์ ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ๋ฌผ๋ก ๊ณ ์ ์ ์ผ๋ก ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ๋ ๊ตฌํ๋์ด ์๋ ๊ฒ์ ์๋๋๋ค. ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ์ ๋ํ ๊ธฐ์ค์ ํ๋์ ํด์ ๋ฒํท์ ํ ๋น๋ ํค-๊ฐ ์์ ๊ฐ์์ ๋๋ค.
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด, Java 8 HashMap์์๋ ์์ ํํ๋ก ๊ธฐ์ค์ ์ ํ๊ณ ์์ต๋๋ค. ์ฆ ํ๋์ ํด์ ๋ฒํท์ 8๊ฐ์ ํค-๊ฐ ์์ด ๋ชจ์ด๋ฉด ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ํธ๋ฆฌ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
๋ง์ฝ ํด๋น ๋ฒํท์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ์ฌ ๊ฐ์๊ฐ 6๊ฐ์ ์ด๋ฅด๋ฉด ๋ค์ ๋งํฌ๋ ๋ฆฌ์คํธ๋ก ๋ณ๊ฒฝํ๋๋ฐ, ํธ๋ฆฌ๋ ๋งํฌ๋ ๋ฆฌ์คํธ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ง๊ณ , ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ์ ์ ๋ ํธ๋ฆฌ์ ๋งํฌ๋ ๋ฆฌ์คํธ์ Worst Case ์ํ ์๊ฐ ์ฐจ์ด ๋น๊ต๋ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. 8๊ณผ 6์ผ๋ก 2 ์ด์์ ์ฐจ์ด๋ฅผ ๋ ๊ฒ์, ๋ง์ฝ ์ฐจ์ด๊ฐ 1์ด๋ผ๋ฉด ์ด๋ค ํ ํค-๊ฐ ์์ด ๋ฐ๋ณต๋์ด ์ฝ์ /์ญ์ ๋๋ ๊ฒฝ์ฐ ๋ถํ์ํ๊ฒ ํธ๋ฆฌ์ ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ๋ณ๊ฒฝํ๋ ์ผ์ด ๋ฐ๋ณต๋์ด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ์ฌ์ฉํ๋ ํธ๋ฆฌ๋ Red-Black Tree์ ๋๋ค.
๋ฐ๋ผ์ Java HashMap์์๋ ํด์ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํ์ฌ Separate Chaining๊ณผ ๋ณด์กฐ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉฐ, Java 8์์๋ Separate Chaining์์ ๋งํฌ๋ ๋ฆฌ์คํธ ๋์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค๋ ๊ฒ์ผ๋ก ์ ๋ฆฌํ ์ ์๊ฒ ์ต๋๋ค.
์ฐธ๊ณ
'BackEnd๐ฑ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Java์ ์์ธ ์์ฑ ๋น์ฉ์ ๋น์ธ๋ค (0) | 2023.03.10 |
---|---|
๋๋ฏธํฐ ๋ฒ์น (Law of Demeter)์ด๋? (2) | 2023.02.01 |
์๋ฐ์์ ๋์์ฑ์ ํด๊ฒฐํ๋ ๋ค์ํ ๋ฐฉ๋ฒ๊ณผ Redis์ ๋ถ์ฐ๋ฝ (5) | 2023.01.08 |
[Java] Checked Exception๊ณผ UnChecked Exception (2) | 2022.12.18 |
[Java] ์๋ฐ์์ '+' ์ฐ์ฐ์ ํตํ ๋ฌธ์์ด ํฉ์น๊ธฐ๋ฅผ ์ง์ํ๋ผ (1) | 2022.07.19 |
[OOP] ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น 5๊ฐ์ง (0) | 2022.06.02 |
๋๊ธ