๐Ÿ“Œ ๊ด€๋ จ ์šฉ์–ด ์ •๋ฆฌ
Hash : ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜
Hash Table : ํ‚ค ๊ฐ’์˜ ์—ฐ์‚ฐ์— ์˜ํ•ด ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ
Hash Functionย : ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž„์˜์˜ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ํ•จ์ˆ˜
Hashing : ํ‚ค(key)์™€ ๊ฐ’(value)์œผ๋กœ ๋งคํ•‘๋˜๋Š” ๊ณผ์ • ์ž์ฒด {: .notice}


Hashing

ํ•ด์‹ฑ


์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ๋งํ•œ๋‹ค.

๐Ÿ’ก ํ•ด์‹ฑ์ด ๋‚˜์˜ค๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ
๋Œ€๋ถ€๋ถ„์˜ ํƒ์ƒ‰ ๋ฐฉ๋ฒ•๋“ค์€ ํƒ์ƒ‰ ํ‚ค๋ฅผ ์ €์žฅ๋œ ํ‚ค๊ฐ’๊ณผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋น„๊ตํ•˜๋ฉด์„œ ํƒ์ƒ‰์„ ์›ํ•˜๋Š” ํ•ญ๋ชฉ์— ์ ‘๊ทผํ•œ๋‹ค. ๋ฐ˜๋ฉดย ํ•ด์‹ฑ์€ ํ‚ค ๊ฐ’์— ์ง์ ‘ ์‚ฐ์ˆ ์ ์ธ ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜์—ฌ ํ•ญ๋ชฉ์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š”ย ํ…Œ์ด๋ธ”์˜ ์ฃผ์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ํ•ญ๋ชฉ์— ์ ‘๊ทผํ•œ๋‹ค.
๋‹ค๋ฅธ ํƒ์ƒ‰ : ํ‚ค๋“ค์˜ ๋น„๊ต์— ์˜ํ•œ ํƒ์ƒ‰์€ ์ •๋ ฌ์ด ์•ˆ ๋˜์–ด ์žˆ๋‹ค๋ฉด O(n)์ด๊ณ  ์ •๋ ฌ์ด ๋˜์–ด ์žˆ๋‹ค๋ฉด O(logn)์ด๋‹ค.
ํ•ด์‹ฑ : ๋”์šฑ ๋น ๋ฅธ ํƒ์ƒ‰์„ ํ•„์š”๋กœ ํ•  ๋•Œ์— ์‚ฌ์šฉ๋œ๋‹ค. ํ•ด์‹ฑ์€ ์ด๋ก ์ ์œผ๋กœ O(1)์˜ ์‹œ๊ฐ„ ์•ˆ์— ํƒ์ƒ‰์„ ๋๋งˆ์น  ์ˆ˜๋„ ์žˆ๋‹ค. ํ•ด์‹ฑ์€ ๋ณดํ†ต ์‚ฌ์ „(dictionary)๊ณผ ๊ฐ™์€ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์— ์ตœ์ƒ์˜ ์„ ํƒ์ด ๋œ๋‹ค.


Hash Function

ํ•ด์‹œ ํ•จ์ˆ˜


์ž„์˜์˜ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋ฅผย ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ํ•ด์‹œ ํ•จ์ˆ˜์— ์˜ํ•ด ์–ป์–ด์ง€๋Š” ๊ฐ’์€ ํ•ด์‹œ ๊ฐ’, ํ•ด์‹œ ์ฝ”๋“œ, ํ•ด์‹œ ์ฒดํฌ์„ฌ ๋˜๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด์‹œ๋ผ๊ณ  ํ•œ๋‹ค.

Untitled


Hashย Table

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


ํ•ด์‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ (Key, Value)๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.ย ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ๋น ๋ฅธ ๊ฒ€์ƒ‰์†๋„๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ด์œ ๋Š”, ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด(bucket)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ๊ฐ๊ฐ์˜ key๊ฐ’์— ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌย ๋ฐฐ์—ด์˜ ๊ณ ์œ ํ•œ index๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด index๋ฅผ ํ™œ์šฉํ•ด ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค. ์‹ค์ œ ๊ฐ’์ด ์ €์žฅ๋˜๋Š” ์žฅ์†Œ๋ฅผ bucket(๋˜๋Š” Slot) ์ด๋ผ๊ณ  ํ•œ๋‹ค.

