์๋
ํ์ธ์ Foma ๐ป ์
๋๋ค!
์ค๋์ ์ฐ๋ฆฌ๊ฐ ์์ฃผ ํํ๊ฒ ์ฌ์ฉํ๊ณ ์๋ ํด์ฌ ํ ์ด๋ธ, Swift๋ก ๋งํ๋ฉด ๋์ ๋๋ฆฌ์ ๋ํด์ ์์๋ณผ ๊ฑฐ์์!
์ด๋ฏธ ๊ตฌํ๋์ด ์๋ ์ฝ๋๋ก ์ฝ๊ฒ ์ฌ์ฉํ๋๋ฐ ์ง์ ๊ตฌํํ๋ ค๊ณ ํ๋ ์ง์ง ๋ณต์กํ๋๋ผ๊ตฌ์.
๊ทธ๋์ ์ค๋์ ํด์ฌ ํ ์ด๋ธ์ ๋ํด์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค!
๋ฐ๋ก ์์ํ ๊ฒ์~
ํด์ฌ ํ ์ด๋ธ(Hash Table)์ด๋?
์ ์๋ ์๋์ ๊ฐ์ต๋๋ค.
ํด์ ํ ์ด๋ธ์ ์ปดํจํ ์์ ํค๋ฅผ ๊ฐ์ ๋งคํํ ์ ์๋ ๊ตฌ์กฐ์ธ, ์ฐ๊ด ๋ฐฐ์ด ์ถ๊ฐ์ ์ฌ์ฉ๋๋ ์๋ฃ ๊ตฌ์กฐ์ด๋ค.
ํด์ ํ ์ด๋ธ์ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ(index)์ ๋ฒํท(bucket)์ด๋ ์ฌ๋กฏ(slot)์ ๋ฐฐ์ด๋ก ๊ณ์ฐํ๋ค. - ์ํค ๋ฐฑ๊ณผ -
์ฆ, key์ value๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
key๊ฐ์ผ๋ก value๋ฅผ ํ ๋ฒ์ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ญ์ ,์ฝ์ ,๊ฒ์์ด ํ๊ท O(1)์ด ๊ฑธ๋ฆฌ๋ ์์ฃผ ํจ์จ์ ์ธ ์๋ฃ๊ตฌ์ฃ ์ด์ฃ .
ํ์ง๋ง ํด์ฌ ํจ์๋ฅผ ์ฌ์ฉํด ํค๊ฐ์ ์ธ๋ฑ์ค๋ก ๋ณํํ๋ ๊ณผ์ ์์ ์ถฉ๋์ ๋ง๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ํฐ ๊ณต๊ฐ๋ณต์ก๋๊ฐ ํ์ํ๊ณ
์ถฉ๋์ด ๋ฐ์ํ ์ต์ ์ ๊ฒฝ์ฐ O(n)์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
Hash๋?
์ "ํด์ฌ" ํ ์ด๋ธ์ผ๊น์?
ํด์ฌ๋ ์๋์ ๊ฐ์ ๋ป์ ๊ฐ์ง๊ณ ์์ด์.
- ์๊ฒ ์ฐ๋ค
- ์๋ง์ผ๋ก ๋ง๋ค๋ค
- ์๋ค
์ฆ, ๋ง์๋๋ก ์์ด๋ฒ๋ฆฌ๋ ํ ์ด๋ธ์ ์๋ฏธํ๋ ๊ฒ์ ๋๋ค.
๋ง์๋๋ก ์์ด๋ฒ๋ฆฐ ํ ์ด๋ธ์ด๋ผ๋..? ์ข ์ด์ํ์ฃ ? ์ ์ด๋ ๊ฒ ์ด๋ฆ ์ง์๊ฑด์ง ์ฐจ๊ทผ์ฐจ๊ทผ ์ค๋ช ํด๋๋ฆด๊ฒ์.
ํด์ฌ ํ ์ด๋ธ์ ํน์ ํ ์๋ฃ๊ตฌ์กฐ๋ก ์ด๋ค์ ธ ์๋ ๊ฒ์ด ์๋๋ผ ๊ทธ๋ฅ "๋ฐฐ์ด"๋ก ๋์ด์์ด์.
์ด "๋ฐฐ์ด"์ ํด์ฌ ํ ์ด๋ธ์์๋ ๋ฒํท ํน์ ์ฌ๋กฏ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. (์๋๋ ์ฌ์ด์ฆ๊ฐ 5์ธ ๋ฒํท์ ๋๋ค.)
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ ์ด ๋ฒํท์ ๋ค์ด๊ฐ ํค,๋ฐธ๋ฅ ๊ฐ์ด ์๋์ ๊ฐ์ด ์๋ค๊ณ ๊ฐ์ ํ ๊ฒ์.
Hash Function
๊ทธ๋ฐ๋ฐ ์ด ํค,๋ฐธ๋ฅ ๊ฐ๋ค์ ์ด๋ป๊ฒ ๋ฒํท ์์ ๋ฃ์๊น์?
์ด ๋ ์ฌ์ฉ๋๋ ๊ฒ์ด ๋ฐ๋ก ํด์ฌ ํจ์(Hash Function) ์ ๋๋ค.
๋ฐ๋ก ์๋์ฒ๋ผ ํค,๋ฐธ๋ฅ ๊ฐ์ ๋ฒํท ์์ ๋ง์๋๋ก ์์ด๋ฒ๋ ค์ ๋ฃ์ด๋ฒ๋ฆฌ๊ฒ ๋์์ฃผ๋ ๊ฒ์ด์ฃ .
ํ์ง๋ง ์ง์ง ๋ง๋๋ก ์๋ ๊ฒ์ ์๋๊ณ ํจ์จ์ ์ผ๋ก ์์ด์ ๋ฐฐ์นํด์ผ ํฉ๋๋ค.
1. ๋ฒํท ์์ ๋ค์ด๊ฐ์ผ ํ๋ฏ๋ก ๋ฒํท ์ฌ์ด์ฆ ์ดํ์ธ ์ธ๋ฑ์ค๊ฐ ๋์์ผ ํ๊ฒ ์์ด์ผ ํฉ๋๋ค.
2. ๋ฒํท ์์ ์ธ๋ฑ์ค๊ฐ ์ค๋ณต๋์ง ์๊ฒ ์์ด์ผ ํฉ๋๋ค.
์ ๋๊ฐ์ง ๊ท์น์ ์งํค๋ฉด์ ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก ์์๊น๋ฅผ ๋ง์ด ๊ณ ๋ฏผํ์ ์ ๋ฐฐ๋๋ค์ด ๊ณ ์ํ ๋ํ์ ์ธ 4๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ์ด ์์ต๋๋ค.
1. Division Method
๋ง ๊ทธ๋๋ก Division(๋๋๊ธฐ)๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค.
์ ๋ ฅ๊ฐ์ ๋ฒํท์ ์ฌ์ด์ฆ๋ก ๋๋ ์ ๋๋จธ์ง ๊ฐ์ ์ ์ฒด ๋ฒํท ์ฌ์ด์ฆ์์ ๋บ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์ ๋ ฅ๊ฐ์ด 5์ด๊ณ ๋ฒํท ์ฌ์ด์ฆ๊ฐ 10์ด๋ผ๋ฉด 10 - (5%10) = 5๊ฐ ๋ฉ๋๋ค.
์ด ๋ ๋ฒํท์ ์ฌ์ด์ฆ๋ ์์๋ก ์ ํ๊ณ , 2์ ์ ๊ณฑ์์ ๋จผ ๊ฐ์ ์ฌ์ฉํด์ผ ํจ๊ณผ๊ฐ ์ข๋ค๊ณ ํฉ๋๋ค.
2. Digit Folding
์ด ๋ฐฉ๋ฒ์ ํค๊ฐ์ด ๋ฌธ์์ด์ผ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ธ๋ฐ์.
๋ฌธ์์ด์ ASCII ์ฝ๋๋ก ๋ฐ๊พธ๊ณ ํฉํ ๊ฐ์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๋ง์ฝ FOMA๋ผ๋ฉด F:70, O:79, M:77,A:65 = 291์ด ์ธ๋ฑ์ค๋ก ๋๋ ๊ฒ์ ๋๋ค.
๊ทผ๋ฐ ์ธ๋ฑ์ค๊ฐ ๋ฒํท ์ฌ์ด์ฆ๋ณด๋ค ๋ ํฌ๋ฉด ์ด๋ป๊ฒ ํ ๊น์? ๋ฐ๋ก ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ธ Division Method๋ก
๋๋ ์ ์ฌ์ฉํฉ๋๋ค.
3. Multiplication Method
์ซ์๋ก ๋ Key๊ฐ(k)๊ณผ 0๊ณผ 1์ฌ์ด์ ์ค์ A, 2์ ์ ๊ณฑ์์ธ m์ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ ์์ ๋ง๋ค์ด ์ธ๋ฑ์ค๋ก ์ฌ์ฉํฉ๋๋ค.
floor(k*A mod 1)*m
k๊ฐ 100 , A๊ฐ 0.12345 , m์ด 2³ ์ด๋ผ๋ฉด
100*0.12345%1 * 8 = 2.76 ์ด๋ฏ๋ก ์ธ๋ฑ์ค๋ 2๊ฐ ๋ฉ๋๋ค.
4. Universal Hashing
์ ํด์ฌํจ์๋ฅผ ํฌํจํด ์ฌ๋ฌ ํด์ฌํจ์๋ฅผ ์งํฉ์ ๋ฃ์ด๋๊ณ ๋ฌด์์๋ก ๊บผ๋ด์ ์ธ๋ฑ์ค๋ก ๋ง๋ค์ด ์ฌ์ฉํฉ๋๋ค.
Collision(์ถฉ๋)
์์ ํด์ฌํจ์๋ฅผ ์ฌ์ฉํด์ ์ต๋ํ ์ค๋ณต์ ํผํ๋ค๊ณ ํด๋ ์ค๋ณต๋๋ ์ซ์๊ฐ ๋์ฌ ์ ์๊ฒ ์ฃ ?
์๋ฅผ ๋ค๋ฉด key,value๊ฐ (5,Five) ๊ฐ๊ณผ (15,Fifteen) ๊ฐ์ด ์๊ณ ๋ฒํท์ ํฌ๊ธฐ๊ฐ 10์ด๋ผ๊ณ ํ๊ฒ ์ต๋๋ค.
Division Method๋ฅผ ์ฌ์ฉํ๋ฉด 5/10 -> index =5 , 15/10 -> index = 5๋ก ์ค๋ณต์ด ๋ฐ์ํ๊ฒ ๋์ฃ ?
์ด๊ฒ์ ๋ฐ๋ก ์ถฉ๋์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ด๋ ๊ฒ ์ถฉ๋์ด ๋ฐ์ํ์ ๋๋ ๋ฒํท ์์ ๊ฐ์ ์ด๋ป๊ฒ ์ ์ฅํด์ผ ํ ๊น์?
์ด๊ฒ ๋ํ ์ ๋ฐฐ๋๋ค์ด ๋จผ์ ๊ณ ์ํด๋ธ ๋ฐฉ๋ฒ์ด ๋ํ์ ์ผ๋ก 2๊ฐ์ง ์์ต๋๋ค.
1. Chaining
์ฒด์ด๋์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด์ ์ค๋ณต๋ ๊ฐ์ ์ฐ๊ฒฐํด ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. (์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๋ชจ๋ฅด์๋ฉด ์ฌ๊ธฐ ์์ ํ์ธํด์ฃผ์ธ์!)
์์์ ์ต์ ์ ๊ฒฝ์ฐ O(n)์ ์๊ฐ๋ณต์ก๋๊ฐ ํ์ํ ์๋ ์๋ค๊ณ ํ๋๋ฐ, ์ฒด์ด๋์ ์ฌ์ฉํ๊ณ ๋ชจ๋ ์๊ฐ ์ถฉ๋ํ์ ๊ฒฝ์ฐ
๋ชจ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ํ์ํด์ผ ํ๊ธฐ ๋๋ฌธ์ O(n)์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ญ๋๋ค.
2. Open Addressing
๊ฐ๋ฐฉ ์ฃผ์๋ฒ์ ์ธ๋ฑ์ค๊ฐ ์ค๋ณต๋์๋ค๋ฉด ํด๋น ์ธ๋ฑ์ค๋ฅผ ํผํ๊ณ ๋ค๋ฅธ ๋น์ด์๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
ํ์ง๋ง ๋น์ด์๋ ์ธ๋ฑ์ค์ ๋ฌด์์๋ก ๊ฐ์ ๋ฃ์ผ๋ฉด ์๋๊ฒ ์ฃ ?
๋น์ด์๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ ๊ฒ ๋ํ ์ด๋ฏธ ์ ํด์ง ๊ท์น์ด ๋ํ์ ์ผ๋ก 3๊ฐ์ง ์์ต๋๋ค.
2-1. Linear Probing
์ค๋ณต๋ ์ธ๋ฑ์ค์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋น์ด์๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์์ ๊ฐ์ ๋ฃ์ต๋๋ค.
๋ง์ฝ ์๋์ ๊ฐ์ด 0๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ ์ค๋ณต๋์๋ค๋ฉด
๋น์ด์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์ธ๋ฑ์ค์ธ 1๋ฒ์งธ์ ๊ฐ์ ๋ฃ์ต๋๋ค.
2-2. Quadratic Probing
์ค๋ณต๋ ์ธ๋ฑ์ค์์ ๋น์ด์๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๊ฒฌํ ๋๊น์ง ํญ์ ์ ๊ณฑ๋งํผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์๋์ ๊ฐ์ด 0๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ ์ค๋ณต๋์๋ค๋ฉด 1^2 ๋ค์ธ 1๋ฒ์งธ ์ธ๋ฑ์ค 2^2 ๋ค์ธ 4๋ฒ์งธ ์ธ๋ฑ์ค 3^2 ๋ค์ธ 9๋ฒ์งธ ์ธ๋ฑ์ค....
์ด๋ฐ์์ผ๋ก ์ซ์๋ฅผ ๋๋ ค๊ฐ๋ฉฐ ์ ๊ณฑ์๋งํผ์ ๋ค์ ์ธ๋ฑ์ค๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
2-3. Double Hasing Probing
์ค๋ณต๋ ์ธ๋ฑ์ค์์ ๋น์ด์๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์ ๋๊น์ง ํด์ฌ ํจ์๋ก ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
h1(k)→ ์ถฉ๋ → h1(k)+1*h2(k)→์ถฉ๋→ h1(k)+2*h2(k)→์ถฉ๋→h1(k)+3*h2(k)→... ๋ก ์งํํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด h1(k) = key % 7 , h2(k) = 5 - (key%5) ์ค์ ํ์๋ค๋ฉด ์๋์ ๊ฐ์ด ๋น์ด์๋ ์ธ๋ฑ์ค๋ฅผ ํ์ํ๊ฒ ๋ฉ๋๋ค.
์ค๋์ ์ด๋ ๊ฒ ํด์ฌ ํ ์ด๋ธ์ ๊ฐ๋ ,ํด์ฌ ํจ์,์ถฉ๋,์ถฉ๋๋ฐฉ์ง๋ฒ์ ๋ํด์ ์์๋ณด์์ต๋๋ค.
์๋๋ ๊ตฌํ๊น์ง ํ๋ ค๊ณ ํ์ผ๋ ๊ธ์ ์ฐ๋ค๋ณด๋ ๋๋ฌด ๊ธธ์ด์ ธ์ ๋ค์ ํฌ์คํ ์์ ๊ตฌํ์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
๋๊ธ