๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š Computer Science/Data Structure

[์ž๋ฃŒ๊ตฌ์กฐ] ํ•ด์‹œ ํ…Œ์ด๋ธ”(Hash Table)

by hyebin (Helia) 2023. 3. 15.
๋ฐ˜์‘ํ˜•

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

  • ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ (Key, Value)์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
  • ํ•ด์‹œํ•จ์ˆ˜(Hash Function)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜ํ•œ ๊ฐ’์„ index๋กœ ์‚ผ์Œ
  • ํ•ด์‹œ ํ•จ์ˆ˜(Hash Function)๋ฅผ ์‚ฌ์šฉํ•ด Key ๊ฐ’์„ ์ƒ‰์ธ(index)์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ํ•ด์‹ฑ(Hashing)์ด๋ผ๊ณ  ํ•จ
  • ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ํŒŒ์ด์ฌ์˜ dictionary, ๋ฃจ๋น„์˜ Hash, ์ž๋ฐ”์˜ Map ๋“ฑ์ด ์žˆ์Œ

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

  • ๊ธฐ๋ณธ ์—ฐ์‚ฐ์œผ๋กœ๋Š” search, insert, delete๊ฐ€ ์žˆ์Œ
  • ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์Œ
  • key๋ฅผ ํ†ตํ•ด์„œ value๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ => ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๋‚˜ ๋ฐฐ์—ด์— ๋น„ํ•ด ์†๋„๊ฐ€ ๋น ๋ฆ„
  • ์ปค๋‹ค๋ž€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์‹œํ•ด์„œ ์งง์€ ๊ธธ์ด๋กœ ์ถ•์•ฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•  ๋•Œ ํšจ์œจ์ 
  • value๋Š” ์ค‘๋ณต ๊ฐ€๋Šฅํ•˜์ง€๋งŒ key๋Š” ์œ ๋‹ˆํฌํ•ด์•ผ ํ•จ
  • ์ˆ˜์ • ๊ฐ€๋Šฅ (mutable)
  • ์‚ฝ์ž…, ์‚ญ์ œ ํƒ์ƒ‰ ์‹œ ํ‰๊ท ์ ์œผ๋กœ O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง

ํ•ด์‹œ ํ•จ์ˆ˜(Hash Function)

  • ๊ณ ์œ ํ•œ ์ธ๋ฑ์Šค ๊ฐ’์„ ์„ค์ •
  • ์ž„์˜์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์„œ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ํ•ด์‹œ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜
  • ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๊ฐ’์˜ ๊ธธ์ด๊ฐ€ ์–ด๋–ป๋“  ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅ๊ฐ’์ด ๋‹ค๋ฅด๋”๋ผ๋„ ๊ฐ™์€ ๊ฒฐ๊ด๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒ
    • ํ•ด์‹œ ์ถฉ๋Œ(hash collision)์ด๋ผ๊ณ  ํ‘œํ˜„
    • ์ถฉ๋Œ์ด ์ ์€ ํ•ด์‹œํ•จ์ˆ˜๊ฐ€ ์ข‹์€ ํ•ด์‹œ ํ•จ์ˆ˜
  • ๋Œ€ํ‘œ์ ์ธ ํ•ด์‹œ ํ•จ์ˆ˜
    • Division Method
      • Key๋ฅผ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ„์–ด ๋‚˜์˜จ ๋‚˜๋จธ์ง€๋ฅผ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ (index = Key % ํ…Œ์ด๋ธ” ํฌ๊ธฐ)
      • ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋ฅผ ์†Œ์ˆ˜(Prime Number)๋กœ ์ •ํ•˜๊ณ  2์˜ ์ œ๊ณฑ์ˆ˜์™€ ๋จผ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์ข‹์Œ
      • ex- Key ๊ฐ’์ด 23์ผ ๋•Œ ํ…Œ์ด๋ธ” ์‚ฌ์ด์ฆˆ๊ฐ€ 7์ด๋ผ๋ฉด index๋Š” 2
    • Digit Folding
      • ๊ฐ Key์˜ ๋ฌธ์ž์—ด์„ ASCII ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๊ณ  ๊ทธ ๊ฐ’์„ ํ•ฉํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ” ๋‚ด์˜ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
    • Multiplication Method
      • ์ˆซ์ž๋กœ ๋œ Key๊ฐ’ K์™€ 0๊ณผ 1 ์‚ฌ์ด์˜ ์‹ค์ˆ˜ A, ๋ณดํ†ต 2์˜ ์ œ๊ณฑ์ˆ˜์ธ m์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ„์‚ฐ์„ ํ•จ
      • index=(k*Amod1)*m
    • Univeral Hashing
      • ๋‹ค์ˆ˜์˜ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ง‘ํ•ฉ H์— ๋„ฃ์–ด๋‘๊ณ , ๋ฌด์ž‘์œ„๋กœ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์„ ํƒํ•ด ํ•ด์‹œ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๊ธฐ๋ฒ•

