HashTable

๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ธ HashMap์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

HashTable, HashMap์— ๋Œ€ํ•ด

  • HashTable์€ Dictionary, HashMap์€ AbstractMap์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • Dictionary์™€ AbstractMap์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋™์ผํ•˜๋‚˜ Java8 document์—์„  Map์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Dictionary Document

NOTE: This class is obsolete. New implementations should implement the Map interface, rather than extending this class.

HashMap์— ๋Œ€ํ•ด

  • Key๊ฐ’์„ Hash Function์„ ํ†ตํ•ด HashCode๋ฅผ ์–ป์–ด ํ•ด๋‹น Bucket์— Value๋ฅผ ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

Hash Function

์ž„์˜์˜ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•

  • hash(key) = key % size
    • bucket size์˜ ํฌ๊ธฐ๋ฅผ ์ •ํ•  ๋•Œ 2์˜ ์ง€์ˆ˜์Šน ๊ฐ’์— ๊ทผ์ ‘ํ•˜์ง€ ์•Š๋Š” ์†Œ์ˆ˜๋ฅผ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • size๊ฐ€ ํฌ๋ฉด ํด์ˆ˜๋ก ์ถฉ๋Œํ•˜๋Š” ํ™•๋ฅ ์ด ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.

๊ณฑํ•˜๊ธฐ ๋ฐฉ๋ฒ•

  • hash(key) = [size * (key*A % 1)] :: 0 < A < 1
    • key * A๋ฅผ ํ†ตํ•ด ์†Œ์ˆ˜๋ถ€๋ถ„์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
    • size๋ฅผ ๊ณฑํ•œ ํ›„์— ๋‚ด๋ฆผ ์—ฐ์‚ฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณฑํ•˜๊ธฐ์˜ ์žฅ์ ์€ size๊ฐ’์ด ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค๋Š” ๋‹ค์†Œ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

Universe Hashing

  • ๋‹ค์ˆ˜์˜ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ์ด ํ•ด์‹œํ•จ์ˆ˜์˜ ์ง‘ํ•ฉ H์—์„œ ๋ฌด์ž‘์œ„๋กœ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์„ ํƒํ•ด ํ•ด์‹œ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • ์•”ํ˜ธํ•™์—์„œ ์œ ์ผํ•œ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ƒ์˜ ์„ ํƒ์€ Hashing์ด ๋  ์ž๋ฃŒ์˜ ํŠน์„ฑ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Direct-Address Tables

  • ํ‚ค์˜ ์ „์ฒด ๊ฐœ์ˆ˜์™€ ๋™์ผํ•œ ํฌ๊ธฐ์˜ ๋ฒ„ํ‚ท์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์ ์€ ์—†์„๊นŒ์š”?

  • ํ˜„์žฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” Key์— ๋Œ€ํ•ด์„œ ๋ฏธ๋ฆฌ Memory๋ฅผ ํ• ๋‹น๋ฐ›์•„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • HashMap ํฌ๊ธฐ(size)๋Š” ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค ๊ฐœ์ˆ˜(key)๋ณด๋‹ค ์ ๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • load factor(ฮฑ) : key/size
    • ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ํ•œ ๋ฒ„ํ‚ท์— ํ‰๊ท  ๋ช‡ ๊ฐœ์˜ ํ‚ค๊ฐ€ ๋งคํ•‘๋˜๋Š”๊ฐ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.
  • load factor > 1 ์ธ ๊ฒฝ์šฐ์—๋Š” Hash Collision์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Java8์˜ HashMap Load Factor

์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”?

Dynamic resizing

  • Bucket Size๋ฅผ ๋‹จ์ˆœํžˆ 2๋ฐฐ๋กœ ๋Š˜๋ฆฐ ํ›„ Key๊ฐ’์„ ์žฌ๋ฐฐ์—ดํ•ฉ๋‹ˆ๋‹ค.

Open-Addressing

  • Open Addressing์€ ์—ฐ์†๋œ ๊ณต๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Separate Chaining์— ๋น„ํ•˜์—ฌ ์บ์‹œ ํšจ์œจ์ด ๋†’์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ ๋‹ค๋ฉด Open Addressing์ด Separate Chaining๋ณด๋‹ค ๋” ์„ฑ๋Šฅ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Linear Probing

  • ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์— ์ผ์ • Offset ๊ฐ„๊ฒฉ์œผ๋กœ Bucket์œผ๋กœ ์ ‘๊ทผํ•˜์—ฌ Search, Insert๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ตฌํ˜„์€ ๋งค์šฐ ์‰ฌ์šด ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • Value๊ฐ€ ํŠน์ • Area๋กœ ๋ชจ์ด๊ฒŒ ๋˜๋Š” Clustering์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ‰๊ท  ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์€ ์ ์  ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Quadratic Probing

  • Linear Probing์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 2์ฐจ์‹๊ณผ ๊ด€๋ จ๋œ Offset์œผ๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
    • Linear Probing๋ณด๋‹ค ๊ฐ€๋ฒผ์šด Clustering์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • ์ดˆ๊ธฐ Hashing๊ฐ’์ด ๋™์ผํ•œ ๊ฒฝ์šฐ์—๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Double Hashing

  • ์ดˆ๊ธฐ Hashing๊ฐ’๊ณผ Offset์„ ์–ป๋Š” Hashing์„ ๋”ฐ๋กœ ๋‘๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    • Cluserting ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Seperate Chaining With LinkedList

  • ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด LinkedList๋กœ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • LinkedList์˜ ํŠน์„ฑ์ƒ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(N)์ด๊ธฐ ๋•Œ๋ฌธ์— Red-Black Tree์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Reference