https://blog.kakaocdn.net/dn/ceKgGz/btqAUvLYrPN/DMVl0lwN8tA2hobFxqHcf0/img.png

๐Ÿ‘‰๐Ÿฝ ์›๋ž˜ ๋ฐ์ดํ„ฐ์˜ย ๊ฐ’(Key) โžก Hash Function โžก Hash Function์˜ ๊ฒฐ๊ณผ (=Hash Code) โžกย  Hash Code๋ฅผ ๋ฐฐ์—ด์˜ย Index ๋กœ ์‚ฌ์šฉ โžก ํ•ด๋‹นํ•˜๋Š” Index์— data ๋„ฃ๊ธฐ

์˜ˆ๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ๊ฐ€ (Key, Value)๊ฐ€ (โ€œJohn Smithโ€, โ€œ521-1234โ€)์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํฌ๊ธฐ๊ฐ€ 16์ธ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•œ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด ๋จผ์ € index = hash_function(โ€œJohn Smithโ€) % 16 ์—ฐ์‚ฐ์„ ํ†ตํ•ด index ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  array[index] = โ€œ521-1234โ€ ๋กœ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋‹ค ๋ณด๋ฉด ๊ณ„์‚ฐ๋œ ์ธ๋ฑ์Šค ๊ฐ’์ด ์ค‘๋ณต๋  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ €์žฅํ•˜๊ณ ์ž ํ•˜๋Š” ํ‚ค๊ฐ€ ์ •์ˆ˜์ด๊ณ  hash_function์ด key%10์ด๋‹ค. ์ „์ฒด ์‚ฌ์ด์ฆˆ๊ฐ€ 10์ผ๋•Œ, key 1,11,21์€ ๊ฐ™์€ ์ธ๋ฑ์Šค ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.ย ์ถฉ๋Œ (collision)์ด๋ผ๊ณ ํ•œ๋‹ค.

๐Ÿ“Œ ์žฅ์ 

  • ์ ์€ ๋ฆฌ์†Œ์Šค๋กœ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๐Ÿ‘‰๐Ÿฝ HDD, Cloud์— ์กด์žฌํ•˜๋Š” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋“ค์„ ์œ ํ•œํ•œ ๊ฐœ์˜ ํ•ด์‹œ(Hash)๊ฐ’์œผ๋กœ ๋งคํ•‘ํ•˜์—ฌ ์ž‘์€ ํฌ๊ธฐ์˜ ์บ์‰ฌ ๋ฉ”๋ชจ๋ฆฌ๋กœ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.{: .notice}

  • key-value ๊ฐ€ 1:1 ๋กœ ๋งคํ•‘๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฒ€์ƒ‰์˜ ๊ณผ์ •์ด ๋ชจ๋‘ ํ‰๊ท ์ ์œผ๋กœ O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š”๋ฐ ์œ ์šฉํ•˜๋‹ค.
  • ํ‚ค(key)์™€ ํ•ด์‹œ๊ฐ’(Hash)์ด ์—ฐ๊ด€์„ฑ์ด ์—†์–ด ๋ณด์•ˆ์—๋„ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์บ์‹ฑ(Data Caching)์— ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

    ๐Ÿ‘‰๐Ÿฝ get(key), put(key)์— ์บ์‹œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž์ฃผ hitํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ๋‹จ์ 

  • ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • ์ˆœ์„œ/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์—๋Š” ์–ด์šธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
  • ๊ณต๊ฐ„ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. -> ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ์ €์žฅ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • hash function์˜ ์˜์กด๋„๊ฐ€ ๋†’๋‹ค => ํ•ด์‹œํ•จ์ˆ˜๊ฐ€ ๋ณต์žกํ•œ ๊ฒฝ์šฐ ์—ฐ์‚ฐ์†๋„ ์ฆ๊ฐ€


