๊ด€๋ฆฌ ๋ฉ”๋‰ด

ejyoo's ๊ฐœ๋ฐœ ๋…ธํŠธ

ํ•ด์‹œ(Hash) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณธ๋ฌธ

BackEnd/Java

ํ•ด์‹œ(Hash) ์•Œ๊ณ ๋ฆฌ์ฆ˜

ejyoovV 2021. 3. 5. 19:52

๐Ÿ“์˜ค๋Š˜ ์ˆ˜์—… ๋„์ค‘ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ๋“ค์—ˆ๋Š”๋ฐ.

์ •๋ณด๋ฅผ ์กฐ๊ธˆ ๋” ์ฐพ์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋ณธ ๊ธ€์€ ํƒ€ ๋ธ”๋กœ๊ทธ์—์„œ ๋ฐœ์ทŒํ•œ ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์œผ๋ฉฐ, ์ž‘์„ฑ์ž๊ฐ€ ์ˆ˜์—…์„ ๋“ค์€ ๋‚ด์šฉ๋„ ์กฐ๊ธˆ ์ถ”๊ฐ€๊ฐ€ ๋˜์–ด์žˆ๋‹ค.

๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ๊ธฐ์ค€ ์ƒ์œ„ 5๊ฐœ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๊ณ .

๊ทธ์ค‘ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋ธ”๋กœ๊ทธ๋Š” ์•„๋ž˜ ๋ธ”๋กœ๊ทธ์ด๋‹ค.(๋‘๊ณ ๋‘๊ณ  ๋ณผ ์˜ˆ์ •์ด๋‹ค.)

hyeonstorage.tistory.com/265?category=578561

 

[์ž๋ฃŒ๊ตฌ์กฐ] Java ํ•ด์‰ฌ(Hash) ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๊ตฌ์กฐ (๋ถ„๋ฆฌ์—ฐ๊ฒฐ๋ฒ•)

Java ํ•ด์‰ฌ(Hash) ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๊ตฌ์กฐ 1. ํ•ด์‰ฌ(Hash)์˜ ๊ฐœ์š” ์•ž์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…, ๊ฒ€์ƒ‰, ์‚ญ์ œํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ช‡๊ฐ€์ง€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค. ๋ฆฌ์ŠคํŠธ, ์Šคํƒ, ํ ๋“ฑ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์—ฐ

hyeonstorage.tistory.com

๐Ÿ’ก ํ•ด์‹œ์˜ ๋“ฑ์žฅ๋ฐฐ๊ฒฝ

ํ•ด์‹œ์˜ ๋“ฑ์žฅ๋ฐฐ๊ฒฝ์€ ๋ฐฐ์—ด๊ณผ ๋ฆฌ์ŠคํŠธ๋กœ ์ธํ•จ์ด์˜€๋‹ค.

๋ฐฐ์—ด์€ ๋‚ด๋ถ€ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž๋ฃŒ์˜ ๊ฒ€์ƒ‰์ด ํ•œ๋ฒˆ์— ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋ณด์ด๋Š” ๋ฐ˜๋ฉด

๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…, ์‚ญ์ œ ์‹œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ€๋ฆฌ๊ฑฐ๋‚˜ ๋นˆ์ž๋ฆฌ๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ด๋™ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

๋ฐ˜๋ฉด์— ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์‚ฝ์ž…, ์‚ญ์ œ ์‹œ ์ธ๊ทผ ๋…ธ๋“œ๋“ค์˜ ์ฐธ์กฐ ๊ฐ’๋งŒ ์ˆ˜์ •ํ•ด ์คŒ์œผ๋กœ์จ ๋น ๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ–ˆ์—ˆ๋‹ค. 

๋‹จ ์ฒ˜์Œ ๋…ธ๋“œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ ์ด์™ธ์˜ ์œ„์น˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…, ์‚ญ์ œํ•  ๊ฒฝ์šฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๊ฒฝ์šฐ๋„ค๋Š” ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•˜์—ฌ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœํšŒ ๊ฒ€์ƒ‰์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ํšจ์œจ์ด ๋–จ์–ด์งˆ ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๊ตฌ์กฐ๋‹ค.

 

์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์ œ์‹œ๋œ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ํ•ด์‰ฌ(Hash)์ด๋‹ค.

 

 

๐Ÿ’ก ํ•ด์‹œ(Hash)๋ž€ ?

ํ•ด์‹œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ ์‹œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ€์–ด๋‚ด๊ฑฐ๋‚˜ ์ฑ„์šฐ๋Š” ์ž‘์—…์ด ํ•„์š” ์—†๋„๋ก ํŠน๋ณ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ด€๋œ ๊ณ ์œ ํ•œ ์ˆซ์ž๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ ๋’ค ์ด๋ฅผ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

ํŠน์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ๊ทธ ๋ฐ์ดํ„ฐ๋งŒ์˜ ๊ณ ์œ ํ•œ ์œ„์น˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฝ์ž… ์‹œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์˜ ์‚ฌ์ด์— ๋ผ์–ด๋“ค๊ฑฐ๋‚˜ ์‚ญ์ œ ์‹œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์šธ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ ์‹œ ๋ฐ์ดํ„ฐ์˜ ์ด๋™์ด ์—†๋„๋ก ๋งŒ๋“ค์–ด์ง„ ๊ตฌ์กฐ์ด๋‹ค.

 

ํ•ด์‹œ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฐ์—ด์„ Hash Table์ด๋ผ๊ณ  ํ•˜๋ฉฐ ๊ทธ ํฌ๊ธฐ์— ๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋งŽ์ด ๋‚  ์ˆ˜ ์žˆ๋‹ค. 

 

- ํ•ด์‹œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

- ํ•ด์‹œ๋Š” ๊ฒ€์ƒ‰๊ณผ ์ €์žฅ์—์„œ ์•„์ฃผ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค.

- ํ•ด์‹œ์˜ ํ•ต์‹ฌ์€ KEY, VALUE๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

- KEY์™€ VALUE ๊ฐ€ ํ•œ ์Œ์œผ๋กœ ์กด์žฌํ•œ๋‹ค. = Hash Table์ด๋ผ๊ณ  ํ•จ.

- ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค์™€ ๋‹ค๋ฅด๊ฒŒ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ „ ์˜์—ญ์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„ํฌ๋˜์–ด ์ €์žฅ๋œ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. (๐Ÿคœ ๋ฐฐ์—ด๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. )

- ์—ฐ๊ด€ ๋ฐฐ์—ด ๊ตฌ์กฐ : Key์™€ Value๊ฐ€ 1:1๋กœ ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ. Key๋ฅผ ์ด์šฉํ•ด Value๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

๋ธ”๋กœ๊ทธ์—์„œ ๋”ฐ์˜ด. https://velog.io/@adam2/~

๐Ÿ’ก ํ•ด์‹œ ๋ฉ”์†Œ๋“œ

ํ•ด์‹œ๋Š” HashTable์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

์ด๋•Œ ํŠน๋ณ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ๊ณ ์œ ํ•œ ์ˆซ์ž๊ฐ’์„ ๋งŒ๋“ค์–ด ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ 

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ Hash Method ๋ผ๊ณ  ํ•˜๋ฉฐ

Hash Method์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ ๊ณ ์œ ์˜ ์ˆซ์ž ๊ฐ’์„ hash Code๋ผ๊ณ  ํ•œ๋‹ค.

Java์—์„œ๋Š” Object ํด๋ž˜์Šค์˜ hashCode() ๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฐ์ฒด์˜ Hash Code๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก ํ•ด์‹œ ๋ฉ”์„œ๋“œ Java Object ํด๋ž˜์Šค ์ •๋ฆฌ

