Hash Table - ehrldyd15/Swift_Skills GitHub Wiki
Hash Table
1. ํด์ ํ ์ด๋ธ์ด๋?
Key - Value๋ก ๊ฐ์ ์ ์ฅํ๋ ๋์
๋๋ฆฌ๋ ํด์ ํ
์ด๋ธ๋ก ๊ตฌํ๋์ด ์๋ค.
ํด์ ํ
์ด๋ธ๋ ๋น์ฐํ Key - Value๋ก ๊ฐ์ ์ ์ฅํ๋ค.
ํด์ ํ ์ด๋ธ์ ๋ด๋ถ์ ์ผ๋ก๋ ๋ฐฐ์ด๋ก ๊ตฌํ๋์ด ์๋ค.
ํน์ Key - Value๋ฅผ ์ ์ฅํ๋ค๊ณ ํ๋ฉด
ํด๋น Key๋ฅผ ํด์ํจ์๋ฅผ ํตํด ํด์๋ฅผ ํ๊ณ ,
๊ฒบ๊ณผ๊ฐ์ธ ํด์ ์ฃผ์๊ฐ์ ํด๋นํ๋ ํด์ ํ ์ด๋ธ ์ฌ๋กฏ์ Value๋ฅผ ์ ์ฅํ๋ค๋ ์๋ฏธ์ด๋ค.
์๋ฅผ๋ค์ด ์ธ๊ฐ์ Key - Value๋ฅผ ํด์ ํ ์ด๋ธ์ ์ ์ฅํ๋ ค๊ณ ํ๋ค๊ณ ํ์

๋ง์ฝ ์์๋๋ก 0, 1, 2์ ์ ์ฅ์ด ๋๋ค๋ฉด ์ด๊ฒ์ ์ผ๋ฐ ๋ฐฐ์ด์ด์ง ํด์ ํ ์ด๋ธ์ด ์๋๋ค.
ํด์ ํ ์ด๋ธ์ ์๋ ์ฒ๋ผ ์์๋ฅผ ์งํค์ง ์๊ณ ์ ์ฅ๋๋ค.

Key๋ง ๊ฐ์ง๊ณ ํด์ํ ์ด๋ธ์ ์ ์ฅ๋ ๊ฐ์ ์ ๊ทผํด์ผ ํ๋ค.
ํ์ง๋ง ํด์ ํ ์ด๋ธ์ ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ index๋ก๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ ๋ค๋ฉด Key๋ฅผ ํตํด์ ํด์ ํ ์ด๋ธ์ index๋ฅผ ์ ์ ์์ด์ผ๋ง ํด๋น Value์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๊ฒ์ด ํด์ ํจ์ ์ด๋ค.