Hash Function

ํ•ด์‹œ ํ•จ์ˆ˜


ํ•ด์‹œ ํ•จ์ˆ˜์—์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ณ ์œ ํ•œ ์ธ๋ฑ์Šค ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํ•ด์‹œ ํ•จ์ˆ˜๋กœ๋Š” ์•„๋ž˜์˜ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. Division Method : ๋‚˜๋ˆ—์…ˆ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ž…๋ ฅ๊ฐ’์„ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ„์–ด ๊ณ„์‚ฐํ•œ๋‹ค. (์ฃผ์†Œ = ์ž…๋ ฅ๊ฐ’ % ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ)ย ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋ฅผ ์†Œ์ˆ˜๋กœ ์ •ํ•˜๊ณ  2์˜ ์ œ๊ณฑ์ˆ˜์™€ ๋จผ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํšจ๊ณผ๊ฐ€ ์ข‹๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ๋‹ค.
  2. Digit Folding : ๊ฐ Key์˜ ๋ฌธ์ž์—ด์„ ASCII ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๊ณ  ๊ฐ’์„ ํ•ฉํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ” ๋‚ด์˜ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  3. Multiplication Method : ๊ณฑํ•˜๊ธฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์ˆซ์ž๋กœ ๋œ Key๊ฐ’ x์™€ 0๊ณผ 1์‚ฌ์ด์˜ ์‹ค์ˆ˜ A, ๋ณดํ†ต 2์˜ ์ œ๊ณฑ์ˆ˜์ธ m์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ„์‚ฐ์„ ํ•ด์ค€๋‹ค.

    Untitled

    Untitled

  4. Universal Hashing : ๋‹ค์ˆ˜์˜ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ง‘ํ•ฉ H์— ๋„ฃ์–ด๋‘๊ณ , ๋ฌด์ž‘์œ„๋กœ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์„ ํƒํ•ด ํ•ด์‹œ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.


Collision

์ถฉ๋Œ


์„œ๋กœ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์ด Hash function์„ ํ†ตํ•ด Hash ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ (์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ)์ด๋‹ค.์ถฉ๋Œ์„ ์ค„์—ฌ์ฃผ๋Š” ์ข‹์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ถฉ๋Œ์ด ๋งŽ์•„์งˆ ์ˆ˜๋ก ํƒ์ƒ‰์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(1)์—์„œ O(n)์— ๊ฐ€๊นŒ์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Separating Chaining - Linked List, Tree(Red-Black Tree)
  2. Open addressing - Linear Probing, Quadratic Probing, Double hashing


1. Separating Chaining

๋™์ผํ•œ ๋ฒ„ํ‚ท์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.ย ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋™์ผํ•œ ๋ฒ„ํ‚ท์œผ๋กœ ์ ‘๊ทผ์„ ํ•œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋“ค์„ ์—ฐ๊ฒฐ์„ ํ•ด์„œ ๊ด€๋ฆฌํ•ด์ฃผ๊ณ  ์žˆ๋‹ค. ์‹ค์ œ๋กœ Java8์˜ Hashํ…Œ์ด๋ธ”์€ Self-Balancing Binary Search Tree ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด Chaining ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

Separating Chaining์€ JDK(Java Development Kit) ๋‚ด๋ถ€์—์„œ๋„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ถฉ๋Œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ธ๋ฐ, ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค. ์ด๋•Œ ํ™œ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋Š” Linked List์™€ Tree(Red-Black Tree)์ด๋‹ค.

๋‘ ๊ฐ€์ง€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€, data๊ฐ€ 6๊ฐœ ์ดํ•˜์ด๋ฉด linked list๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  8๊ฐœ ์ด์ƒ์ด๋ฉด tree๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (์™œ 7๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ƒ ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ 7๊ฐœ์ผ ๋•Œ, ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ฒŒ ๋˜๋ฉด linked list๋กœ ๋ฐ”๊ฟ”์•ผ ํ•˜๊ณ  ๋งŒ์•ฝ ์ถ”๊ฐ€๋˜๋ฉด tree๋กœ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค. ์ด๋•Œ ๋ฐ”๊พธ๋Š”๋ฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์ค€์ด 6, 8์ด๋‹ค.)