Hash Method๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”  ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ์ดํ„ฐ์˜ ๊ณ ์œ ํ•œ hashCode๋ฅผ ๊ตฌํ•œ ๋’ค hashCode๋ฅผ ํ…Œ์ด๋ธ” ํฌ๊ธฐ๋กœ ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์„ ํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ˆ๋ฅผ๋“ค์–ด "a", "b", "c"์˜ hashCode๊ฐ€ ๊ฐ๊ฐ 97,98,99๋ผ๊ณ  ํ•˜๊ณ  Hash Table์˜ ํฌ๊ธฐ๊ฐ€ 10์ด๋ผ๊ณ  ํ–ˆ์„ ๋•Œ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋  ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

97 % 10 = 7

98 % 10 = 8

99 % 10 = 9

 

์ฆ‰, Hash Table์˜ ์ธ๋ฑ์Šค 7์—๋Š” "a"๋ฅผ ์ €์žฅํ•˜๊ณ  8์—๋Š” "b", 9์—๋Š” "C"๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ดํ›„์— "a"๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ์—๋Š” "a"์˜ hashCode๋ฅผ ๊ฐ€์ง€๊ณ  ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์„ ํ•œ ๊ฒฐ๊ณผ์ธ 7๋ฒˆ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ”๋กœ ์ฐธ์กฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ผ ์ˆ˜ ์ž‡๋‹ค.

 

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž

4,8,12,16,20,24,28,32 ๋ผ๋Š” hashCode๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด Hash Table์˜ ํฌ๊ธฐ๋ฅผ 8๋กœ ์ง€์ •ํ–ˆ๋‹ค๋ฉด ํ…Œ์ด๋ธ”์— ์ €์žฅ๋  ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

4 % 8 = 4

8 % 8 = 0

12 % 8 = 4

16 % 8 = 0

20 % 8 = 4

24 % 8 = 0

28 % 8 = 4

32 % 8 = 0

๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ธ๋ฑ์Šค๊ฐ€ 0๋ฒˆ๊ณผ 4๋ฒˆ์— ์ง‘์ค‘๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์ž‡๋‹ค.

์ด์ฒ˜๋Ÿผ hashCode๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์„ ํ•œ ๊ฒฐ๊ณผ๋Š” ๊ฐ™์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Hash Table์˜ ๋™์ผํ•œ ์ธ๋ฑ์Šค์— ์ €์žฅ์„ ์‹œ๋„ํ•˜๋ ค ํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ €์žฅํ•˜๋ ค๋Š” ์œ„์น˜์— ์ด๋ฏธ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด์„œ ์ €์žฅ์„ ํ•  ์ˆ˜ ์—†๋Š” ํ˜„์ƒ์„ ์ถฉ๋Œ(collision)์ด๋ผ๊ณ  ํ•˜๋ฉฐ ์ด๋Ÿฐ ์ถฉ๋Œ์„ ์ตœ์†Œํ™” ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์˜ ๊ฐ’์ด ์ตœ๋Œ€ํ•œ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋ฅผ ์†Œ์ˆ˜(prime number)๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

 

๋‹ค์Œ์€ 8๋ณด๋‹ค ํฐ ์†Œ์ˆ˜์ธ 11์„ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋กœ ์ง€์ •ํ–ˆ์„ ๋•Œ ๊ฐ ๋ฐ์ดํ„ฐ๋“ค์ด ํ…Œ์ด๋ธ”์— ์ €์žฅ๋  ์ธ๋ฑ์Šค ๊ฐ’์ด๋‹ค.

4 % 11 = 4

8 % 11 = 8

12 % 11 = 1

16 % 11 = 5

20 % 11 = 9

24 % 11 = 2

28 % 11 = 6

32 % 11 = 10

์ด์ œ๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์ง€์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ Hash Table์˜ ํฌ๊ธฐ๋ฅผ ์†Œ์ˆ˜๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ถฉ๋Œ์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์ด์ง€ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ 10์„ ์ €์žฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด 10 % 11 = 10์ด ๋˜๋ฏ€๋กœ ์ด๋ฏธ 10๋ฒˆ์˜ ์ธ๋ฑ์Šค์—๋Š” 32๊ฐ€ ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋ฉฐ ์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐœ๋ฐฉ์ฃผ์†Œ๋ฒ•๊ณผ ๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ• ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

 

 

๐Ÿ’ก KEY?

- Hash ์—์„œ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ธ๋ฑ์Šค์ด๋‹ค.

- Key๋Š” ์ ˆ๋Œ€๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.(๊ณ ์œ ํ•œ ๊ฐ’)

- ํ•ด์‹œ ํ•จ์ˆ˜์˜ input์ด ๋จ.

- ๋งŒ์•ฝ Key๊ฐ€ ์ค‘๋ณต์ด๋ผ๋ฉด ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๊ฐ’๋งŒ ๋‚จ๋Š”๋‹ค.[ํ•ด์‹œ ์ถฉ๋Œ(Hash Collision)]

- ํ‚ค ๊ฐ’ ๊ทธ๋Œ€๋กœ ์ €์žฅ์†Œ์— ์ €์žฅํ•  ๊ฒฝ์šฐ ๋‹ค์–‘ํ•œ ํ‚ค์˜ ๊ธธ์ด๋งŒํผ ํฌ๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•ด๋‘์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ •ํ•œ ๊ธธ์ด์˜ ํ•ด์‹œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

 

๐Ÿ’ก VALUE?

- Key๋กœ ๋งคํ•‘ ์‹œ ๋‚˜์˜ค๋Š” ๊ฐ’์ด๋‹ค.

- ์ €์žฅ์†Œ(bucket, slot)์— ์ตœ์ข…์ ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๊ฐ’์œผ๋กœ hash์™€ ๋งค์นญ๋˜์–ด ์ €์žฅ.

 

๐Ÿ’ก HashTable

- ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋งคํ•‘ํ•˜๊ณ  ์ด ํ•ด์‹œ๊ฐ’์„ ์ฃผ์†Œ๋กœ ์‚ผ์•„ ๋ฐ์ดํ„ฐ(value)๋ฅผ key์™€ ํ•จ๊ป˜ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

- ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ์„ ๋ฒ„ํ‚ท ๋˜๋Š” ์Šฌ๋กฏ์ด๋ผ๊ณ  ํ•จ.

- ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์€ ์‚ฝ์ž…, ์‚ญ์ œ, ํƒ์ƒ‰์ด๋‹ค.

 

๐Ÿ“ key๋Š” hash function์„ ํ†ตํ•ด hash๋กœ ๋ณ€๊ฒฝ์ด ๋˜๋ฉฐ hash๋Š” value์™€ ๋งค์นญ๋˜์–ด ์ €์žฅ์†Œ์— ์ €์žฅ์ด ๋œ๋‹ค.

๐Ÿ“ ์žฅ์  : ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ key-value ๊ฐ€ 1:1๋กœ ๋งคํ•‘๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฒ€์ƒ‰ ๊ณผ์ •์—์„œ ๋ชจ๋‘ ํ‰๊ท ์ ์œผ๋กœ 0(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๐Ÿ“ ๋‹จ์  

  1) ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒ

  2) ์ˆœ์„œ/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์— ์–ด์šธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. => ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด key๋งŒ์„ ๊ฐ€์ง€๊ณ  ์‚ฝ์ž… ๊ฒ€์ƒ‰ ์‚ญ์ œํ•˜๊ธฐ ๋•Œ๋ฌธ

  3) ๊ณต๊ฐ„ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง => ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ์ €์žฅ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ. ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ์ฑ„์›Œ์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒ

  4) hash function์˜ ์˜์กด๋„๊ฐ€ ๋†’๋‹ค => ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ 0(1) ์ด์ง€๋งŒ ํ•ด์‹œํ•จ์ˆ˜๊ฐ€ ๋งค์šฐ ๋ณต์žกํ•˜๋‹ค๋ฉด ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์—ฐ์‚ฐ ์†๋„๋Š” ์ฆ๊ฐ€.

 

ํ‚ค์˜ ์ „์ฒด ๊ฐœ์ˆ˜์™€ ๋™์ผํ•œ ํฌ๊ธฐ์˜ ๋ฒ„ํ‚ท์„ ๊ฐ€์ง„ ํ•ด์‹œํ…Œ์ด๋ธ”์„ Direct-address table ์ด๋ผ๊ณ  ํ•œ๋‹ค.