ํด์ ํ ์ด๋ธ์ด๋ผ๋ ๊ฒ์ Key๋ผ๋ ๊ฒ์ ํด์ ํจ์๋ฅผ ์ด์ฉํด์ ํด์ ์ฃผ์๊ฐ(ํด์ ํ ์ด๋ธ์ index)์ผ๋ก ๋ฐ๊พธ๊ณ ,
ํด์ ์ฃผ์๊ฐ(ํด์ ํ ์ด๋ธ์ index)๋ฅผ ํตํด์ ํด์ ํ ์ด๋ธ์ ์ ๊ทผํ์ฌ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ ์ฅํ๋ ํํ๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
2. ํด์ ํ ์ด๋ธ ๊ตฌํ
2-1 ํด์ ํ ์ด๋ธ ๋ง๋ค๊ธฐ
ํด์ ํ ์ด๋ธ์ ๋ฐฐ์ด๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ ๋ค์์ฒ๋ผ ๋ฐฐ์ด๋ก ๋ง๋ค์ด๋ณด์
var hashTable: [String?] = .init(repeating: nil, count: 3)
Swift๋ ํ์ ์ ๋ฏผ๊ฐํ๊ธฐ ๋๋ฌธ์ Value์ ํ์ ์ String์ผ๋ก ์ง์ ํ๊ณ ,
๋์ ๋๋ฆฌ์ ๊ฒฝ์ฐ ๊ฐ์ด ์์ผ๋ฉด nil์ ๋ฆฌํดํ๋๊น nil๋ก ์ด๊ธฐํ๋ 4๊ฐ์ ์ฌ๋กฏ์ ๊ฐ์ง๋ ํด์ ํ ์ด๋ธ์ด ์์ฑ๋๋ค.
2-2 ํด์ ํจ์ ๋ง๋ค๊ธฐ
ํด์ ํจ์๋ ๋ณดํต SHA256์ด๋ SHA-1 ๊ฐ์ด ์์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฑํ ํ๋ค.
ํ์ง๋ง ์ง์ ๊ตฌํํ๊ธฐ์๋ ์ด๋ ค์ฐ๋ฏ๋ก ํด์ ํ ์ด๋ธ์ 0, 1, 2์ด๋ ํด์ ์ฃผ์๊ฐ (index)๋ฅผ ๊ฐ๋ ํจ์๋ฅผ ๊ตฌํํด๋ณด์
func hash(key: Int) -> Int {
return key % 3
}
2-3 ํด์ ํ ์ด๋ธ์ ์ ์ฅํ๋ ํจ์ ๋ง๋ค๊ธฐ
ํด์ ํ ์ด๋ธ์ ์ ์ฅํด๊ธฐ ์ํ์ฌ Key - Value์์ ๋ฐ์์ผ ํ๊ณ , ์ด ๊ฐ์ ํด์ ํ ์ด๋ธ์ ์ ์ฅํ๋ฉด ๋๋ค.
func updateValue(_ value: String, forKey key: String) {
guard let key = UnicodeScalar(key)?.value else { return }
let hashAddress = hash(key: Int(key))
hashTable[hashAddress] = value
}
2-2์์ ๋ง๋ ํด์ ํจ์๋ ํด์ ์ฃผ์๊ฐ, ์ฆ index๋ฅผ ๋ง๋๋ ์ ์ํ์ด๊ธฐ ๋๋ฌธ์
String์ Int๋ก ๋ฐ๊ฟ์ผ ํด์ ํ๋์ ์์๋ก Unicode๋ฅผ ์ด์ฉํด Intํ์ผ๋ก ๋ง๋ค์ด์ค ๊ฒ์ด๋ค.
(๋ง์ฝ Key๋ฅผ Intํ์ผ๋ก ํ์ ๊ฒฝ์ฐ์ ์ ๊ณผ์ ์๋ต๊ฐ๋ฅํ๋ค.)
๋ฐ๋ผ์ Key๋ฅผ ํด์ ํจ์์ ๋ฃ์ด ํด์ ์ฃผ์๊ฐ(index)๋ฅผ ์ป๊ณ ,
ํด์ ์ฃผ์๊ฐ์ ํด๋นํ๋ ์ฌ๋กฏ์ Value๋ฅผ Upsetํด์ค ๊ฒ์ด๋ค.
(๋น์ด์์ผ๋ฉด insert, ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด update๋ ๊ฒ์ด๋ค.)
2-4 ํด์ ํ ์ด๋ธ์ ๊ฐ์ ์ป๋ ํจ์ ๋ง๋ค๊ธฐ
ํด์ ํ ์ด๋ธ์ ๊ฐ์ ์ป๊ธฐ ์ํด์๋ Key๊ฐ ํ์ํ๋ค.
func getValue(forKey key: String) -> String? {
guard let key = UnicodeScalar(key)?.value else { return nil }
let hashAddress = hash(key: Int(key))
return hashTable[hashAddress]
}
updateValue("์ฌ์", forKey: "์ ")
updateValue("๋ช
์", forKey: "๋ฐ")
updateValue("์๋ค", forKey: "๊น")
getValue(forKey: "์ ") // ์ฌ์
getValue(forKey: "๋ฐ") // ๋ช
์
getValue(forKey: "๊น") // ์๋ค
์ ์ฒ๋ผ ์ ์ฅ๋ ์๋๊ณ Key๋ฅผ ํตํ์ฌ Value๋ฅผ ์ป๋๊ฒ์๋ ๋ฌธ์ ๊ฐ ์๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์๋ ๋ฌธ์ ๊ฐ ์๋ค.
3. ํด์ ํ ์ด๋ธ์ ์ถฉ๋
ํด์ ํ
์ด๋ธ์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ ์ ์ถฉ๋์ด๋ค.
์ ์์์์ "์ ", "๋ฐ", "๊น"์ด๋ผ๋ Key๋ฅผ ํด์ํ ๋๋ ๋ฌธ์ ๊ฐ ์์ผ๋
"์ ", "์ด"๋ผ๋ Key๋ฅผ ํด์ํ๋ฉด

๋ ๋ค ํด์ ์ฃผ์๊ฐ(index)๊ฐ 0์ผ๋ก ๋์ผํ๊ฒ ๋์จ๋ค.
(Key๋ ๋ค๋ฅด์ง๋ง ํด์ ํจ์๊ฐ ๋จ์ํด์ ๊ฒฐ๊ณผ๊ฐ์ธ ํด์ ์ฃผ์๊ฐ์ด ๊ฒน์น๋ ๋ฌธ์ )
์ด๋ฐ ๊ฒฝ์ฐ ์ถฉ๋ํ์์ด ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ ํด์ ํ ์ด๋ธ์ ์ถฉ๋์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ์ ์ดํด๋ณด์
3-1 Chaining ๊ธฐ๋ฒ
๊ฐ๋ฐฉ ํด์ฑ ๋๋ Open Hashing์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ,
ํด์ ํ
์ด๋ธ ์ ์ฅ ๊ณต๊ฐ ์ธ์ ๊ณต๊ฐ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ถฉ๋์ด ์ผ์ด๋ ๊ฒฝ์ฐ, ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Linked List)๋ฅผ ์ด์ฉํ์ฌ
๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ๋ค์ ์ฐ๊ฒฐ ์์ผ์ ์ ์ฅํ๋ ๊ธฐ๋ฒ์ ๋งํ๋ค.