Separating Chaining - Linked list

Separating Chaining - Linked list

์œ„ ๊ทธ๋ฆผ์€ Linked list๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ์ถฉ๋Œ์ด ๋‚  ๋•Œ, ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” linked list์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ’์„ ์‚ฝ์ž…ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ๋Š” ํ‚ค์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” Linked list๋ฅผ ์„ ํ˜• ๊ฒ€์ƒ‰ํ•˜์—ฌ, ํ•ด๋‹น ํ‚ค์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์‚ญ์ œํ•˜๋Š” ๊ฒƒ๋„ ๋น„์Šทํ•˜๊ฒŒ, ํ‚ค์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” Linked list์—์„œ, ๊ทธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค. Separate changing ๋ฐฉ์‹์€ Linked List ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์˜ ์ œ์•ฝ์ด ์ž‘๋‹ค.

์ด๋Ÿฌํ•œ Chaining ๋ฐฉ์‹์€ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํ™•์žฅ์ด ํ•„์š”์—†๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์†์‰ฝ๊ฒŒ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋™์ผํ•œ ๋ฒ„ํ‚ท์— chaining๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๋ฉฐ ๊ทธ์— ๋”ฐ๋ผ ์บ์‹œ์˜ ํšจ์œจ์„ฑ์ด ๊ฐ์†Œํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.


2. Open addressing

์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Chaining ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋น„์–ด์žˆ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Separate chaining๋ฐฉ์‹์— ๋น„ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋œ ์‚ฌ์šฉํ•œ๋‹ค. Open Addressing์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” 3๊ฐ€์ง€ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค.

  1. Linear Probing
  2. Quadratic Probing
  3. Double Hashing Probing


1) Linear Probing

ํ˜„์žฌ์˜ ๋ฒ„ํ‚ท index๋กœ๋ถ€ํ„ฐ ๊ณ ์ •ํญ๋งŒํผ์”ฉ ์ด๋™ํ•˜์—ฌ ์ฐจ๋ก€๋Œ€๋กœ ๊ฒ€์ƒ‰ํ•ด ๋น„์–ด ์žˆ๋Š” ๋ฒ„ํ‚ท์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

Open addressing -ย Linear Probing

Open addressing -ย Linear Probing

Linear Probing๋ฐฉ์‹์€ ์ธ๋ฑ์Šค๊ฐ€ ์ค‘๋ณต๋˜๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๋•Œ ์ธ๋ฑ์Šค ๋’ค์— ์žˆ๋Š” ๋ฒ„ํ‚ท์ค‘์— ๋นˆ ๋ฒ„ํ‚ท์„ ์ฐพ์•„์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆผ์—์„œ Sandra(key)์˜ ์ธ๋ฑ์Šค๋Š” 152์ด๋‹ค. ํ•˜์ง€๋งŒ ํ‚ค John๊ณผ ์ถฉ๋Œ์ด ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋‹ค์Œ ์ธ๋ฑ์Šค์ธ 153์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š”๋‹ค.

Linear Probing ๋ฐฉ์‹์—์„œ์˜ ํƒ์ƒ‰์€ Sandra(key)์— ๋Œ€ํ•ด์„œ ๊ฒ€์ƒ‰์„ ํ•˜๋ฉด, index๊ฐ€ 152์ด๊ธฐ ๋•Œ๋ฌธ์—, key๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋’ค์˜ index๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ ๊ฐ™์€ ํ‚ค๊ฐ€ ๋‚˜์˜ค๊ฑฐ๋‚˜ ๋˜๋Š” Key๊ฐ€ ์—†์„๋•Œ ๊นŒ์ง€ ๊ฒ€์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค. ์‚ญ์ œ๋Š” ๋”๋ฏธ ๋…ธ๋“œ๋ฅผ ๋„ฃ์–ด์„œ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋‹ค์Œ ์ธ๋ฑ์Šค๊นŒ์ง€ ๊ฒ€์ƒ‰์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์ค˜์•ผํ•œ๋‹ค. (์ฆ‰, ์‚ญ์ œ๊ฐ€ ์–ด๋ ต๋‹ค.)

