[JAVA] Hash

Coastbyยท2022๋…„ 11์›” 1์ผ
0

์ฝ”๋”ฉํ…Œ์ŠคํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
6/11

Hash


๐Ÿฆย ํ•ด์‹ฑ๊ณผ ํ•ด์‹œํ•จ์ˆ˜

๐Ÿ’ก Hash Function : ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ํ•จ์ˆ˜.
Hashing : ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋ฒ•.

Hash function

  • ๋ณดํ†ต ๋ณต์žกํ•˜์ง€ ์•Š์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ์‹œ์Šคํ…œ ์ž์› ์†Œ๋ชจ๊ฐ€ ๋œํ•˜๋‹ค.
  • ํ•ด์‹œ๊ฐ’ (ํ•ด์‹œ์„ฌ, ์ฒดํฌ์„ฌ) : ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌ ๋‚˜์˜จ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๊ฐ’

Hashing

  • ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋ฒ•.
  • ํ•ด์‹œํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ณณ์„ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
  • HashSet, HashMap, Hashtable ๋“ฑ์ด ํ•ด์‹ฑ์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.
    • ์‹ค์ œ ํ•ด์‹ฑ์„ ๊ตฌํ˜„ํ•œ Collection ํด๋ž˜์Šค์—์„œ๋Š” Object ํด๋ž˜์Šค์— ์ •์˜๋œ hashCode()๋ฅผ ํ•ด์‹œํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
    • hashCode()๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ๋ชจ๋“  ๊ฐ์ฒด์˜ ํ•ด์‹œ๊ฐ’์ด ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š”๋‹ค.
      • ์ฐธ๊ณ ) String ํด๋ž˜์Šค๋Š” hashCode()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์œผ๋กœ ํ•ด์‹œ๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

โ—‹ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ์˜ ํ™œ์šฉ

https://files.codingninjas.in/article_images/hash-table-vs-stl-map-0-1640100783.jpg

[์ €์žฅํ•˜๋Š” ๊ณผ์ •]

  • ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์„ ํ• ๋‹น๋ฐ›์€ ๋‹ค์Œ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณ ์œ  index๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด index์— ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
  • ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์˜ ๊ธฐ์ค€
    • ์ด์ƒ์ ์œผ๋กœ๋Š” ๋‹ค๋‹ค์ต์„ ์œผ๋กœ ํด ์ˆ˜๋ก ํ•ด์‹œ ์ถฉ๋Œ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ ๋‹นํžˆ ํฐ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•œ๋‹ค.
    • ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.
    • ํ†ต๊ณ„์ ์œผ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ” ์‚ฌ์šฉ ๊ณต๊ฐ„์ด 70~80% ์ •๋„๊ฐ€ ๋˜๋ฉด ํ•ด์‹œ์˜ ์ถฉ๋Œ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜์—ฌ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

[๊บผ๋‚ด๋Š” ๊ณผ์ •]

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

โ—‹ ํ•ด์‹œ ์ถฉ๋Œ

  • ๊ฐ™์€ ํ•ด์‹œ๊ฐ’์ด ๋‚˜์˜ค๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด index๊ฐ€ ๋™์ผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„ ๋Œ€๋Š” ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ, ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ ์ฒด์ด๋‹์ด ํšจ์œจ์ด ์ข‹๋‹ค.

๐Ÿ‘‰ย ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•1 - ๊ฐœ๋ณ„ ์ฒด์ด๋‹(Seperate Chaining)

  • ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ๋ฐฉ์‹
  • ๊ฐ๊ฐ์˜ index๋ฅผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ฐ™์€ ํ•ด์‹œ๊ฐ’์„ ๊ฐ€์ ธ๋„ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ
  • JAVA์˜ HashMap์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๐Ÿ‘‰ย ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•2 - ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ(Open Addressing)

  • ๋‹ค์Œ์— ์œ„์น˜ํ•œ index ์ค‘ ๋น„์–ด์žˆ๋Š” ๊ณณ์— ๋„ฃ์Œ
  • ์ „์ฒด ์Šฌ๋กฏ์˜ ๊ฐœ์ˆ˜ ์ด์ƒ์€ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋ชจ๋“  ์›์†Œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ž์‹ ์˜ ํ•ด์‹œ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ์ฃผ์†Œ์— ์ €์žฅ๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†๋‹ค.

โ—‹ ํ•ด์‹œํ…Œ์ด๋ธ” ์‹œ๊ฐ„ ๋ณต์žก๋„

  • O(1) : key๊ฐ’์€ ํ•ด์‹œํ•จ์ˆ˜์— ์˜ํ•ด ๊ณ ์œ  index๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜์–ด ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ chaining์— ์—ฐ๊ฒฐ๋œ ๋ฆฌ์ŠคํŠธ๋„ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ O(N)๊นŒ์ง€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ…Œ์ด๋ธ”์ด ๊ฝ‰ ์ฐจ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ํ…Œ์ด๋ธ”์„ ํ™•์žฅํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๊ธ‰์  ํ™•์žฅ์„ ํ•˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.

โ—‹ HashTable vs HashMap

  • ๋‘˜์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ๋™๊ธฐํ™” ๋ณด์žฅ ์œ ๋ฌด, ํ‚ค์™€ ๊ฐ’์— null ๊ฐ€๋Šฅ ์—ฌ๋ถ€์ด๋‹ค.
  • ๋™๊ธฐํ™” : ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉด HashTable์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ํ•„์š”์—†๋‹ค๋ฉด ๋น ๋ฅธ HashMap์ด ์œ ๋ฆฌํ•˜๋‹ค.
    • HashMap : ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ not-thread safeํ•˜๋‹ค.
    • HashTable : ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•œ๋‹ค. ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ ์œ ์ง€๋ฅผ ์œ„ํ•ด ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋Œ€์‹ , ๋™๊ธฐํ™”๋Š” ์†๋„๋ฅผ ๋Š๋ฆฌ๊ฒŒ ํ•œ๋‹ค.
  • null ๊ฐ’ :
    • HashMap : null๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค.
    • HashTable : null๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • HashTable์€ Collection ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ์ „์— ์กด์žฌํ•˜๋˜ ๊ฒƒ์œผ๋กœ ํ˜ธํ™˜์„ ์œ„ํ•ด ๋‚จ๊ฒจ๋‘์—ˆ์ง€๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
profile
ํ›ˆ์ด์•ผ ํ™”์ดํŒ…

0๊ฐœ์˜ ๋Œ“๊ธ€