ν‹°μŠ€ν† λ¦¬ λ·°

ν•΄μ‹œ ν…Œμ΄λΈ”(Hash Table)은 λ°μ΄ν„°λ₯Ό νš¨μœ¨μ μœΌλ‘œ μ €μž₯ν•˜κ³  κ²€μƒ‰ν•˜κΈ° μœ„ν•œ μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€. 

이λ₯Ό μœ„ν•΄ ν•΄μ‹œ ν•¨μˆ˜(Hash Function)λ₯Ό μ‚¬μš©ν•˜μ—¬ κ° λ°μ΄ν„°μ˜ ν‚€(Key)λ₯Ό ν•΄μ‹œ κ°’(인덱슀)으둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

ν•΄μ‹œ ν•¨μˆ˜λŠ” μž„μ˜μ˜ κΈΈμ΄λ₯Ό κ°€μ§„ λ°μ΄ν„°λ₯Ό κ³ μ •λœ κΈΈμ΄μ˜ ν•΄μ‹œ κ°’μœΌλ‘œ λ§€ν•‘ν•©λ‹ˆλ‹€. 

이 κ³Όμ •μ„ ν†΅ν•΄ λ°μ΄ν„°λŠ” ν…Œμ΄λΈ” λ‚΄μ˜ μ£Όμ†Œ(인덱슀)둜 λ³€ν™˜λ©λ‹ˆλ‹€.

 

 μ΄λ ‡κ²Œ λ³€ν™˜λœ μ£Όμ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό ν…Œμ΄λΈ”(Slot, Bucket)에 μ €μž₯ν•˜κ±°λ‚˜ κ²€μƒ‰ν•©λ‹ˆλ‹€.

이미지 좜처: https://dbehdrhs.tistory.com/70

 

예λ₯Ό λ“€μ–΄, ν‚€κ°€ 123817인 λ°μ΄ν„°λ₯Ό ν•΄μ‹œ ν•¨μˆ˜μ— λ„£μœΌλ©΄ 3819와 κ°™μ€ ν•΄μ‹œ κ°’이 λ‚˜μ˜΅λ‹ˆλ‹€. 

이 ν•΄μ‹œ κ°’은 ν•΄λ‹Ή λ°μ΄ν„°λ₯Ό μ €μž₯ν•  ν…Œμ΄λΈ” λ‚΄μ˜ μœ„μΉ˜λ₯Ό κ²°μ •ν•˜λŠ” λ° μ‚¬μš©λ©λ‹ˆλ‹€. 

 

 

무슨 말인지 잘 λͺ¨λ₯΄κ² λ‹€λ©΄..

 


이 κΈ€μ˜ 제λͺ©μ²˜λŸΌ ν•΄μ‹œ ν…Œμ΄λΈ”μ€ λ„μ„œκ΄€.을 μƒκ°ν•˜λ©΄ μ‰½μŠ΅λ‹ˆλ‹€!

이미지 좜처: https://www.pinterest.co.kr/pin/601371356490852311/

λ„μ„œκ΄€μ€ μ—¬λŸ¬ κ°œμ˜ μ±…을 λ³΄κ΄€ν•˜κ³  μ±…을 μ°Ύμ„ μˆ˜ μžˆλŠ” μž₯μ†Œμž…λ‹ˆλ‹€. 

 

κ·ΈλŸ¬λ‚˜ λ„μ„œκ΄€λ§ˆλ‹€ μ±…을 λ³΄κ΄€ν•˜λŠ” λ°©μ‹μ΄ λ‹€λ¦…λ‹ˆλ‹€.

μ–΄λ–€ λ„μ„œκ΄€μ€ 책을 μž₯λ₯΄λ³„λ‘œ λ³΄κ΄€ν•˜κ³ , 또 λ‹€λ₯Έ λ„μ„œκ΄€μ€ μ±…μ˜ μ΄λ¦„μ΄λ‚˜ μ €μžλ₯Ό κΈ°μ€€μœΌλ‘œ 책을 λ³΄κ΄€ν•©λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, κ°€λ‚˜λ‹€ 순으둜 책을 λ³΄κ΄€ν•˜λŠ” λ„μ„œκ΄€μ—μ„œλŠ”

ν•΄λ‹Ή 방식을 κ³ λ €ν•˜μ—¬ 책을 μ°Ύμ•„μ•Ό 더 쉽고 λΉ λ₯΄κ²Œ 책을 찾을 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

이제 μ΄ λ„μ„œκ΄€μ˜ μ˜ˆμ‹œλ₯Ό ν•΄μ‹œ ν…Œμ΄λΈ”에 μ ‘λͺ©μ‹œμΌœλ³΄κ² μŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή λ„μ„œκ΄€μ΄ 책을 λ³΄κ΄€ν•˜λŠ” 방식을 ν•΄μ‹œ ν•¨μˆ˜(Hash Function)라고 ν•˜κ³ ,