๐Ÿ’ก Dummy Node
์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•˜๋‚˜๋Š” ๋”๋ฏธ ๋…ธ๋“œ(Dummy Node)๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ  ํ•˜๋‚˜๋Š” ํ—ค๋“œ ํฌ์ธํ„ฐ(Head Pointer)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
๋”๋ฏธ ๋…ธ๋“œ๋ž€, ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ์œ„ํ•œ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋…ธ๋“œ์˜ ์ถ”๊ฐ€/์‚ญ์ œ ๊ตฌํ˜„์˜ ๊ฐ„ํŽธ์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ์ด๋‹ค. ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์˜ ์—ญํ• ๋งŒ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋ฐ˜๋ฉด ํ—ค๋“œ ํฌ์ธํ„ฐ๋ž€, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ด๋‹ค. ๋”๋ฏธ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ข€ ๋” ๊ตฌํ˜„์ด ํŽธํ•˜๊ณ  ๊ณ ๋ คํ•ด์•ผ ํ•  ์ˆ˜๊ฐ€ ์ ๋‹ค.


2) Quadratic Probing

ํ•ด์‹œ์˜ ์ €์žฅ์ˆœ์„œ ํญ์„ ์ œ๊ณฑ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฒ˜์Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์—๋Š” 1๋งŒํผ ์ด๋™ํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ๊ณ„์† ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด $2^2$, $3^2$ ์นธ์”ฉ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ์‹์ด๋‹ค.

 ~


3) Double Hashing Probing

ํ•ด์‹œ๋œ ๊ฐ’์„ ํ•œ๋ฒˆ ๋” ํ•ด์‹ฑํ•˜์—ฌ ํ•ด์‹œ์˜ ๊ทœ์น™์„ฑ์„ ์—†์• ๋ฒ„๋ฆฌ๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ•ด์‹œ๋œ ๊ฐ’์„ ํ•œ๋ฒˆ ๋” ํ•ด์‹ฑํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค๋ณด๋‹ค ๋งŽ์€ ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.


๐Ÿ’ก Resizing

Separate chaning์— ๊ฒฝ์šฐ, ๋ฒ„ํ‚ท์ด ์ผ์ • ์ˆ˜์ค€์œผ๋กœ ์ฐจ ๋ฒ„๋ฆฌ๋ฉด ๊ฐ ๋ฒ„ํ‚ท์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” List์˜ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํ‚ท์˜ ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ ค์ค˜์•ผ ํ•œ๋‹ค. ๋˜ํ•œ Open addressing์˜ ๊ฒฝ์šฐ, ๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋” ๋„ฃ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฐ์—ด์„ ํ™•์žฅํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผย ๋ฆฌ์‚ฌ์ด์ง•(Resizing)์ด๋ผ๊ณ ย ํ•œ๋‹ค.

๋ณดํ†ต ๋‘ ๋ฐฐ๋กœ ํ™•์žฅํ•˜๋Š”๋ฐ, ํ™•์žฅํ•˜๋Š” ์ž„๊ณ„์ ์€ ํ˜„์žฌ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ํ•ด์‹œ ๋ฒ„ํ‚ท์˜ ๊ฐœ์ˆ˜์˜ 75%๊ฐ€ ๋  ๋•Œ์ด๋‹ค. 0.75๋ผ๋Š” ์ˆซ์ž๋Š” load factor๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. ๋ฆฌ์‚ฌ์ด์ง•์€ ๋” ํฐ ๋ฒ„ํ‚ท์„ ๊ฐ€์ง€๋Š” array๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“  ๋‹ค์Œ์—, ๋‹ค์‹œ ์ƒˆ๋กœ์šด array์— hash๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์„œ ๋ณต์‚ฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.



์ฐธ๊ณ ์ž๋ฃŒ