Direct-address table์˜ ์žฅ์ ์€ ํ‚ค์˜ ๊ฐœ์ˆ˜์™€ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ํ•ด์‹œ ์ถฉ๋Œ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค๊ฐ€ ์–ผ๋งˆ ์—†๋Š” ๊ฒฝ์šฐ, ์ฆ‰ ์ „์ฒดํ‚ค 100๊ฐœ ์ค‘์— ์‹ค์ œ๋กœ๋Š” 10๊ฐœ ํ‚ค๋งŒ ์‚ฌ์šฉํ•œ๋‹ค ํ–ˆ์„ ๋•Œ, 100๊ฐœ ํฌ๊ธฐ์˜ ๋ฐ์ด๋ธ”์„ ์œ ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋ณดํ†ต์˜ ๊ฒฝ์šฐ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค ๊ฐœ์ˆ˜๋ณด๋‹ค ์ ์€ ํ•ด์‹œํ…Œ์ด๋ธ”์„์šด์šฉํ•˜๋Š”๋ฐ, ์ด๋Ÿฐ ์ด์œ ๋กœ ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ณ  ํ•ด์‹œ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค.

 

 

๐Ÿ’ก Hash์ฝ”๋“œ?

- Hash๋กœ ๊ฐ’ ์ƒ์„ฑ ์‹œ, ๊ณ ์œ ์˜ ์ฃผ์†Œ๊ฐ’์ด ์ƒ์„ฑ๋จ ๐Ÿคœ ์ด๊ฒƒ์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ์„ ํ•ด์‹œ์ฝ”๋“œ๋ผ๊ณ  ๋ถ€๋ฆ„.

- ์ž๋ฐ”์—์„œ ํ•ด์‹œ์ฝ”๋“œ๋Š” Heap ์˜์—ญ์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ ๊ฐ’์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก Hash Function(ํ•ด์‹œํ•จ์ˆ˜)

- Key๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด์˜ hash๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ด ๊ณผ์ •์„ hashing์ด๋ผ๊ณ  ํ•œ๋‹ค.

- ์„œ๋กœ ๊ฐ™์€ key๊ฐ€ ๊ฐ™์€ hash๊ฐ’์„ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ํ•ด์‹œ ์ถฉ๋Œ์ด๋ผ๊ณ  ํ•œ๋‹ค. 

- ํ•ด์‹œ ์ถฉ๋Œ์ด ํ•ด์‹œ๊ฐ’ ์ „์ฒด์— ๊ฑธ์ณ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‹ค.

  ex) ๋ชจ๋“  ํ‚ค๊ฐ€ 02๋ผ๋Š” ๋™์ผํ•œ ํ•ด์‹œ ๊ฐ’์œผ๋กœ ๋งคํ•‘์ด ๋  ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์•ก์„ธ์Šค ํ•  ๋•Œ ๋น„ํšจ์œจ์„ฑ์ด ์ปค์ง€๊ณ  ๋ณด์•ˆ์ด ์ทจ์•ฝํ•ด์ ธ ๊ตณ์ด ํ•ด์‹œ๋ฅผ ๋„์ž…ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ด์œ ๊ฐ€ ์—†์–ด์ง„๋‹ค.(์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค์ธ๋ฐ๋„ ๋™์ผํ•œ ํ•ด์‹œ๊ฐ’)

- ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ Keys๊ฐ€ ๋“ค์–ด์™€์„œ hashfunction์„ ๊ฑฐ์ณ hashes(HashValue)๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

- ํŠน์ • ๊ฐ’์— ์น˜์šฐ์น˜์ง€ ์•Š๊ณ  ํ•ด์‹œ๊ฐ’์„ ๊ณ ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํ•ด์‹œํ•จ์ˆ˜๊ฐ€ ์ข‹์€ ํ•ด์‹œํ•จ์ˆ˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์œ„ํ‚ค๋ฐฑ๊ณผ - ํ•ด์‹œ ๊ทธ๋ฆผ

division method

์ˆซ์ž๋กœ ๋œ ํ‚ค๋ฅผ ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐm์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

๊ฐ„๋‹จํ•˜๋ฉด์„œ ๋น ๋ฅธ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ์žฅ์ ์ด๋‹ค.

- h(k) = k mod m

- ์˜ˆ : m = 20 and k = 91 ==> h(k) = 11

- ์žฅ์  : ํ•œ๋ฒˆ์˜ mod ์—ฐ์‚ฐ์œผ๋กœ ๊ณ„์‚ฐ, ๋น ๋ฆ„

- ๋‹จ์  : ์–ด๋–ค m ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ’์ด ํ‚ค๊ฐ’์˜ํŠน์ • ๋ถ€๋ถ„์— ์˜ํ•ด์„œ ๊ฒฐ์ •๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€์žˆ์Œ

           2^p์ด๋ฉด ํ‚ค์˜ ํ•˜์œ„ p๋น„ํŠธ๊ฐ€ ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ๋จ.

 

multiplication method

- 0์—์„œ 1์‚ฌ์ด์˜ ์ƒ์ˆ˜A๋ฅผ ์„ ํƒ : 0 < A < 1

- kA์˜ ์†Œ์ˆ˜๋ถ€๋ถ„๋งŒ์„ ํƒํ•จ.

- ์†Œ์ˆ˜๋ถ€๋ถ„์— m์„ ๊ณฑํ•œ ํ›„ ์†Œ์ˆ˜์  ์•„๋ž˜๋ฅผ ๋ฒ„๋ฆฐ๋‹ค.

- ์˜ˆ : m=8, word size = w = 5, k = 21

       A = 13/32 ๋ฅผ ์„ ํƒ

      kA = 21*13/32 = 273/32 = 8 +17/32

      m (kA mod 1) = 8 * 17/32 = 17/4 = 4.xxx

      h(21) = 4

๊ผญ ์œ„์˜ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ด๋‹ค.

 

์ˆซ์ž ํ‚ค k,A๋Š” 0๊ณผ 1 ์‚ฌ์ด์˜ ์‹ค์ˆ˜์ผ ๋•Œ,

h(k) = (kA mod 1)*m

2์ง„์ˆ˜์—ฐ์‚ฐ์—์ตœ์ ํ™”๋œ ์ปดํ“จํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ•œ ํ•ด์‹œํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

๋‚˜๋ˆ—์…ˆ๋ฒ•๋ณด๋‹ค๋Š” ๋‹ค์†Œ ๋Š๋ฆฌ๋‹ค.

 

univeral hashing

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

h์—์„œ ๋ฌด์ž‘์œ„๋กœ ๋ฝ‘์€ ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ž„์˜์˜ ํ‚ค๊ฐ’์„ ์ž„์˜์˜ ํ•ด์‹œ๊ฐ’์— ๋งคํ•‘ํ•  ํ™•๋ฅ ์„ 1/m๋กœ ๋งŒ๋“œ๋ ค๋Š” ๊ฒƒ์ด ๋ชฉ์ 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ • ์กฐ๊ฑด์˜ ํ•ด์‹œ ํ•จ์ˆ˜์ง‘ํ•ฉ h๋Š” 1/m์œผ๋กœ ๋งŒ๋“œ๋Š”๊ฒŒ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ˆ˜ํ•™์ ์œผ๋กœ์ฆ๋ช…๋˜์—‡๋‹ค๊ณ ํ•œ๋‹ค.

- ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ m์„ ์†Œ์ˆ˜๋กœ ์ •ํ•œ๋‹ค.

- ํ‚ค๊ฐ’์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด r+1๊ฐœ๋กœ ์ชผ๊ฐ ๋‹ค : k0, k1,...,kr