각 λ„μ„œκ΄€μ€ μžμ‹ λ§Œμ˜ ν•΄μ‹œ ν•¨μˆ˜(μ±… 보관법)을 κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

ν•΄μ‹œ ν•¨μˆ˜λ₯Ό 톡해 μ›ν•˜λŠ” μ±…μ˜ μœ„μΉ˜λ₯Ό μ°Ύμ•„λ‚΄λ©΄ κ·Έ μœ„μΉ˜κ°€ ν•΄μ‹œ 값이 되고,

ν•΄λ‹Ή μœ„μΉ˜μ— 책이 λ³΄κ΄€λ˜μ–΄ μžˆλŠ” 곳을 버킷 λ˜λŠ”, 슬둯이라고 ν•©λ‹ˆλ‹€.

 

λ‹€μ‹œ ν•œ 번, λ„μ„œκ΄€μ„ 머리 μ†μ—μ„œ λ– μ˜¬λ¦¬λ©° ν•΄μ‹œ ν…Œμ΄λΈ”μ— λŒ€ν•΄ μƒκ°ν•΄λ³΄μ‹œμ£ .

(책을 κ°€λ‚˜λ‹€ 순으둜 λ‚˜μ—΄ν•˜λŠ” λ„μ„œκ΄€μ΄λΌκ³  μƒκ°ν•΄λ΄…μ‹œλ‹€.)

 

ν•΄μ‹œ ν…Œμ΄λΈ”μ€ Key와 Valueλ₯Ό 1:1 λ§€ν•‘ν•˜μ—¬ μ €μž₯ν•˜λŠ” ꡬ쑰이고, Key(μ±… 이름)λ₯Ό ν•΄μ‹œ ν•¨μˆ˜μ— λ„£μ–΄μ„œ λ‚˜μ˜¨ ν•΄μ‹œ κ°’(μ±…μ˜ μ΄λ¦„μœΌλ‘œ 정해진 보관 μœ„μΉ˜)에 ν•΄λ‹Ή Value(μ±…)을 μ €μž₯ν•˜λŠ” 방식인 κ²ƒμž…λ‹ˆλ‹€.


λ”°λΌμ„œ ν•΄μ‹œ ν…Œμ΄λΈ”μ€ 데이터λ₯Ό 효율적으둜 κ΄€λ¦¬ν•˜κ³  검색할 수 μžˆλŠ” λ„μ„œκ΄€κ³Ό κ°™λ‹€κ³  μƒκ°ν•˜μ‹œλ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

 

이제 μ‘°κΈˆμ€ ν•΄μ‹œ ν…Œμ΄λΈ”μ΄ 머리 μ†μ—μ„œ κ·Έλ €μ§€μ‹œλ‚˜μš” ?! πŸ€“


ν•΄μ‹œ 좩돌 (Hash Collision )

ν•΄μ‹œ ν•¨μˆ˜λŠ” ν•΄μ‹œ κ°’μ˜ κ°œμˆ˜λ³΄λ‹€ λ” λ§Žμ€ ν‚€ κ°’을 ν•΄μ‹œ κ°’μœΌλ‘œ λ³€ν™˜ν•˜κΈ° λ•Œλ¬Έμ— 

μ„œλ‘œ λ‹€λ₯Έ 킀에 λŒ€ν•΄ λ™μΌν•œ ν•΄μ‹œ 값을 λ‚΄λŠ” ν•΄μ‹œ 좩돌(Collision)이 λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, λ„μ„œκ΄€μ˜ ν•΄μ‹œ ν•¨μˆ˜κ°€ μ €μžμ˜ μ΄λ¦„을 κΈ°μ€€μœΌλ‘œ ν•œλ‹€λ©΄ 

ν•œ μ €μžκ°€ μ“΄ λ‹€λ₯Έ 책듀도 같은 ν•΄μ‹œ 값을 κ°–κ²Œ λ©λ‹ˆλ‹€. (Collision λ°œμƒ)

 

ν•΄μ‹œ ν…Œμ΄λΈ”μ—μ„œλ„ μ΄μ™€ μœ μ‚¬ν•œ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. 

ν•΄μ‹œ ν•¨μˆ˜κ°€ μ •ν•΄μ§„ μƒνƒœλ‘œ ν•΄μ‹œ ν…Œμ΄λΈ”에 λ°μ΄ν„°λ₯Ό μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— μ–Έμ  κ°€λŠ” λ˜‘같은 ν•΄μ‹œ κ°’을 λ‚΄λŠ” ν‚€κ°€ λ°œμƒν•  κ²ƒμž…λ‹ˆλ‹€. 

μ΄λŸ¬ν•œ μƒν™©μ„ μš°λ¦¬λŠ” ν•΄μ‹œ μΆ©λŒ(Collision)이라고 ν•©λ‹ˆλ‹€.

 

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μš°λ¦¬λŠ” ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ„ νƒν•  λ•Œ κ³¨κ³ λ£¨ λΆ„μ‚°λ˜λ„λ‘ μ„€κ³„ν•˜λŠ” κ²ƒμ΄ μ’‹μŠ΅λ‹ˆλ‹€. 

