ํ•ด์‹ฑ

9/5/2025

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

ํ•ด์‹ฑ์˜ ๋™๊ธฐ: TLB์™€์˜ ์œ ์‚ฌ์„ฑ

CPU๊ฐ€ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค. ํ˜„๋Œ€ ์ปดํ“จํ„ฐ๋Š” ๊ฐ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹คย ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ ๋ฅผ ๋ถ€์—ฌํ•˜๋Š”๋ฐ, ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ํšจ์œจ์„ฑ๊ณผ ๋ณด์•ˆ์ƒ ์žฅ์ ์ด ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ CPU๊ฐ€ ์‹ค์ œ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด TLB(Translation Lookaside Buffer) ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

TLB๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ์™€ ๋ฌผ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋งคํ•‘ํ•œ ํ…Œ์ด๋ธ”๋กœ, ๋น ๋ฅธ ์ฃผ์†Œ ๋ณ€ํ™˜์„ ์ œ๊ณตํ•œ๋‹ค. ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์ด์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ด์„œ ๊ธฐ์กด ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค.

ํ•ด์‹ฑ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ : ํ‰๊ท  O(1) ์ตœ์•… O(n)

ํ•ด์‹ฑ์ด ํ•„์š”ํ•œ ์ด์œ 

์˜ˆ์‹œ: ์ฒ˜์Œ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ž ์ฐพ๊ธฐ

๋ฌธ์ž์—ด์—์„œ ์ฒ˜์Œ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ž๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ƒ๊ฐํ•ด๋ณด์ž.

๋ฐฉ๋ฒ• 1: ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ

for i in range(len(s)):
    for j in range(i+1, len(s)):
        if s[i] == s[j]:
            return s[i]

์‹œ๊ฐ„ ๋ณต์žก๋„: O(nยฒ)

๋ฐฉ๋ฒ• 2: ๋ฐฐ์—ด ์นด์šดํ„ฐ ์‚ฌ์šฉ

count = [0] * 128  # ASCII ๋ฌธ์ž ๊ฐœ์ˆ˜
for char in s:
    count[ord(char)] += 1
    if count[ord(char)] == 2:
        return char

์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)

๋ฌธ์ž์˜ ๊ฒฝ์šฐ ASCII ์ฝ”๋“œ๋กœ ์œ ํ•œํ•œ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ๋ฏธ๋ฆฌ ๋ฐฐ์—ด ํฌ๊ธฐ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒย ์ž์—ฐ์ˆ˜์ฒ˜๋Ÿผ ๊ฐ€๋Šฅํ•œ ์ „์ฒด ์ง‘ํ•ฉ U์˜ ํฌ๊ธฐ๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ๋˜๋Š” ์ง‘ํ•ฉ K์˜ ํฌ๊ธฐ๋ณด๋‹ค ์›”๋“ฑํžˆ ํฐ ๊ฒฝ์šฐ์—๋Š” ํ•ด์‹ฑ์ด ์‚ฌ์šฉ๋œ๋‹ค.

ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ๊ตฌ์„ฑ ์š”์†Œ

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

ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.

  • ํ‚ค(Key): ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณ ์œ ํ•œ ๊ฐ’
  • ๊ฐ’(Value): ์‹ค์ œ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ
  • ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์ ‘๊ทผ: ํ‰๊ท  O(1) ์‹œ๊ฐ„์— ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ

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

ํ•ด์‹ฑ์—์„œ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ์š”์†Œ๋กœ, ํ‚ค๋ฅผ ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.

ํ•ด์‹œํ•จ์ˆ˜์˜ ์ค‘์š”ํ•œ ํŠน์„ฑ:

  • ๋น ๋ฅธ ์—ฐ์‚ฐ: ํ•ด์‹œํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ ๋А๋ฆฌ๋ฉด ํ•ด์‹ฑ์˜ ์žฅ์ ์ด ์‚ฌ๋ผ์ง„๋‹ค
  • ๊ท ๋“ฑ ๋ถ„ํฌ: ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ” ์ „์ฒด์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ์‹œ์ผœ์•ผ ํ•œ๋‹ค
  • ๊ฒฐ์ •์ : ๊ฐ™์€ ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ•ญ์ƒ ๊ฐ™์€ ์ถœ๋ ฅ์„ ๋‚ด์•ผ ํ•œ๋‹ค
  • ์ถฉ๋Œ ์ตœ์†Œํ™”: ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๊ฐ€ ๊ฐ™์€ ์ธ๋ฑ์Šค๋กœ ๋งคํ•‘๋˜๋Š” ๊ฒƒ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•œ๋‹ค