- 0๋ถ€ํ„ฐ m-1 ์‚ฌ์ด์˜ ์ •์ˆ˜ ๊ฐ€์šด๋ฐ ํ•˜๋‚˜๋ฅผ ๋ฌด์ž‘์œ„๋กœ ๋ฝ‘๋Š”๋‹ค. ๋ถ„๋ฆฌ๋œ ํ‚ค ๊ฐ’์˜ ๊ฐœ์ˆ˜(r+1)๋งŒํผ ๋ฐ˜๋ณตํ•ด์„œ ๋ฝ‘๋Š”๋‹ค.

  ์ด๋ฅผ a=[a0,a1,...,ar]๋กœ ๋‘”๋‹ค. ๋”ฐ๋ผ์„œ a์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๋ชจ๋‘ mr+1๊ฐ€์ง€์ด๋‹ค.

- ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค. 

- a๊ฐ€ mr+1๊ฐ€์ง€์ด๋ฏ€๋กœ ํ•ด์‹œํ•จ์ˆ˜์˜ ์ง‘ํ•ฉ H์˜ ์š”์†Œ ์ˆ˜๋˜ํ•œ mr+1๊ฐœ์ด๋‹ค.

์œ„์™€ ๊ฐ™์€ ์กฐ๊ฑด์—์„œ๋Š” ํ‚ค๊ฐ€ ๋™์ผํ•˜๋”๋ผ๋„ a๊ฐ€ ์–ผ๋งˆ๋“ ์ง€ ๋žœ๋คํ•˜๊ฒŒ ๋‹ฌ๋ผ์งˆ ์ˆ˜์ž‡๊ณ ,์ด์— ํ•ด๋‹นํ•˜๋Š” ํ•ด์‹œํ•จ์ˆ˜ha ๋˜ํ•œ ์ƒ์ดํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— H๋Š” ์œ ๋‹ˆ๋ฒ„์…œ ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค.

 

๐Ÿ’ก ์ข‹์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ž€?

- ํ˜„์‹ค์—์„œ๋Š” ํ‚ค๋“ค์ด ๋žœ๋คํ•˜์ง€์•Š์Œ

- ๋งŒ์•ฝ ํ‚ค๋“ค์˜ ํ†ต๊ณ„์  ๋ถ„ํฌ์— ๋Œ€ํ•ด ์•Œ๊ณ ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ๊ณ ์•ˆํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฒ ์ง€๋งŒ ํ˜„์‹ค์ ์œผ๋กœ์–ด๋ ค์›€

- ํ‚ค๋“ค์ด ์–ด๋–คํŠน์ •ํ•œ (๊ฐ€์‹œ์ ์ธ)ํŒจํ„ด์„ ๊ฐ€์ง€๋”๋ผ๋„ ํ•ด์‹œํ•จ์ˆ˜ ๊ฐ’์ด ๋ถˆ๊ทœ์น™์ ์ด ๋˜๋„๋ก ํ•˜๋Š”๊ฒŒ ๋ฐ”๋žŒ์งํ•จ.

  * ํ•ด์‹œ ํ•จ์ˆ˜ ๊ฐ’์ด ํ‚ค์˜ ํŠน์ • ๋ถ€๋ถ„์— ์˜ํ•ด์„œ๋งŒ ๊ฒฐ์ •๋˜์ง€ ์•Š์•„์•ผํ•จ.

 

๐Ÿ’ก ํ•ด์‹œ ์ถฉ๋Œ

๊ฐ™์€ Key์— ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์ด์ „ ๊ฐ’์€ ์‚ฌ๋ผ์ง€๊ณ  ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๊ฐ’๋งŒ ๋‚จ๋Š”๋‹ค.

ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด ๊ฒ€์ถœ ์†๋„๋ฅผ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ณ  ๋ฒ„ํ‚ท ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(?)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.

- ๋ฒ„ํ‚ท ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ? ๋ฒ„ํ‚ท์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์œผ๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๋ฅผ ํ•ด์‹œํ•จ์ˆ˜ํ•˜์—ฌ ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์ด ๋‚˜์™€ ๋ฒ„ํ‚ท์ด ํฌ๊ธฐ๋ฅผ ๋„˜์„ ์ˆ˜ ์žˆ์Œ.

- ํ•ด์‹œ ์ถฉ๋Œ ๋ฐœ์ƒ ํ™•๋ฅ ์ด ์ ์„์ˆ˜๋ก ์ข‹๋‹ค.

 

๋”ฐ๋ผ์„œ ํ•ด์‹œ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์—์„œ john๊ณผ sandra์˜ hash๊ฐ€ 02๋กœ ๊ฐ™๋‹ค. ์ด๋Ÿฐ ํ˜„์ƒ์„ hash collision์ด๋ผ๊ณ  ํ•œใ„ด๋‹ค.

ํ•ด์‹œ ํ•จ์ˆ˜๋กœ ํ•ด์‹œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ key๊ฐ€ ๊ฐ™์€ ํ•ด์‹œ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ฐ™์€ ๊ณต๊ฐ„์— 2๊ฐœ์˜ value๊ฐ€ ์ €์žฅ๋˜๋ฏ€๋กœ key-value๊ฐ€ 1:1๋กœ ๋งคํ•‘๋˜์–ด์•ผ ํ•˜๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํŠน์„ฑ์— ์œ„๋ฐฐ๋œ๋‹ค.

ํ•ด์‹œ ์ถฉ๋Œ์€ ํ•„์—ฐ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

 

Hash Table์— ์ด๋ฏธ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ๋ชปํ•˜๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๊ฐœ๋ฐฉ์ฃผ์†Œ๋ฒ•๊ณผ ๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ•์ด ์žˆ์ง€๋งŒ ๊ฐœ๋ฐฉ์ฃผ์†Œ๋ฒ•์€ ์ถฉ๋Œ์ด ๋งŽ์ด์ผ์–ด๋‚  ๊ฒฝ์šฐ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.(ํŠน์ •๋ธ”๋กœ๊ทธ๋Š” ๊ฐœ๋ฐฉ์ฃผ์†Œ๋ฒ•์„ ์•„์˜ˆ ์„ค๋ช…์„์•ˆํ–ˆ์Œ)

 

๐Ÿ’ก ํ•ด์‹œ ์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฒ• 1) - Chaning (JAVA - linkedList ํ™œ์šฉ) (๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ•)

 - ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” Node๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ.

์ฆ‰ Hash Table์˜ ์…€๋งˆ๋‹ค ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ํ•˜๋‚˜ ์”ฉ ์ €์žฅํ•˜๋„๋ก ํ•˜๊ณ  ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ๊ณ„์† ์ถ”๊ฐ€ํ•ด ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

์ดํ›„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ์—๋Š” hash table์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์€ ํ›„ ์…€์— ์—ฐ๊ฒฐ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœํƒ์ƒ‰ํ•˜๋ฉฐ ์ฐพ์œผ๋ ค๋Š” hashCode์™€ ์ €์žฅ๋œ ๋…ธ๋“œ์˜ hashCode๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 - ํ•ด์‹œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹

 - ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ๋™์ผํ•œ bucket(๋ฉ”๋ชจ๋ฆฌ๋ผ๊ณ  ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค) ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ํ•˜๋‚˜์”ฉ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•จ.

 - ๊ผฌ๋ฆฌ์žก๊ธฐ ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋‚ด ํ•˜๋‚˜์˜ ๋…ธ๋“œ๊ฐ€ ๋˜์–ด ์ฐจ๋ก€๋Œ€๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ.

 - ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋ณต์žกํ•˜์ง€ ์•Š๊ณ  ๊ฐ™์€ ์ฃผ์†Œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

 - ํ•˜์ง€๋งŒ, ํŠน์ • ์ฃผ์†Œ์— ๊ณ„์† ์Œ“์ด๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด ํ˜„์ €ํ•˜๊ฒŒ ๋‚ฎ์•„์ง€๊ณ  ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์žก์•„๋จน์Œ

ํŒŒํฌ ๊ท€์ฐฎ์•„์„œ ๊ทธ๋ฆผํŒ..

 