쒋은 ν•΄μ‹œ ν•¨μˆ˜μ˜ μ‘°κ±΄μœΌλ‘œλŠ” λ‘ κ°€μ§€λ₯Ό λ‚˜νƒ€λ‚Ό μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

첫 λ²ˆμ§ΈλŠ” μΆ©λŒμ΄ μ κ²Œ λ°œμƒν•˜λŠ” Less Collisionμž…λ‹ˆλ‹€. 

μ™„λ²½ν•œ ν•΄μ‹œ ν•¨μˆ˜λŠ” μ‘΄μž¬ν•˜μ§€ μ•Šμ§€λ§Œ, μΆ©λŒμ΄ μ κ²Œ λ°œμƒν•˜λŠ” ν•¨μˆ˜λ₯Ό μ„ νƒν•˜λŠ” κ²ƒμ΄ μ€‘μš”ν•©λ‹ˆλ‹€.

두 λ²ˆμ§Έλ‘œλŠ” κ³„산이 λΉ λ₯Έ Fast Computationμž…λ‹ˆλ‹€. 

ν•΄μ‹œ ν•¨μˆ˜μ˜ κ³„산이 λΉ λ₯Όμˆ˜λ‘ λ” μ’‹μŠ΅λ‹ˆλ‹€. ν•΄μ‹œ ν…Œμ΄λΈ”μ—μ„œλŠ” ν•΄μ‹œ ν•¨μˆ˜ κ°’을 μžμ£Ό κ³„μ‚°ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λΉ λ₯Έ κ³„산이 ν•„μˆ˜μ μž…λ‹ˆλ‹€. 

 

κ·ΈλŸ¬λ‚˜ 이 λ‘˜μ€ μƒμΆ© 관계(Trade-off)에 μžˆμŠ΅λ‹ˆλ‹€.

 

사진 좜처: https://www.pinterest.co.kr/pin/597501075536675448/


ν•΄μ‹œ μΆ©λŒμ„ μ€„이렀면 ν•΄μ‹œ ν•¨μˆ˜λ₯Ό λ³΅μž‘ν•˜κ²Œ λ§Œλ“€μ–΄μ•Ό ν•˜μ§€λ§Œ, μ΄λ ‡κ²Œ λ˜λ©΄ κ³„μ‚° μ†λ„κ°€ λŠλ €μ§‘λ‹ˆλ‹€. 

λ”°λΌμ„œ λ‘ κ°€μ§€ μ‘°κ±΄μ„ λͺ¨λ‘ κ³ λ €ν•˜μ—¬ ν˜„μž¬ μƒν™©μ— λ§žλŠ” ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ„ νƒν•˜λŠ” κ²ƒμ΄ ν•„μš”ν•©λ‹ˆλ‹€.


마무리

μ‚¬λžŒμ΄ λ›°μ–΄λ‚œ ν•΄μ‹œ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄λ„ μ™„λ²½ν•˜κ²Œ μΆ©λŒμ„ 막을 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ μš°λ¦¬λŠ”

좩돌이 λ°œμƒν–ˆμ„ λ•Œλ₯Ό λŒ€μ²˜ν•˜κΈ° μœ„ν•΄ Open addressingκ³Ό Chaining 두 가지 방법이 주둜 μ‚¬μš©ν•©λ‹ˆλ‹€.

ν•œ ν¬μŠ€νŒ…μ— λͺ¨λ“  λ‚΄μš©μ„ λ‹€λ£¨κΈ°μ—λŠ” μ‹œκ°„μ΄ λΆ€μ‘±ν•˜μ—¬

이번 ν¬μŠ€νŒ…μ—μ„œλŠ” ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ κ°œλ…μ— λŒ€ν•΄μ„œλ§Œ 닀루고 λ§ˆμΉ˜κ² μŠ΅λ‹ˆλ‹€..!

λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œλŠ” 좩돌 νšŒν”Ό 방법에 λŒ€ν•΄ 더 μžμ„Ένžˆ 닀루고,
μ½”λ“œλ‘œ κ΅¬ν˜„κ³Ό μ‹œκ°„ λ³΅μž‘λ„μ— λŒ€ν•œ λ‚΄μš©μ„ λ‹€λ£° μ˜ˆμ •μž…λ‹ˆλ‹€.

 

잘λͺ»λœ λ‚΄μš©μ΄λ‚˜ κΆκΈˆν•˜μ‹  점이 μžˆλ‹€λ©΄ λŒ“κΈ€ λ‚¨κ²¨μ£Όμ„Έμš”. πŸ€“

μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.


πŸ“ μ°Έκ³  자료

ν•œκ΅­μ™ΈλŒ€ μ‹ μ°¬μˆ˜ κ΅μˆ˜λ‹˜μ˜ Data Structures with Python κ°•μ˜

https://ratsgo.github.io/data%20structure&algorithm/2017/10/25/hash/