๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/Java

ํ•ด์‹œ ์ž๋ฃŒ๊ตฌ์กฐ์™€, ํ•ด์‹œ ์ถฉ๋Œ ๊ทธ๋ฆฌ๊ณ  Java์˜ HashMap ๋™์ž‘ ๋ฐฉ๋ฒ•

by dkswnkk 2022. 12. 30.

๋ชฉ์ฐจ

  1. ํ•ด์‹œ๋ž€?
  2. ํ•ด์‹œํ•จ์ˆ˜๋ž€?
  3. ํ•ด์‹œ ์ถฉ๋Œ ์™„ํ™” ๋ฐฉ๋ฒ•
  4. Java์—์„œ HashMap ๋™์ž‘ ๋ฐฉ๋ฒ•

 

 

ํ•ด์‹œ(Hash)๋ž€?

ํ•ด์‹œ(Hash) ๊ตฌ์กฐ๋ž€, key-value์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ์จ, ํ•ด์‹œ ๊ตฌ์กฐ์—์„œ๋Š” key๋ฅผ ์ด์šฉํ•˜์—ฌ value๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ์˜ Dicitionary, ๋ฃจ๋น„์˜ Hash, Java์˜ HashMap, C++์˜ unordered_map์ด ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

 

 

ํ•ด์‹œ ํ•จ์ˆ˜(Hash Function)์ด๋ž€?

ํ•ด์‹œ ํ•จ์ˆ˜๋ž€, ์ž„์˜ ๊ธธ์ด์˜ ์ž…๋ ฅ ๊ฐ’์„ ๊ณ ์ • ๊ธธ์ด์˜ ์•”ํ˜ธํ™”๋œ ์ถœ๋ ฅ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. key๋ฅผ ํ•ด์‹œ ํ•จ์ˆ˜์— ๋„ฃ์–ด์„œ ๋‚˜์˜ค๋Š” ๊ฒฐ๊ณผ๊ฐ€ hash์ด๋ฉฐ, ๊ฒฐ๊ตญ ํ•ด์‹œ ํ•จ์ˆ˜๋ž€ key๋ฅผ hash๋กœ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€์˜ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์–ด๋–ค ์ž…๋ ฅ ๊ฐ’์—๋„ ํ•ญ์ƒ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ํ•ด์‹œ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
  2. ์ž…๋ ฅ ๊ฐ’์˜ ์•„์ฃผ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.(๋ˆˆ์‚ฌํƒœ ํšจ๊ณผ)
  3. ์ถœ๋ ฅ๋œ ๊ฒฐ๊ด๊ฐ’์„ ํ†ตํ•ด ์ž…๋ ฅ๊ฐ’์„ ์œ ์ถ”ํ•  ์ˆ˜ ์—†๋‹ค.