ํ•ด์‹œ ์ถฉ๋Œ(Hash Collision)

  • ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด index๊ฐ’์„ ๊ตฌํ–ˆ์„ ๋•Œ ์ค‘๋ณต์ด ์ƒ๊ธฐ๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์˜ ํ•ด๊ฒฐ๋ฒ•์œผ๋กœ ๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ•(Separate Chaining)๊ณผ ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•(Open Addressing) ๋“ฑ์ด ์žˆ์Œ

(์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://st-lab.tistory.com/240?category=856997)

  • ๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ•(Separate Chaining)
    • ๋™์ผํ•œ ๋ฒ„ํ‚ท(bucket)์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ํŠธ๋ฆฌ ๋“ฑ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด ๋‹ค์Œ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ
    • ํ•œ ๋ฒ„ํ‚ท(์Šฌ๋กฏ) ๋‹น ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์—”ํŠธ๋ฆฌ์˜ ์ˆ˜์— ์ œํ•œ์„ ๋‘์ง€ ์•Š์Œ
    • ํ•ด์‹œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋”๋ผ๋„ linked list๋กœ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— index๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜์˜ ์ œ์•ฝ์ด ์—†๋‹ค๋Š” ์žฅ์ 
    • ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํ™•์žฅ์ด ํ•„์š” ์—†๊ณ  ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋ฉฐ ์›์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ 
    • ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ…Œ์ด๋ธ”์˜ ๋ถ€ํ•˜์œจ์— ๋”ฐ๋ผ ์„ ํ˜•์ ์œผ๋กœ ์„ฑ๋Šฅ์ด ์ €ํ•˜
    • ๋ถ€ํ•˜์œจ์ด ์ž‘์„ ๊ฒฝ์šฐ์—๋Š” open addressing ๋ฐฉ์‹์ด ๋น ๋ฆ„
  • ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•(Open Addressing)
    •  ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” chaining ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋น„์–ด์žˆ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ํ•œ ๋ฒ„ํ‚ท ๋‹น ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์—”ํŠธ๋ฆฌ๋Š” ํ•˜๋‚˜์ด์ง€๋งŒ ํ•ด์‹œ ํ•จ์ˆ˜๋กœ ์–ป์€ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ, ๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ๋ถ€ํ•˜์œจ(load factor)์ด ๋†’์„์ˆ˜๋ก(= ํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ๋ฐ€๋„๊ฐ€ ๋†’์„์ˆ˜๋ก) ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํžˆ ์ €ํ•˜
    • ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ• ๋ฐฉ์‹ 
      1. ์„ ํ˜• ํƒ์‚ฌ๋ฒ•(Linear Probing)
        • ์„ ํ˜•์œผ๋กœ ์ˆœ์ฐจ์  ๊ฒ€์ƒ‰์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•
        • ํ˜„์žฌ์˜ ๋ฒ„ํ‚ท index๋กœ๋ถ€ํ„ฐ ๊ณ ์ •ํญ๋งŒํผ ์ด๋™ํ•˜์—ฌ ์ฐจ๋ก€๋Œ€๋กœ ๊ฒ€์ƒ‰ํ•ด ๋น„์–ด ์žˆ๋Š” ๋ฒ„ํ‚ท์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
        • ํŠน์ • ํ•ด์‹œ ๊ฐ’์˜ ์ฃผ๋ณ€์ด ๋ชจ๋‘ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ์ผ์ฐจ ๊ตฐ์ง‘ํ™”(primary clustering) ๋ฌธ์ œ์— ์ทจ์•ฝ
        • ํ•ด์‹œ ์ถฉ๋Œ์ด ํ•ด์‹œ ๊ฐ’ ์ „์ฒด์— ๊ท ๋“ฑํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ๋•Œ ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•
      2. ์ œ๊ณฑ ํƒ์‚ฌ๋ฒ•(Quadratic Probing)
        • ํ•ด์‹œ์˜ ์ €์žฅ์ˆœ์„œ ํญ์„ ์ œ๊ณฑ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹
        • ์˜ˆ๋ฅผ ๋“ค์–ด ์ฒ˜์Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ 1๋งŒํผ ์ด๋™ํ•˜๊ณ , ๊ทธ๋‹ค์Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด 2^2, 3^2 ์นธ ์”ฉ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ์‹
        • ๋ฐ์ดํ„ฐ์˜ ๋ฐ€์ง‘๋„๊ฐ€ ์„ ํ˜• ํƒ์‚ฌ๋ฒ•๋ณด๋‹ค ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํ•ด์‹œ๊ฐ’๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฐ›์•„์„œ ์—ฐ์‡„์ ์œผ๋กœ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Œ
        • ์„ ํ˜• ํƒ์‚ฌ๋ฒ•๋ณด๋‹ค๋Š” ์บ์‹œ์˜ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ ธ์„œ ์†๋„์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
      3. ์ด์ค‘ ํ•ด์‹ฑ(Double Hasing Probing)
        • ํ•ด์‹œ๋œ ๊ฐ’์„ ํ•œ ๋ฒˆ ๋” ํ•ด์‹ฑํ•˜์—ฌ ํ•ด์‹œ์˜ ๊ทœ์น™์„ฑ์„ ์—†์• ๋ฒ„๋ฆฌ๋Š” ๋ฐฉ์‹(ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋ฐฉ์ง€)
        • ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์ค‘์œผ๋กœ ์‚ฌ์šฉ, ํ•˜๋‚˜๋Š” ์ตœ์ดˆ์˜ ํ•ด์‹œ๊ฐ’์„ ์–ป์„ ๋•Œ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํ•ด์‹œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ ํƒ์‚ฌ ์ด๋™ํญ์„ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
        • ํ•ด์‹œ๋œ ๊ฐ’์„ ํ•œ๋ฒˆ ๋” ํ•ด์‹ฑํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜๋ฏ€๋กœ ๊ธฐ์กด ๋ฐฉ์‹๋ณด๋‹ค ๋” ๋งŽ์€ ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋จ
        • ์ตœ์ดˆ ํ•ด์‹œ๊ฐ’์ด ๊ฐ™๋”๋ผ๋„ ํƒ์‚ฌ ์ด๋™ํญ์ด ๋‹ฌ๋ผ์ง€๊ณ , ํƒ์‚ฌ ์ด๋™ํญ์ด ๊ฐ™๋”๋ผ๋„ ์ตœ์ดˆ ํ•ด์‹œ๊ฐ’์ด ๋‹ฌ๋ผ์ ธ ์œ„์˜ ๋‘ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ์™„ํ™” ๊ฐ€๋Šฅ

 

๋ฐ˜์‘ํ˜•