์ฒด์ด๋‹์€ ์ €์žฅ์†Œ(bucket)์—์„œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋ฉด ๊ธฐ์กด ๊ฐ’๊ณผ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๐Ÿ“ ์žฅ์ 

  - ํ•œ์ •๋œ ์ €์žฅ์†Œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. => ๋ฏธ๋ฆฌ ์ถฉ๋Œ์„ ๋Œ€๋น„ํ•ด ๋งŽ์€ ๊ณต๊ฐ„์„ ์žก์•„๋†“์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

  - ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์„ ํƒํ•˜๋Š” ์ค‘์š”์„ฑ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ ๋‹ค => ์ถฉ๋Œ์ด ๋‚˜๋„ ๊ทธ๋ƒฅ ์—ฐ๊ฒฐํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ.

๐Ÿ“ ๋‹จ์ 

  - ํ•œ hash์— ์ž๋ฃŒ๋“ค์ด ๋งŽ์ด ์—ฐ๊ฒฐ๋˜๋ฉด ๊ฒ€์ƒ‰ ํšจ์œจ์ด ๋‚ฎ์•„์ง„๋‹ค.(์ ๋ฆผํ˜„์ƒ)

  - ์™ธ๋ถ€ ์ €์žฅ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿ’ก ๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ•์„์ด์šฉํ•œ Hash ๊ตฌํ˜„

package util;

public class Hash{
	
	//ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  Entry๋Š” ๊ฐ’๊ณผ ๋‹ค์Œ Entry๋ฅผ ๊ฐ€์ง„๋‹ค.
	private class Entry{
		private int value;
		public Entry next;
	}
	
	private int size;
	private Entry[] hTable;
	
//	Hash Table์€ size์™€ ๋ฐฐ์—ด ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ๋‹ค.
	public Hash(int size) {
		this.size = size;
		this.hTable = new Entry[size];
	}
	
	
//	data๋ฅผ ๊ฐ€์ง€๊ณ  hashCode๋ฅผ ์ƒ์„ฑํ•˜์—ฌ key๋ฅผ ์ถ”์ถœํ•œ๋‹ค.
//	์‹ค์ œ Hash ์—๋Š” ํŠน๋ณ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ๋˜์–ด hashCode๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ
//	๋ณธ ์ฝ”๋“œ์—์„œ๋Š” data ๊ฐ’์„ key๋กœ ํ•จ.
	public int getKey(int data) {
		return data;
	}
	
//	key ๊ฐ’์œผ๋กœ HashTable์— ์ €์žฅํ•  index๋ฅผ ๊ฒฐ์ •ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
	public int hashMethod(int key) {
		return key % size;
	}
	
//	data๋ฅผ HashTable์— ์ €์žฅํ•œ๋‹ค.
//	Hash์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž…์€ ํ‚ค์™€ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  HashTable์—์„œ ํ•ด๋‹น ์ธ๋ฑ์Šค๋ฅผ ํ™•์ธํ•œ๋‹ค.
//	ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด Entry๋ฅผ ์ €์žฅํ•˜๋ฉด ๋˜๊ณ 
//	ํ•ด๋‹น ์ธ๋ฑ์Šค์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ฒซ๋ฒˆ์งธ Entry๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜์—ฌ Key๊ฐ€ ์‚ฝ์ž…๋  ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•œ๋‹ค.
//	Entry ๋ฆฌ์ŠคํŠธ๋Š” ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ด๋ฉฐ ์ž‘์€๊ฐ’๋ถ€ํ„ฐ ํฐ๊ฐ’ ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.
	public int add(int data) {
//		data์˜ hashCode๋ฅผ key์™€ ์ €์žฅํ•  index๋ฅผ ์–ป๋Š”๋‹ค.
		int key = getKey(data);
		int hashValue = hashMethod(key);
		
//		์ €์žฅํ•  Entry ์ƒ์„ฑ
		Entry entry = new Entry();
		entry.value = data;
		
//		hashTable์˜ ์ €์žฅํ•  index๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด, Entry๋ฅผ ์ €์žฅํ•˜๊ณ  ๋๋‚ธ๋‹ค.
		if(hTable[hashValue] == null) {
			hTable[hashValue] = entry;
			return 0;
		}
		
//		ํ•ด๋‹น ์ธ๋ฑ์Šค์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ฒซ๋ฒˆ์งธ Entry๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜์—ฌ Key๊ฐ€ ์‚ฝ์ž…๋  ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•œ๋‹ค.
//		Entry ๋ฆฌ์ŠคํŠธ๋Š” ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ด๋ฉฐ ์ž‘์€๊ฐ’๋ถ€ํ„ฐ ํฐ๊ฐ’ ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.
		Entry pre = null;
		Entry cur = hTable[hashValue];
		
//		ํ•ด๋‹น index์˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ’์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ํฐ ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜์–ด ์ž‡๋‹ค.
		while(true) {
			if(cur == null) {//Hash Table์— ์ €์žฅํ•  index๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด
				hTable[hashValue] = entry; //ํ•ด๋‹น index์— Entry๋ฅผ ์ €์žฅํ•œ๋‹ค.
				return 0;
			}else if(cur.value < key) {//ํ•ด๋‹น index์˜ ์ปค์„œ๋…ธ๋“œ ๊ฐ’์ด key๋ณด๋‹ค ์ž‘์œผ๋ฉด
				//์ปค์„œ๋ฅผ ํ•˜๋‚˜ ๋’ค๋กœ ์˜ฎ๊ธด๋‹ค.
				pre = cur;
				cur =cur.next;
			}else {//ํ•ด๋‹น index์˜ ์ปค์„œ ๋…ธ๋“œ ๊ฐ’์ด key๋ณด๋‹ค ํฌ๋‹ค.(์—ฌ๊ธฐ์— ์ €์žฅ)
//				์ปค์„œ๋…ธ๋“œ๊ฐ€ hashTable์˜ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ์ด๋ฉด
				if(cur == hTable[hashValue]) {
//					์‚ฝ์ž… ๋…ธ๋“œ๋ฅผ ์ฒซ๋ฒˆ์žฌ ๋…ธ๋“œ๋กœ ์‚ฝ์ž…ํ•˜๊ณ  ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ปค์„œ ๋…ธ๋“œ๋กœ ์ง€์ •ํ•œ๋‹ค.
					entry.next = cur;
					hTable[hashValue] = entry;
					return 0;
				}else {//์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด
//					์‚ฝ์ž… ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ปค์„œ ๋…ธ๋“œ๋ฅผ ์ง€์ •ํ•˜๊ณ 
//					์ „ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž… ๋…ธ๋“œ๋กœ ์ง€์ •ํ•œ๋‹ค.
					entry.next = cur;
					pre.next = entry;
					return 0;
					
				}
			}
		}
	}
	
//	data๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์–ป๋Š”๋‹ค.
//	๋ฐ์ดํ„ฐ์˜ ์œ„์น˜ ํƒ์ƒ‰์€ hashMethod()๋กœ index๋ฅผ์–ป์€ ํ›„ ํ•ด๋‹น index์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ž‡๋Š”์ง€ ํƒ์ƒ‰ํ•œ๋‹ค.
//  ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด index๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—†์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
	public int get(int data) {
		int key = getKey(data);
		int hashValue = hashMethod(key);
		
//		data๊ฐ€ ์žˆ๋Š” index์˜ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์–ป๋Š”๋‹ค.
		Entry cur = hTable[hashValue];
		
		while(true) {
			if(cur==null) {//index๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด -1๋ฐ˜ํ™˜
				return -1;
			}else if(cur.value == key) {//์ปค์„œ์˜ ๊ฐ’๊ณผ ํ‚ค๊ฐ€ ๊ฐ™์œผ๋ฉด 0 ๋ฐ˜ํ™˜
				return hashValue;
			}else if(cur.value > key) {//์ปค์„œ์˜ ๊ฐ’์ด ํ‚ค๋ณด๋‹ค ํฌ๋ฉด -1 ๋ฐ˜ํ™˜
//				๋ฆฌ์ŠคํŠธ๋Š” ์ž‘์€ ๊ฐ’์—์„œ ํฐ๊ฐ’์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.
				return -1;
			}else {//์ปค์„œ์˜ ๊ฐ’์ด ํ‚ค๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ปค์„œ ์ด๋™
				cur = cur.next;
			}
		}
	}
	

//	data๊ฐ€ ์ž‡๋Š” ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
	private Entry getEntry(int data) {
		int key = getKey(data);
		int hashValue = hashMethod(key);
		// HashTable์˜ index์˜  ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ์™€ ๋‘๋ฒˆ์งธ ๋…ธ๋“œ
        Entry pre = hTable[hashValue];
        Entry cur = pre.next;
        
        while(true){
            if(cur == null){    // ์ปค์„œ ๋…ธ๋“œ๊ฐ€ null ์ด๋ฉด null ๋ฐ˜ํ™˜
                return null;
            }else if(cur.value == key){    // ์ปค์„œ ๋…ธ๋“œ์˜ ๊ฐ’์ด ํ‚ค์™€ ๊ฐ™์œผ๋ฉด ์ „ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
                return pre;
            }else if(cur.value > key){    // ์ปค์„œ์˜ ๊ฐ’์ด ํ‚ค๋ณด๋‹ค ํฌ๋ฉด null ๋ฐ˜ํ™˜
                return null;
            }else{            // ์ปค์„œ์˜ ๊ฐ’์ด ํ‚ค๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ปค์„œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ์ด๋™
                pre = cur;
                cur = cur.next;
            }
        }
    }
    
