자료ꡬ쑰

[Swift] 자료ꡬ쑰 - ν•΄μ‹œ ν…Œμ΄λΈ”(Hash Table)

κ²½ν‘Έ 2022. 4. 21. 21:00
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”~

 

μ˜€λŠ˜μ€ μ—°κ²° λ¦¬μŠ€νŠΈμ— μ΄μ–΄μ„œ ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€ : )

 

[ LinkedList ν¬μŠ€νŒ… ]

 

[Swift] 자료ꡬ쑰 - 단방ν–₯ / μ–‘λ°©ν–₯ μ—°κ²° 리슀트(Linked List)

μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ 큐에 μ΄μ–΄μ„œ μ—°κ²°λ¦¬μŠ€νŠΈμ— λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€ : ) [ Queue ν¬μŠ€νŒ… ] [Swift] 자료ꡬ쑰 - 큐(Queue) μ•ˆλ…•ν•˜μ„Έμœ ~ [Swift] 자료ꡬ쑰 - μŠ€νƒ(Stack) μ•ˆλ…•ν•˜μ„Έμœ ~ μ˜€λŠ˜μ€ 자료ꡬ쑰 쀑

pooh-footprints.tistory.com

 


 

ν•΄μ‹œ ν…Œμ΄λΈ”μ€ (Key, Value)둜 데이터λ₯Ό μ €μž₯ν•˜λŠ” μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.

 

ν•΄μ‹œ ν…Œμ΄λΈ”μ€ λ‚΄λΆ€μ μœΌλ‘œ 배열을 μ΄μš©ν•΄ μ €μž₯ν•˜κ³  있으며 

Key값에 ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ μš©ν•΄ μ €μž₯ν•  인덱슀λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

 

λ”°λΌμ„œ μ‚½μž…, μ‚­μ œ, 쑰회 등이 O(1)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

ν”νžˆ μš°λ¦¬κ°€ μ•Œκ³  μžˆλŠ” λ”•μ…”λ„ˆλ¦¬κ°€ 이 쀑에 ν•˜λ‚˜λ‘œ λ‚΄λΆ€μ μœΌλ‘œ

ν•΄μ‹œν…Œμ΄λΈ”μ„ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

ν•΄μ‹œ ν…Œμ΄λΈ” κ΅¬ν˜„

-  배열을 μƒμ„±ν•©λ‹ˆλ‹€.

var myHashTable: [Int?] = .init(repeating: nil, count: 4) // 4개

 

ν•΄μ‹œ ν•¨μˆ˜

- 킀값이 ν•΄μ‹œ ν•¨μˆ˜μ˜ λ‘œμ§μ„ 톡해 인덱슀 값을 κ²°μ •ν•©λ‹ˆλ‹€. 

- λŒ€ν‘œμ μœΌλ‘œ 3가지가 μ‘΄μž¬ν•©λ‹ˆλ‹€.

1. λ‚˜λˆ—μ…ˆμ„ μ΄μš©ν•˜λŠ” 방법 : μž…λ ₯값을 ν…Œμ΄λΈ”μ˜ 크기둜 λ‚˜λˆ„μ–΄ κ³„μ‚°ν•˜κΈ°
- μ£Όμ†Œ = μž…λ ₯κ°’ % ν…Œμ΄λΈ”μ˜ 크기
- ν…Œμ΄λΈ”μ˜ 크기λ₯Ό μ†Œμˆ˜λ‘œ μ •ν•˜κ³  2의 μ œκ³±μˆ˜μ™€ λ¨Ό 값을 μ‚¬μš©ν•˜λ©΄ 효율이 μ’‹λ‹€κ³  μ•Œλ €μ§„ 방법

2. κ³±μ…ˆμ„ μ΄μš©ν•˜λŠ” 방법 : 숫자둜 된 Keyκ°’ K와 0κ³Ό 1 μ‚¬μ΄μ˜ μ‹€μˆ˜ A, 보톡 2의 제곱수인 m을 μ‚¬μš©ν•˜μ—¬ 계산.
- h(k)=(k * A * mod 1) × m

3. Digit Folding : 각 Key의 λ¬Έμžμ—΄μ„ ASCII μ½”λ“œλ‘œ λ°”κΎΈκ³  값을 ν•©ν•œ 데이터λ₯Ό ν…Œμ΄λΈ” λ‚΄μ˜ μ£Όμ†Œλ‘œ μ‚¬μš©ν•˜λŠ” 방법이닀.

 

- κ°€μž₯ 보편적으둜 μ•Œλ €μ§„ λ‚˜λˆ—μ…ˆ λ°©λ²•μœΌλ‘œ μ§„ν–‰ν•˜κ² μŠ΅λ‹ˆλ‹€.

private func myHashFunc(key: Int) -> Int {
    return key % 4 // ν•΄μ‹œ ν…Œμ΄λΈ”μ΄ 0,1,2,3의 indexλ₯Ό 가지고 있기 λ•Œλ¬Έ!
}

이 ν•΄μ‹œν•¨μˆ˜λ₯Ό 톡해 λ‚˜μ˜¨ 값을 μ΄μš©ν•΄ Indexλ₯Ό κ²°μ •ν•  수 있게 되고 이λ₯Ό ν™œμš©ν•΄ 값을 μ €μž₯ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

ν•΄μ‹œ ν…Œμ΄λΈ”μ— μ €μž₯ν•˜λŠ” ν•¨μˆ˜