ํ๋์ ํด์ ์ฃผ์๊ฐ์ 2๊ฐ ์ด์์ Value๊ฐ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์ด์ด์ ธ ์๊ธฐ ๋๋ฌธ์,
Value ๊ฐ์ ์๋ณํ๊ธฐ ์ํด Key๊ฐ๋ ๊ฐ์ด ์ ์ฅ๋๋ค.
์ด๋ ๊ฒ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด์ ํด์ ํ
์ด๋ธ ์ธ์ ์ ์ฅ ๊ณต๊ฐ์ ํ์ฉํ๋ ๊ฒ์ด Chaining ๊ธฐ๋ฒ์ด๋ค.
3-2 Linear Probing ๊ธฐ๋ฒ
ํ์ ํด์ฑ ๋๋ Close Hashing์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํด์ ํ
์ด๋ธ ์ ์ฅ ๊ณต๊ฐ ์์์ ์ถฉ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ถฉ๋์ด ์ผ์ด๋ ๊ฒฝ์ฐ, ํด๋น ํด์ฌ ์ฃผ์๊ฐ(index๋ถํฐ) ์ํํ๋ฉฐ
๊ฐ์ฅ ์ฒ์ ๋์ค๋ ๋น ๊ณต๊ฐ์ ์ ์ฅํ๋ ๊ธฐ๋ฒ์ด๋ค. (์ ์ฅ ๊ณต๊ฐ์ ํ์ฉ๋๋ฅผ ๋์)
์ด ๋ํ Key - Value๋ฅผ ๊ฐ์ด ์ ์ฅํ๋ค.



4. ํด์ ํ ์ด๋ธ์ ์๊ฐ ๋ณต์ก๋
ํด์ ํ ์ด๋ธ์ ๋ฐฐ์ด๋ก ๊ตฌ์ฑ๋์ด ์์ง๋ง,
์ํ๋ ๊ฐ์ ์ฐพ๊ธฐ ์ํด 0๋ฒ index๋ถํฐ ์ํํด์ผ ํ๋ ๋ฐฐ์ด์ O(n)๊ณผ ๋ฌ๋ฆฌ,
Key ๊ฐ์ ํด์ํ์ฌ ๋ฐ๋ก Index์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์
ํด์ ํ
์ด๋ธ์ ์๊ฐ ๋ณต์ก๋๋ O(1)
(๋ฐฐ์ด์ ๋นํด ๋น ๋ฅด๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.)
๋ค๋ง, ์ด๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ด๊ณ
์ต์ ์ ๊ฒฝ์ฐ, ๋ชจ๋ ์ถฉ๋์ด ๋ค ๋ฐ์ํ ๊ฒฝ์ฐ ๋ฐฐ์ด์ฒ๋ผ O(n)์ด์ง๋ง,
ํด์ ํ ์ด๋ธ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ๊ณ ๋ง๋ค๊ธฐ ๋๋ฌธ์ O(1)์ด๋ผ๊ณ ๋งํ ์ ์๊ฒ ๋ค.
5. ํด์ ํ ์ด๋ธ์ ์ฅ๋จ์ ๋ฐ ์ฉ๋

๋ณดํต ํด์ ํ
์ด๋ธ์ ์๊ฐ ๋ณต์ก๋์ ๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ๋ง๋ฐ๊ฟจ๋ค. ๋ผ๊ณ ํํํ๋ค.
๋น ๋ฅธ ์๋๋ฅผ ์๋ํ์ง๋ง, ๊ทธ๋งํผ ์ ์ฅ ๊ณต๊ฐ์ด ๋ญ๋น๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์,
์ ์ฅ, ๊ฒ์, ์ญ์ ๋ฑ ํ์์ ๋ง์ด ํ๋ ๊ฒฝ์ฐ๋
์บ์ฌ๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉํ๋ฉด ์ข๋ค.