    // data ๋ฅผ ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด์„œ๋Š” data์— ํ•ด๋‹นํ•˜๋Š” index์˜ Entry๋ฆฌ์ŠคํŠธ์—์„œ data์˜ ์•ž ๋…ธ๋“œ๊ฐ€ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ data์˜ ๋’ท ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.
    public int remove(int data){
        Entry pre = null;
        // data๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์˜ ์ „๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  null์ด๋ฉด -1 ๋ฐ˜ํ™˜
        if((pre=getEntry(data))== null){
            return -1;
        }
        // ์ „ ๋…ธ๋“œ๊ฐ€ data์˜ ๋‹ค์Œ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค.
        // data ๋…ธ๋“œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ฒŒ ์—ฐ๊ฒฐํ•œ๋‹ค (์ œ๊ฑฐ)
        Entry cur = pre.next;
        pre.next = cur.next;
        return 0;
    }
    
    public String toString(){
        StringBuffer result = new StringBuffer();
        Entry cur = null;
        for(int i=0; i<size; i++){
            result.append("[" + i + "]\t");
            cur = hTable[i];
            if(cur == null){
                result.append("n ");
            }else{
                while(cur!=null){
                    result.append(cur.value + "");
                    cur = cur.next;
                }
            }
            result.append("\n");
        }
        
        return result.toString();
    }
}

 

 

 

๐Ÿ’ก ํ•ด์‹œ ์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฒ• 2) ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•Open Addressing : ํ•ด์‹œ ์ถฉ๋Œ์ด์ผ์–ด๋‚˜๋ฉด ๋‹ค๋ฅธ buket์— ์‚ฝ์ž…

  - ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•์€ ๋น„์–ด์žˆ๋Š” hash๋ฅผ ์ฐพ์•„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋ฒ•. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐฉ์ฃผ์†Œ๋ฒ•์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ hash์™€ value ๊ฐ€ 1:1 ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

 

  - ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•์€ chaning ์ฒ˜๋Ÿผ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š” ์—†๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  - ๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ชจ๋‘ ์ฝ์–ด์˜ค๊ธฐ ๋•Œ๋ฌธ์—, ํฌ์ธํ„ฐ๋ฅผ ์“ธ ์ผ์ด์—†์–ด ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋‚˜ํƒ€๋‚˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์—์„œ Jone๊ณผ Sandra์˜ hash๊ฐ€ ๋™์ผํ•ด ์ถฉ๋Œ์ด ์ผ์–ด๋‚œ๋‹ค. ์ด๋•Œ sandra๋Š” ๋ฐ”๋กœ ๊ทธ ๋‹ค์Œ ๋น„์–ด์žˆ๋˜ 153 hash์— ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ted๊ฐ€ ํ…Œ์ด๋ธ”์— ์ €์žฅ์„ ํ•˜๋ ค ํ–ˆ์œผ๋‚˜ ๋ณธ์ธ์˜ hash์— ์ด๋ฏธ sandra๋กœ ์ฑ„์›Œ์ ธ์žˆ์–ด ted๋„ sandra์ฒ˜๋Ÿผ ๋ฐ”๋กœ ๋‹ค์Œ ๋น„์–ด์žˆ๋˜ 154hash์— ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋น„์–ด์žˆ๋Š” hash๋ฅผ ์ฐพ์•„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฐœ๋ฐฉ์ฃผ์†Œ๋ฒ•์ด๋‹ค.

์ด๋•Œ, ๋น„์–ด์žˆ๋Š” hash๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

 

๐Ÿ’ก ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•์˜ ๊ทœ์น™

  - ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•์€ ๋Œ€ํ‘œ์ ์œผ๋กœ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์ž‡์Œ.

  1) ์„ ํ˜•ํƒ์ƒ‰(Linear Probing)

   - ํ•ด์‹œ ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ๋‹ค์Œ bucket ์ด๋‚˜ ๋ช‡ ๊ฐœ์˜ bucket์„ ๊ฑด๋„ˆ ๋›ฐ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹

   - ํ•ด๋‹น ํ•ด์‹œ ๊ฐ’์—์„œ ๊ณ ์ •ํญ(+n)์„ ๊ฑด๋„ˆ ๋›ฐ์–ด ๋น„์–ด์žˆ๋Š” ํ•ด์‹œ์— ์ €์žฅ

   - ํŠน์ • ํ•ด์‹œ ๊ฐ’ ์ฃผ๋ณ€ ๋ฒ„ํ‚ท์ด ๋ชจ๋‘ ์ฑ„์›Œ์ ธ ์žˆ๋Š” primary clustring ๋ฌธ์ œ์— ์ทจ์•ฝ

 

์ตœ์ดˆ ํ•ด์‹œ ๊ฐ’์ด 52์ด๊ณ  ๊ณ ์ •ํญ์ด 1์ผ ๊ฒฝ์šฐ 4๋ฒˆ์—ํƒ์ƒ‰ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•จ.

 

๐Ÿ“ chining์€ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , open addressing์€ ํ•ด์‹œ ํ…Œ์ด๋ธ” ํฌ๊ธฐ๋Š” ๊ณ ์ •์‹œํ‚ค๋˜ ์ €์žฅํ•ด ๋‘˜์œ„์น˜๋ฅผ ์ž˜ ์ฐพ๋Š”๋ฐ ๊ด€์‹ฌ์„ ๋‘” ๊ตฌ์กฐ

 

 

  2) ์ œ๊ณฑํƒ์ƒ‰(Quadratic Probing) : ํ•ด์‹œ ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ์ œ๊ณฑ๋งŒํผ ๊ฑด๋„ˆ ๋›ฐ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹

 ์ถฉ๋Œ์ด์ผ์–ด๋‚œ ํ•ด์‹œ์˜ ์ œ๊ณฑ์„ ํ•œ ํ•ด์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ

(1^2์นธ -. 2^2์นธ -. 3^2์นธ...)

์—ฌ๋Ÿฌ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธํ‚ค๋“ค์ด ๋™์ผํ•œ์ดˆ๊ธฐ ํ•ด์‹œ๊ฐ’(์•„๋ž˜์—์„œ initial probe)๋ฅผ ๊ฐ–๋Š” secondary clustering์— ์ทจ์•ฝ

