Hash Table - ehrldyd15/Swift_Skills GitHub Wiki

Hash Table

1. ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด๋ž€?

Key - Value๋กœ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

ํ•ด์‹œ ํ…Œ์ด๋ธ”๋„ ๋‹น์—ฐํžˆ Key - Value๋กœ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

ํŠน์ • Key - Value๋ฅผ ์ €์žฅํ•œ๋‹ค๊ณ  ํ•˜๋ฉด

ํ•ด๋‹น Key๋ฅผ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด์‹œ๋ฅผ ํ•˜๊ณ ,

๊ฒบ๊ณผ๊ฐ’์ธ ํ•ด์‹œ ์ฃผ์†Œ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ” ์Šฌ๋กฏ์— Value๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด ์„ธ๊ฐœ์˜ Key - Value๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ํ•˜์ž

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-11 แ„‹แ…ฉแ„’แ…ฎ 1 22 27

๋งŒ์•ฝ ์ˆœ์„œ๋Œ€๋กœ 0, 1, 2์— ์ €์žฅ์ด ๋œ๋‹ค๋ฉด ์ด๊ฒƒ์€ ์ผ๋ฐ˜ ๋ฐฐ์—ด์ด์ง€ ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ์•„๋‹ˆ๋‹ค.

ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ์•„๋ž˜ ์ฒ˜๋Ÿผ ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค์ง€ ์•Š๊ณ  ์ €์žฅ๋œ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-11 แ„‹แ…ฉแ„’แ…ฎ 1 24 11

Key๋งŒ ๊ฐ€์ง€๊ณ  ํ•ด์‹œํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ ๊ฐ’์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— index๋กœ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Key๋ฅผ ํ†ตํ•ด์„œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ index๋ฅผ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ๋งŒ ํ•ด๋‹น Value์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

์ด๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ํ•ด์‹œ ํ•จ์ˆ˜ ์ด๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-11 แ„‹แ…ฉแ„’แ…ฎ 1 28 04

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-11 แ„‹แ…ฉแ„’แ…ฎ 1 28 15

ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด๋ผ๋Š” ๊ฒƒ์€ 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๋ฅผ ํ•ด์‹œํ•˜๋ฉด

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-11 แ„‹แ…ฉแ„’แ…ฎ 2 13 08

๋‘˜ ๋‹ค ํ•ด์‹œ ์ฃผ์†Œ๊ฐ’(index)๊ฐ€ 0์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ๋‚˜์˜จ๋‹ค.

(Key๋Š” ๋‹ค๋ฅด์ง€๋งŒ ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ๋‹จ์ˆœํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์ธ ํ•ด์‹œ ์ฃผ์†Œ๊ฐ’์ด ๊ฒน์น˜๋Š” ๋ฌธ์ œ)

์ด๋Ÿฐ ๊ฒฝ์šฐ ์ถฉ๋‘˜ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ดํŽด๋ณด์ž

3-1 Chaining ๊ธฐ๋ฒ•

๊ฐœ๋ฐฉ ํ•ด์‹ฑ ๋˜๋Š” Open Hashing์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ,

ํ•ด์‹œ ํ…Œ์ด๋ธ” ์ €์žฅ ๊ณต๊ฐ„ ์™ธ์˜ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ถฉ๋Œ์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)๋ฅผ ์ด์šฉํ•˜์—ฌ

๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ๋’ค์— ์—ฐ๊ฒฐ ์‹œ์ผœ์„œ ์ €์žฅํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•œ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-11 แ„‹แ…ฉแ„’แ…ฎ 2 15 43

ํ•˜๋‚˜์˜ ํ•ด์‹œ ์ฃผ์†Œ๊ฐ’์— 2๊ฐœ ์ด์ƒ์˜ Value๊ฐ€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ์ด์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,

Value ๊ฐ’์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด Key๊ฐ’๋„ ๊ฐ™์ด ์ €์žฅ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด์‹œ ํ…Œ์ด๋ธ” ์™ธ์˜ ์ €์žฅ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด Chaining ๊ธฐ๋ฒ•์ด๋‹ค.

3-2 Linear Probing ๊ธฐ๋ฒ•

ํ์‡„ ํ•ด์‹ฑ ๋˜๋Š” Close Hashing์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํ•ด์‹œ ํ…Œ์ด๋ธ” ์ €์žฅ ๊ณต๊ฐ„ ์•ˆ์—์„œ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ถฉ๋Œ์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ, ํ•ด๋‹น ํ•ด์‰ฌ ์ฃผ์†Œ๊ฐ’(index๋ถ€ํ„ฐ) ์ˆœํšŒํ•˜๋ฉฐ

๊ฐ€์žฅ ์ฒ˜์Œ ๋‚˜์˜ค๋Š” ๋นˆ ๊ณต๊ฐ„์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. (์ €์žฅ ๊ณต๊ฐ„์˜ ํ™œ์šฉ๋„๋ฅผ ๋†’์ž„)

์ด ๋˜ํ•œ Key - Value๋ฅผ ๊ฐ™์ด ์ €์žฅํ•œ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-11 แ„‹แ…ฉแ„’แ…ฎ 2 20 15

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-11 แ„‹แ…ฉแ„’แ…ฎ 2 20 27

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-11 แ„‹แ…ฉแ„’แ…ฎ 2 20 30

4. ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€๋งŒ,

์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด 0๋ฒˆ index๋ถ€ํ„ฐ ์ˆœํšŒํ•ด์•ผ ํ•˜๋Š” ๋ฐฐ์—ด์˜ O(n)๊ณผ ๋‹ฌ๋ฆฌ,

Key ๊ฐ’์„ ํ•ด์‹œํ•˜์—ฌ ๋ฐ”๋กœ Index์— ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์—

ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)

(๋ฐฐ์—ด์— ๋น„ํ•ด ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.)

๋‹ค๋งŒ, ์ด๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์ด๊ณ 

์ตœ์•…์˜ ๊ฒฝ์šฐ, ๋ชจ๋“  ์ถฉ๋Œ์ด ๋‹ค ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ๋ฐฐ์—ด์ฒ˜๋Ÿผ O(n)์ด์ง€๋งŒ,

ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— O(1)์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

5. ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์žฅ๋‹จ์  ๋ฐ ์šฉ๋„

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-11 แ„‹แ…ฉแ„’แ…ฎ 2 24 14

๋ณดํ†ต ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋งž๋ฐ”๊ฟจ๋‹ค. ๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

๋น ๋ฅธ ์†๋„๋ฅผ ์ž๋ž‘ํ•˜์ง€๋งŒ, ๊ทธ๋งŒํผ ์ €์žฅ ๊ณต๊ฐ„์ด ๋‚ญ๋น„๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ,

์ €์žฅ, ๊ฒ€์ƒ‰, ์‚ญ์ œ ๋“ฑ ํƒ์ƒ‰์„ ๋งŽ์ด ํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜

์บ์‰ฌ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

https://babbab2.tistory.com/89