์•Œ๊ณ ๋ฆฌ์ฆ˜

[Data Structure] ํ•ด์‹œ ํ…Œ์ด๋ธ” (Hash Table)

jjingle 2024. 1. 26. 15:51

ํ•ด์‹œ ํ…Œ์ด๋ธ” (Hash Table) ? 

  • ํ‚ค(Key)์— ๋ฐ์ดํ„ฐ(Value)๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
  • Key๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋น ๋ฅธ ์†๋„
  • ํŒŒ์ด์ฌ์—์„œ๋Š” ๋”•์…”๋„ˆ๋ฆฌ(Dictionary) ํƒ€์ž…์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • ๋ณดํ†ต ๋ฐฐ์—ด๋กœ ๋ฏธ๋ฆฌ Hash Table ์‚ฌ์ด์ฆˆ๋งŒํผ ์ƒ์„ฑ ํ›„ ์‚ฌ์šฉ (๊ณต๊ฐ„๊ณผ ํƒ์ƒ‰ ์‹œ๊ฐ„ ๋งž๋ฐ”๊พธ๋Š” ๊ธฐ๋ฒ•)

 

๊ด€๋ จ ์šฉ์–ด

  • ํ•ด์‹œ(Hash) : ์ž„์˜ ๊ฐ’์„ ๊ณ ์ • ๊ธธ์ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ
  • ํ•ด์‹œ ํ…Œ์ด๋ธ”(Hash Table) : ํ‚ค ๊ฐ’์˜ ์—ฐ์‚ฐ์— ์˜ํ•ด ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
  • ํ•ด์‹ฑ ํ•จ์ˆ˜(Hashing Function) : Key์— ๋Œ€ํ•ด ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด, ๋ฐ์ดํ„ฐ ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
  • ํ•ด์‹œ ๊ฐ’(Hash Value), ํ•ด์‹œ ์ฃผ์†Œ(Hash Address) : Key๋ฅผ ํ•ด์‹ฑ ํ•จ์ˆ˜๋กœ ์—ฐ์‚ฐํ•ด์„œ, ํ•ด์‹œ ๊ฐ’์„ ์•Œ์•„๋‚ด๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”์—์„œ ํ•ด๋‹น Key ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์œ„์น˜๋ฅผ ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ
  • ์Šฌ๋กฏ(Slot) : ํ•œ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„

Hash Table structure

 

 

ํ•ด์‹œ ํ…Œ์ด๋ธ” ํŠน์ง•

  • ์žฅ์ 
    • ๋ฐ์ดํ„ฐ ์ €์žฅ/์ฝ๊ธฐ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค (๋น ๋ฅธ ๊ฒ€์ƒ‰ ์†๋„)
    • ํ‚ค์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€(์ค‘๋ณต) ํ™•์ธ ์‰ฌ์›€
  • ๋‹จ์ 
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์ €์žฅ๊ณต๊ฐ„์ด ์ข€ ๋” ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค
    • ์—ฌ๋Ÿฌ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ์ฃผ์†Œ๊ฐ€ ๋™์ผํ•  ๊ฒฝ์šฐ, ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ์ž๋ฃŒ๊ตฌ์กฐ ํ•„์š”
  • ์ฃผ์š” ์šฉ๋„
    • ๊ฒ€์ƒ‰์ด ๋งŽ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    • ์ €์žฅ, ์‚ญ์ œ, ์ฝ๊ธฐ๊ฐ€ ๋นˆ๋ฒˆํ•œ ๊ฒฝ์šฐ
    • ์บ์‹œ ๊ตฌํ˜„(์ค‘๋ณต ํ™•์ธ์ด ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์—)
hash_table = list([0 for i in range(8)])  #python list comprehension

def get_key(data):
    return hash(data)

def hash_function(key):
    return key % 8

def save_data(data, value):
    hash_address = hash_function(get_key(data))
    hash_table[hash_address] = value
    
def read_data(data):
    hash_address = hash_function(get_key(data))
    return hash_table[hash_address]
    
    
save_data('Dave', '0102030200')
save_data('Andy', '01033232200')

read_data('Dave')  #'0102030200'
hash_table         #['0102030200', 0, 0, 0, 0, 0, 0, '01033232200']