์ดˆ๊ธฐ ํ•ด์‹œ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ๋™์ผํ•œ ํญ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง

 

  3) ์ด์ค‘ํ•ด์‹ฑ(Double Hashing) : ํ•ด์‹œ ์ถฉ๋Œ ์‹œ ๋‹ค๋ฅธ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ•œ๋ฒˆ ๋” ์ ์šฉ์‹œํ‚ด.

๋‹ค๋ฅธ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ํ•œ๋ฒˆ ๋” ์ ์šฉํ•ด ๋‚˜์˜จ ํ•ด์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ

์ด์ค‘ ํ•ด์‹ฑ์„ ํ•˜๋ฉด์ตœ์ดˆ ํ•ด์‹œ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ํƒ์‚ฌ ์ด๋™ํญ์ด ๋‹ฌ๋ผ์ง€๊ณ , ํƒ์‚ฌ ์ด๋™ํญ์ด ๊ฐ™๋”๋ผ๋„ ์ตœ์ดˆ ํ•ด์‹œ ๊ฐ’์ด ๋‹ฌ๋ผ์ ธ primary, secondary clustering์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Œ

์žฅ์  - ๋˜ ๋‹ค๋ฅธ ์ €์žฅ๊ณต๊ฐ„ ์—†์ด ํ•ด์‹œ ํ…Œ์ด๋ธ” ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ ๋ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅ

๋‹จ์  - ํ•ด์‹œํ•จ์ˆ˜์˜ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์„ฑ๋Šฅ์ด ์ขŒ์šฐ๋œ๋‹ค.

      - ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ์ €์žฅ์†Œ๋ฅผ ๋งˆ๋ จํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค.

 

 

๐Ÿ’ก ๊ฒฐ๊ณผ 

Hash ๋Š” ํƒ์ƒ‰์ด ๋น ๋ฅธ ๋ฐฐ์—ด์˜ ์žฅ์ ๊ณผ ์‚ฝ์ž…/ ์‚ญ์ œ ์‹œ ๋ฐ์ดํ„ฐ์˜ ๋ฐ€์–ด๋‚ด๊ธฐ ์ด๋™์ด ํ•„์š”์—†๋Š” ์žฅ์ ์„์ด์šฉํ•ด ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ๋ฒ•์ด๋‹ค.

๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ•์€ ๋ฐฐ์—ด๊ณผ ๋‹จ์ˆœ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ํ˜ผํ•ฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…/์‚ญ์ œ/ํƒ์ƒ‰์˜ ์„ฑ๋Šฅ์„ ๋†’์ธ๋‹ค.

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

 

 

๐Ÿ’ก JAVA์—์„œ์˜ hash

HashMap๊ณผ HashTable

HashTable์ด๋ž€ JDK 1.0๋ถ€ํ„ฐ ์žˆ๋˜ Java์˜ API์ด๊ณ , hashMap์€ Java 2์—์„œ ์ฒ˜์Œ ์„ ๋ณด์ธ JavaCollections Framework์— ์†ํ•œ API์ด๋‹ค.

HashTable ๋˜ํ•œ Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— HashMap๊ณผ HashTable์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๊ฐ™๋‹ค.

 

์ฐจ์ด์ 

1. ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜

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

2. ๋™๊ธฐํ™”

HashMap์˜ ๊ฒฝ์šฐ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ Hashtable์€ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๋ผ๋Š” ๋น„์šฉ ๋•Œ๋ฌธ์— HashMap์— ๋น„ํ•ด ๋” ๋Š๋ฆฌ๋‹ค๊ณ  ํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ƒ์˜ํŽธ์˜์„ฑ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ Hashtable์„ ์“ฐ๊ธฐ๋ณด๋‹ค๋Š” hashMap์„ ๋‹ค์‹œ ๊ฐ์‹ธ์„œ

Map m = Collections.synchronizedMap(new HashMap(...)); 

๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ์ตœ๊ทผ์—๋Š” ๋” ์„ ํ˜ธํ•œ๋‹ค.

 

๐Ÿ’ก HashMap ์‚ดํŽด๋ณด๊ธฐ

1) ํ•ด์‹œ ์ถฉ๋Œ ๊ธฐ๋ฒ•

Java HashMap์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ Separate Channing์ด๋‹ค. Open Addressing์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์ฒ˜๋ฆฌ๊ฐ€ ํšจ์œจ์ ์ด๊ธฐ ์–ด๋ ค์šด๋ฐ, HashMap์—์„œ remove() ๋ฉ”์„œ๋“œ๋Š” ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์ด๋‹ค.

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

 

2) ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ํŠธ๋ฆฌ

์œ„์—์„œ ์ฒด์ด๋‹ ๋ฐฉ์‹์€ ๋ณดํ†ต ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด value๋“ค์„์—ฐ๊ฒฐํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค HashMap๋˜ํ•œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์ง€๋งŒ Java8๋ถ€ํ„ฐ ๋ฒ„ํ‚ท์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์ • ๊ฐœ์ˆ˜ ์ด์ƒ์ผ ๋•Œ๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋Œ€์‹  ํŠธ๋ฆฌ(Red-Black tree)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ใ„ณ์œผ๋กœ ๋ณ€๊ฒฝํ›„ ๊ธฐ์กด get()๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๊ธฐ๋Œ“๊ฐ’

์—์„œ

์œผ๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์—ˆ๋‹ค.

ํ•˜๋‚˜์˜ ํ•ด์‹œ ๋ฒ„ํ‚ท์— 8๊ฐœ ์ด์ƒ์˜ ํ‚ค-๊ฐ’ ์Œ์ด ๋ชจ์ด๋ฉด๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ํŠธ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  6๊ฐœ์—์ด๋ฅด๊ฒŒ๋˜๋ฉด ๋‹ค์‹œ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ํŠธ๋ฆฌ๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ๊ณ  ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ ํŠธ๋ฆฌ์™€ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์˜ WorstCase ์ˆ˜ํ–‰์‹œ๊ฐ„ ์ฐจ์ด๋น„๊ต๋Š” ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;

 

๐Ÿ’ก ํ•ด์‹œ ๋ฒ„ํ‚ท ๋™์  ํ™•์žฅ

์•„๊นŒ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์˜ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์ฒดํ‚ค์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘๊ฒŒ ๋งŒ๋“ ๋‹ค๊ณ  ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋กœ ์ธํ•ด ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ณ  ์„ฑ๋Šฅ์ƒ ์†์‹ค์ด ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋ž˜์„œ HashMap์€ key-value ์Œ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ์ผ์ • ๊ฐœ์ˆ˜ ์ด์ƒ์ด ๋˜๋ฉด, ํ•ด์‹œ ๋ฒ„ํ‚ท์˜ ์ˆ˜๋ฅผ ๋‘๋ฐฐ๋กœ ๋Š˜๋ฆฐ๋‹ค. ํ•ด์‹œ ๋ฒ„ํ‚ท์˜ ์ˆ˜๋ฅผ ๋Š˜๋ ค ํ•ด์‹œ ์ถฉ๋Œ์˜ ํ™•๋ฅ ์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋‹ค.

 

ํ•ด์‹œ ๋ฒ„ํ‚ท ๊ฐœ์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์€ 16์ด๊ณ , ๋ฒ„ํ‚ท์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” 230๊ฐœ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ๋ฒ„ํ‚ท ๊ฐœ์ˆ˜๊ฐ€ ๋‘๋ฐฐ๋กœ ์ฆ๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค, ๋ชจ๋“  ํ‚ค-๊ฐ’๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์ƒˆ๋กœ์šด Separate Chaining์„ ๊ตฌ์„ฑํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

HashMap ์ƒ์„ฑ์ž์˜ ์ธ์ž๋กœ ์ดˆ๊ธฐ ํ•ด์‹œ ๋ฒ„ํ‚ท ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์ž‡์œผ๋ฏ€๋กœ, ํ•ด๋‹น HashMap ๊ฐ์ฒด์— ์ €์žฅ๋  ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์–ด๋Š ์ •๋„์ธ์ง€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” ์ด๋ฅผ ์ƒ์„ฑ์ž์˜ ์ธ์ž๋กœ ์ง€์ •ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•˜๊ฒŒ Separate Chaining์„ ์žฌ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