์ผ๋ฐ˜์ ์ธ ํ•ด์‹œํ•จ์ˆ˜ ์˜ˆ์‹œ:

  • Division Method:ย h(k) = k mod m
  • Multiplication Method:ย h(k) = floor(m * (k*A mod 1))
  • Universal Hashing

์ถฉ๋Œ(Collision) ์ฒ˜๋ฆฌ

์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ํ‚ค๊ฐ€ ๊ฐ™์€ ์ธ๋ฑ์Šค๋กœ ๋ณ€ํ™˜๋˜๋Š” ํ˜„์ƒ์„ ์ถฉ๋Œ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1. ์ฒด์ด๋‹(Chaining)

  • ๊ฐ™์€ ์ธ๋ฑ์Šค์— ๋งคํ•‘๋˜๋Š” ๋ชจ๋“  ์›์†Œ๋ฅผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค
  • ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ณ  ํ…Œ์ด๋ธ”์ด ๊ฐ€๋“ ์ฐจ๋„ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์™„๋งŒํ•˜๋‹ค
  • ํ•˜์ง€๋งŒ ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค

2. ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•(Open Addressing)

  • ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ๋‹ค๋ฅธ ๋นˆ ์Šฌ๋กฏ์„ ์ฐพ์•„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค
  • ์„ ํ˜• ํƒ์‚ฌ(Linear Probing), ์ด์ฐจ ํƒ์‚ฌ(Quadratic Probing), ์ด์ค‘ ํ•ด์‹ฑ(Double Hashing) ๋“ฑ์ด ์žˆ๋‹ค
  • ๋ฉ”๋ชจ๋ฆฌ๋Š” ํšจ์œจ์ ์ด์ง€๋งŒ ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค

ํ•ด์‹ฑ์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  • ๋น ๋ฅธ ์ ‘๊ทผ: ํ‰๊ท  O(1) ์‹œ๊ฐ„์— ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค
  • ์œ ์—ฐ์„ฑ: ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ: ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•œ๋‹ค (์ฒด์ด๋‹์˜ ๊ฒฝ์šฐ)

๋‹จ์ 

  • ์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) (๋ชจ๋“  ํ‚ค๊ฐ€ ๊ฐ™์€ ์ธ๋ฑ์Šค๋กœ ํ•ด์‹ฑ๋˜๋Š” ๊ฒฝ์šฐ)
  • ์ˆœ์„œ ๋ณด์žฅ ์—†์Œ: ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฝ์ž… ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค
  • ํ•ด์‹œํ•จ์ˆ˜ ์˜์กด์„ฑ: ์ข‹์ง€ ์•Š์€ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํžˆ ์ €ํ•˜๋œ๋‹ค
  • ๊ณต๊ฐ„ ์˜ค๋ฒ„ํ—ค๋“œ: ์ถฉ๋Œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค

ํ•ด์‹ฑ vs ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ

| ์ž๋ฃŒ๊ตฌ์กฐ | ํ‰๊ท  ๊ฒ€์ƒ‰ | ํ‰๊ท  ์‚ฝ์ž… | ํ‰๊ท  ์‚ญ์ œ | ๊ณต๊ฐ„ ๋ณต์žก๋„ |
| -------- | -------- | -------- | -------- | ------ |
| ํ•ด์‹œํ…Œ์ด๋ธ” | O(1) | O(1) | O(1) | O(n) |
| ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ | O(log n) | O(log n) | O(log n) | O(n) |
| ๋ฐฐ์—ด (์ •๋ ฌ๋œ) | O(log n) | O(n) | O(n) | O(n) |
| ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ | O(n) | O(1) | O(n) | O(n) |

๊ฒฐ๋ก 

ํ•ด์‹ฑ์€ย ๊ณต๊ฐ„์„ ์กฐ๊ธˆ ๋” ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋Œ€ํญ ์ค„์ด๋Š”ย ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ข‹์€ ํ•ด์‹œํ•จ์ˆ˜์™€ ์ ์ ˆํ•œ ์ถฉ๋Œ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•œ๋‹ค๋ฉด, ๋Œ€๋ถ€๋ถ„์˜ ์‹ค์šฉ์ ์ธ ์ƒํ™ฉ์—์„œ ๋งค์šฐ ํšจ์œจ์ ์ธ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

ํŠนํžˆ ๋ฐ์ดํ„ฐ์˜ ๋นˆ๋ฒˆํ•œ ๊ฒ€์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ํ•ด์‹œํ…Œ์ด๋ธ”์ด ์ตœ์ ์˜ ์„ ํƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ด์ง„ ํŠธ๋ฆฌ์™€ ๊ฐ™์€ ๊ฒ€์ƒ‰๊ณผ ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ์ ์ ˆํžˆ ๋น ๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ์ด๋“์ด๋‹ˆ๊นŒ ๋ง์ด๋‹ค.