๊ฐ๊ฐ์˜ ํŠน์ง•์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ฒซ ๋ฒˆ์งธ, '์–ด๋–ค ์ž…๋ ฅ ๊ฐ’์—๋„ ํ•ญ์ƒ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ํ•ด์‹œ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.'๋ผ๋Š” ํŠน์ง•์€ ์ž…๋ ฅ๊ฐ’์ด ์งง๋“  ๊ธธ๋“  ํ•ญ์ƒ ๋™์ผํ•œ ๊ธธ์ด์˜ ํ•ด์‹œ๊ฐ’์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ํ•ด์‹œ๋Š” ํฌ๊ฒŒ MD ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ˜น์€ SHA ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋Š”๋ฐ, ๊ฐ„๋‹จํ•˜๊ฒŒ SHA ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์ฒซ ๋ฒˆ์งธ ํŠน์ง•์„ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ์ž…๋ ฅ๊ฐ’์„ SHA256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜์—ฌ ํ•ด์‰ฌ๊ฐ’์„ ์†์‰ฝ๊ฒŒ ์ถœ๋ ฅ์‹œ์ผœ ์ฃผ๋Š” ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.(https://www.convertstring.com/ko/Hash/SHA256)

๊ณ ์ •๋œ ๊ธธ์ด์˜ ํ•ด์‰ฌ๊ฐ’ ์ถœ๋ ฅ

์œ„ ๊ฒฐ๊ณผ๋ฅผ ์ž˜ ๋ณด๋ฉด ์ž…๋ ฅ๊ฐ’์˜ ๊ธธ์ด์— ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ๊ณ ์ •๋œ ๊ธธ์ด์˜ ํ•ด์‹œ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ์–ด๋–ค ๊ธธ์ด์˜ ์ž…๋ ฅ๊ฐ’์ด ๋“ค์–ด์˜ค๋”๋ผ๋„ 256๋น„ํŠธ์˜ ๊ณ ์ •๋œ ๊ฒฐ๊ด๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ, '์ž…๋ ฅ ๊ฐ’์˜ ์•„์ฃผ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.(๋ˆˆ์‚ฌํƒœ ํšจ๊ณผ)'๋ผ๋Š” ํŠน์ง•์€ ์ž…๋ ฅ๊ฐ’์ด ํ•œ ๊ธ€์ž๋งŒ ๋ฐ”๋€Œ์–ด๋„ ์ด์ „๊ณผ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฒฐ๊ด๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ „ํ˜€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ๊ฐ’ ์ถœ๋ ฅ

์ž์„ธํžˆ ๋ณด๋ฉด ๋งˆ์นจํ‘œ ํ•˜๋‚˜๋งŒ ์ œ๊ฑฐํ–ˆ์„ ๋ฟ์ธ๋ฐ ์ฒ˜์Œ์˜ ์ถœ๋ ฅ๊ฐ’๊ณผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒฐ๊ด๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ํ•ด์‹œํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๊ฐ’์ผ ๋™์ผํ•  ๊ฒฝ์šฐ์—๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ด๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ, '์ถœ๋ ฅ๋œ ๊ฒฐ๊ด๊ฐ’์„ ํ†ตํ•ด ์ž…๋ ฅ๊ฐ’์„ ์œ ์ถ”ํ•  ์ˆ˜ ์—†๋‹ค'๋ผ๋Š” ํŠน์ง•์€ ๋ง ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๊ฐ’์„ ํ†ตํ•ด ์ž…๋ ฅ๊ฐ’์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์—†๋‹ค๋Š” ๋ง์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์ด๋ฏธ์ง€๋“ค์„ ์‚ดํŽด๋ณด์•˜์„ ๋•Œ ์ถœ๋ ฅ๊ฐ’์„ ํ†ตํ•ด ์ „ํ˜€ ์ž…๋ ฅ๊ฐ’์„ ์œ ์ถ”ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

ํ•ด์‹œ ์ถฉ๋Œ(Hash Collision)์ด๋ž€?

์œ„์—์„œ ์‚ดํŽด๋ณธ ํ•จ์ˆ˜์—๋„ ๋‹จ์ ์ด ์กด์žฌํ•˜๋Š”๋ฐ, ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ ๊ฐ’์˜ ๊ธธ์ด๊ฐ€ ์–ด๋–ป๋“  ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅ๊ฐ’์ด ๋‹ค๋ฅด๋”๋ผ๋„ ๊ฐ™์€ ๊ฒฐ๊ด๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํ•ด์‹œ ์ถฉ๋Œ(Hash Collision)์ด๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋ฉฐ, ํ•ด์‹œ ์ถฉ๋Œ์ด ์ ์€ ํ•จ์ˆ˜๊ฐ€ ์ข‹์€ ํ•ด์‹œํ•จ์ˆ˜๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

ํ•ด์‹œ ์ถฉ๋Œ ์˜ˆ์‹œ

์œ„ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด "ARGOS"์™€ "MINIBEEF"๋ผ๋Š” key๊ฐ’์ด ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์ณค๋Š”๋ฐ ๋‘˜ ๋‹ค 15๋ผ๋Š” ๋™์ผํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด์‹œ ์ถฉ๋Œ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ข€ ๋” ์ƒ์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ ๋จผ์ € ์ ์žฌ์œจ(load factor)์˜ ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ์žฌ์œจ(load factor)์ด๋ž€ ํ•ด์‹œ ํ…Œ์ด์˜ ํฌ๊ธฐ์— ๋Œ€ํ•œ ํ‚ค์˜ ๊ฐœ์ˆ˜์˜ ๋น„์œจ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ํ‚ค์˜ ๊ฐœ์ˆ˜๋ฅผ K, ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋ฅผ N์ด๋ผ๊ณ  ํ–ˆ์„ ๋•Œ ์ ์žฌ์œจ์€ K/N์ด ๋ฉ๋‹ˆ๋‹ค.

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


์œ„์™€ ๊ฐ™์ด HashMap์€ ํ‚ค ์ง‘ํ•ฉ์ธ ์ •์˜์—ญ๊ณผ, ๊ฐ’ ์ง‘ํ•ฉ์ธ ๊ณต์—ญ์˜ ๋Œ€์‘์— ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ธฐ์— ํ•ด์‹œ ์ถฉ๋Œ์ด ํ•˜๋‚˜๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋น„๋‘˜๊ธฐ์ง‘ ์›๋ฆฌ์— ์˜ํ•ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด์‹œ ์ถฉ๋Œ์— ๋Œ€ํ•ด ์•ˆ์ „ํ•˜๋‹ค๋Š” ํ•ด์‹œ ํ•จ์ˆ˜๋Š” '์ถฉ๋Œ์ด ๊ฑฐ์˜ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค'๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ๋ฌดํ•œํ•œ ๊ฐ€์ง“์ˆ˜์˜ ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„ ์œ ํ•œํ•œ ๊ฐ€์ง“์ˆ˜์˜ ์ถœ๋ ฅ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋น„๋‘˜๊ธฐ์ง‘ ์›๋ฆฌ์— ์˜ํ•ด ํ•ด์‹œ ์ถฉ๋Œ์€ ํ•ญ์ƒ ์กด์žฌํ•˜๋ฉฐ, ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด์‹œ ์ถฉ๋Œ์„ ์™„ํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

ํ•ด์‹œ ์ถฉ๋Œ ์™„ํ™” ๋ฐฉ๋ฒ•

ํ•ด์‹œ ์ถฉ๋Œ์„ ์™„ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ํฌ๊ฒŒ Open Addressing๊ณผ Separating Chaining ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•(open addressing): ํ•ด์‹œ ํ…Œ์ด๋ธ” ํฌ๊ธฐ๋Š” ๊ณ ์ •ํ•˜๋ฉด์„œ ์ €์žฅํ•  ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค.
  • ๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ• (separate chaining): ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

๊ฐ๊ฐ์˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•œ๋ฒˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•(open-address)

open addressing์€ ํ•œ ๋ฒ„ํ‚ท ๋‹น ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์—”ํŠธ๋ฆฌ๋Š” ํ•˜๋‚˜์ด์ง€๋งŒ ํ•ด์‹œ ํ•จ์ˆ˜๋กœ ์–ป์€ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ, ๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ฆ‰, open addressing์˜ ์ฃผ์š” ๋ชฉ์ ์€ ์ €์žฅํ•  ์—”ํŠธ๋ฆฌ๋ฅผ ์œ„ํ•œ ๋‹ค์Œ์˜ slot์„ ์ฐพ๋Š” ๊ฒƒ์ธ๋ฐ ์˜ˆ์‹œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณด๋ฉด, John Smith์™€ Sandara Dee 152๋ฒˆ์œผ๋กœ ๋™์ผํ•œ ๊ฐ’์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ํ•ด์‹œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚œ ๊ฒฝ์šฐ์ธ๋ฐ, Sandara Dee๋Š” 152๋ฒˆ์— ๋ฎ์–ด ์”Œ์›Œ์ง€์ง€ ์•Š๊ณ , ๋‹ค์Œ ๋นˆ ๋ฒ„ํ‚ท์ธ 153๋ฒˆ์— ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ key์ธ Ted Baker๋Š” 153์ด๋ผ๋Š” ๊ฐ’์ด ๋‚˜์™”์ง€๋งŒ ์ด๋ฏธ Sandra Dee๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ด์„œ ๋‹ค์Œ ๋นˆ ๋ฒ„ํ‚ท์ธ 154๋ฒˆ์— ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋Š” ๋ฌด์กฐ๊ฑด ํ•œ ์นธ์”ฉ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ์˜ˆ๋กœ ๋“ค์—ˆ์ง€๋งŒ ๋น„์–ด์žˆ๋Š” ์นธ์„ ์ฐพ์•„๊ฐ€๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • Linear probing(์„ ํ˜• ํƒ์‚ฌ๋ฒ•)
  • Quadratic probing(์ œ๊ณฑ ํƒ์‚ฌ๋ฒ•)
  • Dobule hashing(์ด์ค‘ ํ•ด์‹ฑ)

Linear Probing(์„ ํ˜• ํƒ์‚ฌ๋ฒ•)

๋ง ๊ทธ๋Œ€๋กœ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ ํ˜•์œผ๋กœ ์ˆœ์ฐจ์  ๊ฒ€์ƒ‰์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•ด์‹œ ํ•จ์ˆ˜๋กœ ๋‚˜์˜จ ํ•ด์‹œ ๊ฐ’(index)์— ์ด๋ฏธ ๋‹ค๋ฅธ ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ํ•ด์‹œ๊ฐ’์—์„œ ๊ณ ์ •๋œ ํญ๋งŒํผ ์˜ฎ๊ฒจ ๋‹ค์Œ ๋นˆ์นธ์„ ์ฐพ์•„๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์œ„ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด 52๋ผ๋Š” ๊ฐ’์„ ํ•ด์‹ฑํ•˜์—ฌ ํ•ด์‹œ๊ฐ’ 2์— ์ ‘๊ทผํ–ˆ์ง€๋งŒ ์ด๋ฏธ ์กด์žฌํ•˜์—ฌ ์ถฉ๋Œ์ด ๋‚ฌ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž„์˜์˜ ๊ณ ์ •๋œ ํฌ๊ธฐ์ธ ํ•œ ์นธ์”ฉ ์˜ฎ๊ฒจ์„œ ๋นˆ์นธ์„ ์ฐพ์•„๊ฐ€๋ฉฐ ์ตœ์ข…์ ์œผ๋กœ 6์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋Š” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ํŠน์ • ํ•ด์‹œ ๊ฐ’์˜ ์ฃผ๋ณ€์ด ๋ชจ๋‘ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ์ผ์ฐจ ๊ตฐ์ง‘ํ™”(primary clustering) ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์ด๋ฏธ์ง€๋งŒ ํ•ด๋„ 2~6๊นŒ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ์—ฌ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ชจ๋“  ํ‚ค๊ฐ€ 2๋ผ๋Š” ๊ฐ’์œผ๋กœ ํ•ด์‹œ๊ฐ’์ด ๋‚˜์˜ฌ ๊ฒฝ์šฐ ๊ตฐ์ง‘ํ™” ๋œ ๊ฐ’๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•  ํ…๋ฐ ํ•ด์‹œ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Linear Probing(์„ ํ˜• ํƒ์‚ฌ๋ฒ•)์€ ํ•ด์‹œ ์ถฉ๋Œ์ด ํ•ด์‹œ ๊ฐ’ ์ „์ฒด์— ๊ท ๋“ฑํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ๋•Œ ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

Quadratic probing(์ œ๊ณฑ ํƒ์‚ฌ๋ฒ•)

์ œ๊ณฑ ํƒ์‚ฌ๋ฒ•์€ ์œ„์˜ ์„ ํ˜• ํƒ์‚ฌ๋ฒ•๊ณผ ๋™์ผํ•œ๋ฐ, ํƒ์‚ฌ ํญ์ด ๊ณ ์ •๋œ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์ œ๊ณฑ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ์ ์— ์žˆ์–ด ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋นˆ ๋ฒ„ํ‚ท์˜ slot์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ณ ์ •๋œ ๊ฐ’์ด ์•„๋‹Œ 2^1, 2^2, 2^3.... ์˜ ๋ฐฉ์‹์œผ๋กœ ์ด๋™ํ•ด์„œ ๋นˆ์นธ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ œ๊ณฑ ํƒ์‚ฌ๋ฒ•์„ ์ด์šฉํ•œ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์˜ ๋ฐ€์ง‘๋„๊ฐ€ ์„ ํ˜• ํƒ์‚ฌ๋ฒ•๋ณด๋‹ค ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํ•ด์‹œ๊ฐ’๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฐ›์•„์„œ ์—ฐ์‡„์ ์œผ๋กœ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„ ํ˜• ํƒ์‚ฌ๋ฒ•๋ณด๋‹ค๋Š” ์บ์‹œ์˜ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ ธ์„œ ์†๋„์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ฒŒ ๋˜๋ฉด์„œ L1, L2 ์บ์‹œ ์ ์ค‘๋ฅ (hit ratio)์ด ๋‚ฎ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Dobule hashing(์ด์ค‘ ํ•ด์‹ฑ)

์ด์ค‘ํ•ด์‹ฑ๋ฒ• ๋˜๋Š” ์žฌํ•ด์‹ฑ์€ ํ•ญ๋ชฉ์„ ์ €์žฅํ•  ๋‹ค์Œ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•  ๋•Œ, ์›๋ž˜ ํ•ด์‹œ ํ•จ์ˆ˜์™€ ๋‹ค๋ฅธ ๋ณ„๊ฐœ์˜ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ํ•ญ๋ชฉ๋“ค์„ ์ด์ „ ๋ฐฉ๋ฒ•๋“ค๋ณด๋‹ค ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ๋ณด๋‹ค ๊ท ์ผํ•˜๊ฒŒ ๋ถ„ํฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜๋Š” ์ฒ˜์Œ์˜ key๋ฅผ ์ €์žฅํ•  index๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๊ณ , ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ์ €์žฅํ•  index๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ, ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ์ €์žฅํ•  index๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ•ด์‹œ ํ•จ์ˆ˜์™€ ๋‹ฌ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Dobule hashing(์ด์ค‘ ํ•ด์‹ฑ)

์ด์ค‘ ํ•ด์‹ฑ๋ฒ•์€ ์ถฉ๋Œ์˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์€ ๊ฐ€์žฅ ์ ์œผ๋‚˜, ์บ์‹œ์˜ ์„ฑ๋Šฅ์€ Linear Probing, Quadratic Probing๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์ข‹์ง€ ์•Š์œผ๋ฉฐ, ์ถ”๊ฐ€์ ์ธ ํ•ด์‹œ ์—ฐ์‚ฐ์ด ๋“ค์–ด๊ฐ€๊ธฐ์— ๊ฐ€์žฅ ๋งŽ์€ ์—ฐ์‚ฐ๋Ÿ‰์„ ์š”๊ตฌํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•(open-address) ์ •๋ฆฌ

ํƒ์‚ฌ ๋ฐฉ์‹์— ๋”ฐ๋ผ open-addressing ํ•ด์‹œ์˜ ์„ฑ๋Šฅ์ด ๋‹ฌ๋ผ์ง€์ง€๋งŒ, ๊ฐ€์žฅ ์น˜๋ช…์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์š”์†Œ๋Š” ๋ฐ”๋กœ ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์˜ ์ ์žฌ์œจ์ธ load factor(์ „์ฒด ์Šฌ๋กฏ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ์Šฌ๋กฏ ๋น„์œจ)์ž…๋‹ˆ๋‹ค. Load Factor๊ฐ€ 100%๋กœ ์ฆ๊ฐ€ํ• ์ˆ˜๋ก ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํƒ์‚ฌ ํšŸ์ˆ˜๋Š” ๋น„์•ฝ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ํ…Œ์ด๋ธ”์ด ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜๋ฉด probing์ด ์‹คํŒจํ•˜์—ฌ ๋๋‚˜๋ฒ„๋ฆฌ๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ์•„๋ž˜ ํ‘œ๋Š” Load Factor์— ๋”ฐ๋ฅธ ํ‰๊ท  ์„ฑ๊ณต ํƒ์ƒ‰์ˆ˜์™€ ์‹คํŒจ์ˆ˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.(http://egloos.zum.com/sweeper/v/925740)

open - addressing ์„ฑ๋Šฅ ์ •๋ฆฌ

์œ„ ํ‘œ๋ฅผ ์ž˜ ๋ณด๋ฉด ์•„๋ฌด๋ฆฌ ์ข‹์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์“ฐ๋”๋ผ๋„ ์ผ๋ฐ˜์ ์œผ๋กœ Load Factor๋Š” 80% ์ด๋‚ด๊นŒ์ง€๋งŒ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ Linear probing ๋ฐฉ์‹์ด Load Factor๊ฐ€ ๋†’์„์ˆ˜๋ก ๊ฐ€์žฅ ๊ธ‰๊ฒฉํ•˜๊ฒŒ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Load Factor๊ฐ€ ์ž„๊ณ„์ ์„ ๋„˜์–ด ํฐ ๊ฒฝ์šฐ์˜ ์„ฑ๋Šฅ์€ double hashing > quadratic > linear์˜ ์ˆœ์„œ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. ๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ• (separate chaining)

๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ•์€ ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•(open-addressing)๊ณผ๋Š” ๋‹ฌ๋ฆฌ ํ•œ ๋ฒ„ํ‚ท(์Šฌ๋กฏ) ๋‹น ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์—”ํŠธ๋ฆฌ์˜ ์ˆ˜์— ์ œํ•œ์„ ๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฒ„ํ‚ท์—๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(linked list)๋‚˜ ํŠธ๋ฆฌ(tree)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.(์กฐ๊ธˆ ๋’ค์— ์ƒ์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ฒ ์ง€๋งŒ ์ž๋ฐ”์—์„œ๋Š” ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)

๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ• (separate chaining)

์œ„ ์ด๋ฏธ์ง€๋ฅผ ์ž˜ ๋ณด๋ฉด ๋™์ผํ•œ ๊ฐ’๋“ค์€ ๋ฆฌ์ŠคํŠธ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์ €์žฅ์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด์‹œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋”๋ผ๋„ ๋ฆฌ์ŠคํŠธ๋กœ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— index๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜์˜ ์ œ์•ฝ์ด ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ open addressing ๋ฐฉ๋ฒ•๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋ฉฐ, ํ…Œ์ด๋ธ”์˜ ์ ์žฌ์œจ(Load Factor)์— ๋”ฐ๋ผ ์„ ํ˜•์ ์œผ๋กœ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ ์žฌ์œจ์ด ์ž‘์„ ๊ฒฝ์šฐ ์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์€ ๊ฒฝ์šฐ์—๋Š” open addressing ๋ฐฉ์‹์ด ํ‰๊ท ์ ์œผ๋กœ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

์œ„์˜ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ด์™ธ์—๋„ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ ์žฌ์œจ์ด ๋†’์•„์ง„ ๊ฒฝ์šฐ์—๋Š” ํฌ๊ธฐ๊ฐ€ ๋” ํฐ ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์„œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ฒจ์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์„ ๊ฒฝ์šฐ์—” ์žฌํ•ด์‹ฑ์„ ํ†ตํ•ด์„œ ๋„ˆ๋ฌด ๊ธธ์–ด์ง„ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ๋‹ค์‹œ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์–ธ์–ด๋ณ„ ํ•ด์‹œ ์ถฉ๋Œ ์™„ํ™” ๋ฐฉ๋ฒ•

์–ธ์–ด ๋ฐฉ์‹
C++ ๊ฐœ๋ณ„ ์ฒด์ด๋‹
Java ๊ฐœ๋ณ„ ์ฒด์ด๋‹
Go ๊ฐœ๋ณ„ ์ฒด์ด๋‹
Ruby ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ
Python ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ

 

Java์—์„œ HashMap ๋™์ž‘ ๋ฐฉ๋ฒ•

์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ๋„ค์ด๋ฒ„ d2์˜ ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ž์„ธํžˆ ๋ณด๊ณ  ์‹ถ์€ ํ•ด๋‹น ๋งํฌ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ž๋ฐ”์—๋Š” HashMap๊ณผ HashTable์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค Java์—์„œ ์ œ๊ณตํ•˜๋Š” API๋กœ์จ ๋‘˜ ๋‹ค Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ HashMap์€ ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜(Additional Hash Function)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” HashTable์— ๋น„ํ•˜์—ฌ ํ•ด์‹œ ์ถฉ๋Œ(hash collision)์ด ๋œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ์ƒ๋Œ€์ ์œผ๋กœ ์„ฑ๋Šฅ์ƒ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ HashTable์€ ์„ฑ๋Šฅ์˜ ๊ฐœ์„ ์ด ๋” ์ด์ƒ ์ผ์–ด๋‚˜์ง€ ์•Š์ง€๋งŒ, HashMap์€ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ์ด ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Java HashMap์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ Separate Channing์ž…๋‹ˆ๋‹ค. Open Addressing์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์ฒ˜๋ฆฌ๊ฐ€ ํšจ์œจ์ ์ด๊ธฐ ์–ด๋ ค์šด๋ฐ, HashMap์—์„œ remove() ๋ฉ”์„œ๋“œ๋Š” ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ HashMap์— ์ €์žฅ๋œ ํ‚ค-๊ฐ’ ์Œ ๊ฐœ์ˆ˜๊ฐ€ ์ผ์ • ๊ฐœ์ˆ˜ ์ด์ƒ์œผ๋กœ ๋งŽ์•„์ง€๋ฉด, ์ผ๋ฐ˜์ ์œผ๋กœ Open Addressing์€ Separate Chaining๋ณด๋‹ค ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Open Addressing์˜ ๊ฒฝ์šฐ ํ•ด์‹œ ๋ฒ„ํ‚ท์„ ์ฑ„์šด ๋ฐ€๋„๊ฐ€ ๋†’์•„์งˆ์ˆ˜๋ก Worst Case ๋ฐœ์ƒ ๋นˆ๋„๊ฐ€ ๋” ๋†’์•„์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.(์ ์žฌ์œจ)

๋ฐ˜๋ฉด Separate Chaining ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ํ•ด์‹œ ์ถฉ๋Œ์ด ์ž˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก '์กฐ์ •'ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด Worst Case์— ๊ฐ€๊นŒ์šด ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Java 7๊ณผ Java 8์˜ HashMap์—์„œ์˜ Separate Chaining

Java 2๋ถ€ํ„ฐ Java 7๊นŒ์ง€์˜ HashMap์—์„œ Separate Chaining ๊ตฌํ˜„ ์ฝ”๋“œ๋Š” ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด์ง€๋งŒ, ๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋Š” ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Java 8๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”๋ฐ ์ด์ „๊นŒ์ง€๋Š” Separate Chaining์—์„œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ณ ์ •์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ Java 8 ์ดํ›„๋ถ€ํ„ฐ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” ์กฐํšŒ์— ๋Œ€ํ•œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N/M)์„ ๋ณด์—ฌ์คฌ์ง€๋งŒ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด O(log N/M)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ผ์ • ์ด์ƒ์ผ ๋•Œ์—๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ๋Œ€์‹  ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์ƒ ์ด์ ์„ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ณ ์ •์ ์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋” ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๊ธฐ์ค€์€ ํ•˜๋‚˜์˜ ํ•ด์‹œ ๋ฒ„ํ‚ท์— ํ• ๋‹น๋œ ํ‚ค-๊ฐ’ ์Œ์˜ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค.

static final int TREEIFY_THRESHOLD = 8;

static final int UNTREEIFY_THRESHOLD = 6;

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, Java 8 HashMap์—์„œ๋Š” ์ƒ์ˆ˜ ํ˜•ํƒœ๋กœ ๊ธฐ์ค€์„ ์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ํ•˜๋‚˜์˜ ํ•ด์‹œ ๋ฒ„ํ‚ท์— 8๊ฐœ์˜ ํ‚ค-๊ฐ’ ์Œ์ด ๋ชจ์ด๋ฉด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ํŠธ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ํ•ด๋‹น ๋ฒ„ํ‚ท์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜์—ฌ ๊ฐœ์ˆ˜๊ฐ€ 6๊ฐœ์— ์ด๋ฅด๋ฉด ๋‹ค์‹œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ, ํŠธ๋ฆฌ๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ๊ณ , ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ ํŠธ๋ฆฌ์™€ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ Worst Case ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ์ฐจ์ด ๋น„๊ต๋Š” ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 8๊ณผ 6์œผ๋กœ 2 ์ด์ƒ์˜ ์ฐจ์ด๋ฅผ ๋‘” ๊ฒƒ์€, ๋งŒ์•ฝ ์ฐจ์ด๊ฐ€ 1์ด๋ผ๋ฉด ์–ด๋–ค ํ•œ ํ‚ค-๊ฐ’ ์Œ์ด ๋ฐ˜๋ณต๋˜์–ด ์‚ฝ์ž…/์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํŠธ๋ฆฌ์™€ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ผ์ด ๋ฐ˜๋ณต๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŠธ๋ฆฌ๋Š” Red-Black Tree์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Java HashMap์—์„œ๋Š” ํ•ด์‹œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ Separate Chaining๊ณผ ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, Java 8์—์„œ๋Š” Separate Chaining์—์„œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ๋Œ€์‹  ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

์ฐธ๊ณ 

  1. https://steemit.com/kr/@yahweh87/2
  2. https://ai-rtistic.com/2022/01/29/data-structure-hash/
  3. http://egloos.zum.com/sweeper/v/925740
  4. https://d2.naver.com/helloworld/831311

๋Œ“๊ธ€