resize๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ์ƒˆ ํ•ด์‹œ ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ, ๊ธฐ์กด ๋ชจ๋“  ํ•ด์‹œ ๋ฒ„ํ‚ท์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ํ•ด์‹œ ๋ฒ„ํ‚ท์— ์žˆ๋Š” ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ key-value์Œ์„ ์ €์žฅํ•œ๋‹ค. ์ด๋•Œ ํ•ด์‹œ ๋ฒ„ํ‚ท๊ฐœ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— index๊ฐ’(hashCode % M)์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ํ•ด์‹œ ๋ฒ„ํ‚ท ํฌ๊ธฐ๋ฅผ ๋‘ ๋ฐฐ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์—๋Š” ๊ฒฐ์ •์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ํ•ด์‹œ ๋ฒ„ํ‚ท์˜ ๊ฐœ์ˆ˜ M์ด 2a ํ˜•ํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, index = X.hashCode() % M์„ ๊ณ„์‚ฐํ•  ๋•Œ X.hashCode()์˜ ํ•˜์œ„ a๊ฐœ์˜ ๋น„ํŠธ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€32๋น„ํŠธ ์˜์—ญ์„ ๊ณ ๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก๋งŒ๋“ค์—ˆ๋‹ค ํ•˜๋”๋ผ๋„ ํ•ด์‹œ๊ฐ’์„ 2์˜ ์Šน์ˆ˜๋กœ ๋‚˜๋ˆ„๋ฉด ํ•ด์‹œ ์ถฉ๋Œ์ด ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์ž‡๋‹ค.

์ด๋•Œ๋ฌธ์— ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

 

๐Ÿ’ก ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜

๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ๋ชฉ์ ์€ key์˜ ํ•ด์‹œ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด ํ•ด์‹œ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋‹ค.

//java 8 ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }  

Java 8 HashMap ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ์ƒ์œ„ 16๋น„ํŠธ ๊ฐ’์„ XOR ์—ฐ์‚ฐํ•˜๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ์˜ ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

์ด์œ ๋กœ๋Š” ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ์ฒซ๋ฒˆ์งธ๋Š”Java 8์—์„œ๋Š” ํ•ด์‹œ ์ถฉ๋Œ์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ ๋Œ€์‹  ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ•ด์‹œ ์ถฉ๋Œ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์™„ํ™”๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‘๋ฒˆ์งธ๋กœ๋Š” ์ตœ๊ทผ์˜ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ๊ท ๋“ฑ ๋ถ„ํฌ๊ฐ€ ์ž˜ ๋˜๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝํ–ฅ์ด ๋งŽ์•„, Java 7 ๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋˜ ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ํšจ๊ณผ๊ฐ€ ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‘๋ฒˆ์งธ ์ด์œ ๊ฐ€ ์ข€ ๋” ๊ฒฐ์ •์ ์ธ ์›์ธ์ด ๋˜์–ด Java8์—์„œ๋Š” ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ๊ตฌํ˜„์„ ๋ฐ”๊พธ์—‡๋‹ค.

 

๐Ÿ’ก Hashing in Java

- Java์˜ Object ํด๋ž˜์Šค๋Š” hashCode() ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“ ํด๋ž˜์Šค๋Š” hashCode()๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. 

- ์ด ๋ฉ”์„œ๋“œ๋Š” ํ•˜๋‚˜์˜ 32๋น„ํŠธ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

- 32๋น„ํŠธ์ •์ˆ˜๋ผ๋Š” ๊ฒƒ์€ ์Œ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ด๋‹ค.

- ๋งŒ์•ฝ x.equals(y)์ด๋ฉด x.hashCode() == y.hashCode() ์ด๋‹ค. ํ•˜์ง€๋งŒ ์—ญ์€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค.

- Object ํด๋ž˜์Šค์˜ hashCode() ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ์•Œ๋ ค์ ธ ์žˆ๋‹ค.

  (but it's implementation-dependent.)

- ํ•„์š”์— ๋”ฐ๋ผ ๊ฐ ํด๋ž˜์Šค๋งˆ๋‹ค ์ด ๋ฉ”์„œ๋“œ๋ฅผ overrideํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

  (์˜ˆ) Integer ํด๋ž˜์Šค๋Š” ์ •์ˆ˜๊ฐ’์„ hashCode๋กœ ์‚ฌ์šฉ

 

๐Ÿ’ก ํ•ด์‹œํ•จ์ˆ˜์˜ ์˜ˆ : hashCode() for String in Java

public final class String{
	private final char[] s;
    ...
    public int hashCode(){
    	int hash = 0;
        for (int i = 0 ; i < length() ; i++)
        hash = s[i] + (31 * hash);
        
        return hash;
    }
}

 

๐Ÿ’ก ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค์˜ ์˜ˆ

- ๋ชจ๋“  ๋ฉค๋ฒ„๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ hashCode๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

public class Record{
	private String name;
    private int id;
    private double value;
    ...
    public int hashCode(){
    	int hash = 17; //nonzero constant
        hash = 31 * hash + name.hachCode();
        hash = 31 * hash + Integer.valueOf(id).hashCode();
        hash = 31 * hash + Double.valueOf(value).hashCode();
        
        return hash;
    }
}

๐Ÿ’ก hashCode์™€ hash ํ•จ์ˆ˜

 - hash code : -2^31์—์„œ 2^31์‚ฌ์ด์˜ ์ •์ˆ˜

 - hash ํ•จ์ˆ˜ : 0์—์„œ M-1๊นŒ์ง€์˜ ์ •์ˆ˜(๋ฐฐ์—ด์ธ๋ฑ์Šค)

    * 0x7fffffff์„ &์—ฐ์‚ฐํ•˜๋Š” ์ด์œ ๋Š” ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ ์–‘์ˆ˜๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์ž‘์—…์ด๋‹ค.

    * ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์˜ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€์–‘์ˆ˜์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

private int hash(Key key){
	return (key.hashCode() & 0x7fffffff) % M;
}

 

๐Ÿ’ก HashMap in Java

- TreeMapํด๋ž˜์Šค์™€ ์œ ์‚ฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต(๋‘˜ ๋‹ค java.util.Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„)

- ๋‚ด๋ถ€์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์„ ํ•ด์‹œ ํ…Œ์ด๋ธ”๋กœ ์‚ฌ์šฉ

- ํ•ด์‹œ ํ•จ์ˆ˜๋Š” 24ํŽ˜์ด์ง€์˜ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•จ

- chaining์œผ๋กœ ์ถฉ๋Œ ํ•ด๊ฒฐ

- Load factor๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ(0~1์‚ฌ์ด์˜ ์‹ค์ˆ˜)

- ์ €์žฅ๋œ ํ‚ค์˜ ๊ฐœ์ˆ˜๊ฐ€ load factor๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ๋” ํฐ ๋ฐฐ์—ด์„ ํ• ๋‹นํ•˜๊ณ  ์ €์žฅ๋œ ํ‚ค๋ฅผ ์žฌ๋ฐฐ์น˜(re-hashing)

 

๐Ÿ’ก HashSet in Java

HashSet<MyKey> set = new HashSet<MyKey>();
set.add(MyKey);
if (set.contains(theKey))
...
int k = set.size();
set.remove(theKey);
Iterator<MyKey> it = set.iterator();
while(it.hasNext()){
	MyKey key = it.next();
    if(Key.equals(aKey)
    	it.remove()
}

 

 

โ–ผ ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ

 

'BackEnd > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ArrayList  (0) 2021.03.06
Stack๊ณผ Queue  (0) 2021.03.06
JDK ๋ฒ„์ „ ๋ณ„ ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์›๊ธฐ๋Šฅ ์ •๋ฆฌ  (0) 2021.03.05
Set & TreeSet  (0) 2021.03.05
Java equals(), HashCode()  (2) 2021.03.04