// λΆ„κΈ°μ²˜λ¦¬, μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό κ³ λ €ν•˜μ§€ μ•Šκ³  κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„
func storeValue(value: Int, key: Int) {
    let hashAddress = hash(key: key) // μœ„μ˜ ν•΄μ‹œν•¨μˆ˜λ₯Ό 톡해 μ£Όμ†Œλ₯Ό μ°ΎκΈ°
    hashTable[hashAddress] = value // ν•΄λ‹Ή μ£Όμ†Œμ— value λ„£κΈ°!
}

 

ν•΄μ‹œ ν…Œμ΄λΈ”μ—μ„œ 값을 가지고 μ˜€λŠ” ν•¨μˆ˜

func getValue(key: Int) -> Int? {
    let hashAddress = hash(key: key)
    return hashTable[hashAddress]
}

μ΄λ ‡κ²Œ 두 가지 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜κ³  λ‚˜λ©΄

ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 기본적인 κΈ°λŠ₯은 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ

λ§Œμ•½ ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜μ„ 톡해 λ‚˜μ˜¨ 인덱슀 값이 같은 κ²½μš°μ—λŠ” μ–΄λ–»κ²Œ λ κΉŒμš”?

 

Key 1 2 3 5
Value 2 3 4 5
HashAddress 1 2 3 1

 

μœ„μ˜ ν‘œμ²˜λŸΌ Key값이 1κ³Ό 5인 경우, λͺ¨λ‘ 1번째 μΈλ±μŠ€μ— λ“€μ–΄κ°€κ²Œ 될 κ²λ‹ˆλ‹€.

 

이λ₯Ό ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 좩돌이라고 λ§ν•©λ‹ˆλ‹€.

 

ν•΄μ‹œ ν…Œμ΄λΈ” 좩돌 ν•΄κ²° 방법

첫 번째, Chaining 기법

- 이미 ν•΄λ‹Ή μΈλ±μŠ€μ— μ›μ†Œκ°€ μ‘΄μž¬ν•œλ‹€λ©΄ 이λ₯Ό 뒀에 μ—°μ†μ μœΌλ‘œ 이어 λΆ™μ΄λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.

- 일전에 ν¬μŠ€νŒ…μ—μ„œ λ°°μ› λ˜ μ—°κ²° 리슀트λ₯Ό ν™œμš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ κ·Έμ€‘μ—μ„œλ„ 단방ν–₯ μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

- 1번째 μ£Όμ†Œμ— (1,2)의 λ…Έλ“œκ°€ μžˆμ„ 경우 이 λ…Έλ“œμ˜ nextλ₯Ό (5,5)둜 μ„€μ •ν•΄ μ£Όλ©΄ λ©λ‹ˆλ‹€.

- [ HashAddress : 1 ]  - [1,2] → [5,5]

 

두 번째, Linear Probing ( Close Hashing ) 기법

- Linear ν•˜κ²Œ μˆœμ„œλŒ€λ‘œ λ‹€μŒ 빈 곡간을 μ°Ύκ³  값을 μ €μž₯ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

- Chaining κΈ°λ²•μ²˜λŸΌ Table μ΄μ™Έμ˜ 곡간을 또 λ§Œλ“€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— Close Hashing이라고도 λΆ€λ¦…λ‹ˆλ‹€.

 

이 외에도 ν•΄μ‹œμ˜ μ €μž₯μˆœμ„œ 폭을 제곱으둜 μ„€μ •ν•˜λŠ” 방식인 Qudratic Probing, ν•΄μ‹œλœ 값을 ν•œλ²ˆ 더 ν•΄μ‹±ν•˜λŠ” 방식인 Double Hashing Probing이 μžˆμŠ΅λ‹ˆλ‹€.

 

ν•΄μ‹œ ν…Œμ΄λΈ”μ— λŒ€ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ 정리해 λ΄€μŠ΅λ‹ˆλ‹€.

그럼 이만 πŸ‘‹πŸ» πŸ‘‹πŸ» πŸ‘‹πŸ»

 

 


 

 


참고 자료

κ°μ‚¬ν•©λ‹ˆλ‹€ πŸ‘

 

[자료ꡬ쑰] ν•΄μ‹œν…Œμ΄λΈ”(HashTable)μ΄λž€?

1. ν•΄μ‹œν…Œμ΄λΈ”(HashTable)μ΄λž€? [ HashTable(ν•΄μ‹œν…Œμ΄λΈ”)μ΄λž€? ] ν•΄μ‹œ ν…Œμ΄λΈ”μ€ (Key, Value)둜 데이터λ₯Ό μ €μž₯ν•˜λŠ” 자료ꡬ쑰 쀑 ν•˜λ‚˜λ‘œ λΉ λ₯΄κ²Œ 데이터λ₯Ό 검색할 수 μžˆλŠ” μžλ£Œκ΅¬μ‘°μ΄λ‹€. ν•΄μ‹œ ν…Œμ΄λΈ”μ΄ λΉ λ₯Έ

mangkyu.tistory.com

 

Swift) ν•΄μ‹œ ν…Œμ΄λΈ”(Hash Table) μ΄ν•΄ν•˜κΈ°

μ•ˆλ…•ν•˜μ„Έμš” :) μ†Œλ“€μž…λ‹ˆλ‹€! μ˜€λŠ˜μ€ 자료ꡬ쑰 μ€‘μ—μ„œ ν•΄μ‹œ ν…Œμ΄λΈ”μ΄λž€ 것에 λŒ€ν•΄ 곡뢀해보렀고 ν•΄μš”!!! 음..... 사싀 Swiftμ—μ„œ ꡳ이 ν•΄μ‹œ ν…Œμ΄λΈ”μ„ 직접 κ΅¬ν˜„ν•΄μ„œ μ“Έ 일은 거의 μ—†λ‹€κ³  μƒκ°ν•΄μš”.. μ™œ

babbab2.tistory.com

λ°˜μ‘ν˜•