Claire's Study Note

[Python ์ฝ”ํ…Œ ์ž…๋ฌธ] 3. ํ•ด์‹œ(Hash)

by Hi.Claire
๋ฐ˜์‘ํ˜•

๐Ÿ–ฅ๏ธ ์ž…๋ฌธ์ž๋ฅผ ์œ„ํ•œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ํ•ต์‹ฌ - Python (๊น€ํƒœ์›, ์ธํ”„๋Ÿฐ)

 

์„น์…˜3. ํ•ด์‹œ(Hash)

3-1. ํ•ด์‹œํ…Œ์ด๋ธ” ๊ฐœ๋…

(1) ํ•ด์‹œํ…Œ์ด๋ธ”(Hash Table)

ํ•ด์‹œํ…Œ์ด๋ธ”(Hash Table)

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

์ด๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ์„ ๋ฒ„ํ‚ท(bucket) ๋˜๋Š” ์Šฌ๋กฏ(slot)์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ์žฅ์ 

Direct-address Table๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์ด ์ข‹๋‹ค.

  • ๋‹จ์ 

ํ‚ค ๊ฐœ์ˆ˜๋ณด๋‹ค ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ํ•ด์‹œ ์ถฉ๋Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

(2) Direct-address Table

Direct-address Table

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ์˜ ํ•ด์‹œํ…Œ์ด๋ธ”

ํ‚ค์˜ ์ „์ฒด ๊ฐœ์ˆ˜์™€ ๋™์ผํ•œ ํฌ๊ธฐ์˜ Bucket์„ ๊ฐ€์ง„ ํ•ด์‹œํ…Œ์ด๋ธ”

  • ์žฅ์ 

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

  • ๋‹จ์ 

์ „์ฒด ํ‚ค ์ค‘์—์„œ ์‹ค์ œ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์ด ํฌ๊ฒŒ ๋–จ์–ด์ง„๋‹ค.

 

(์˜ˆ์‹œ) ๋‹ค์Œ ์ˆ˜์—ด์—์„œ ๊ฐ ์ˆซ์ž์˜ ๋นˆ๋„์ˆ˜๋ฅผ ๊ตฌํ•˜์‹œ์˜ค.

array = [55236, 55238, 55239, 55240, 55236, 55236, 55238, ..., 55240]

 

3-2. ํ•ด์‹œ ์ถฉ๋Œ

(1) ํ•ด์‹œ ์ถฉ๋Œ(Hash Collision)

ํ•ด์‹œ ์ถฉ๋Œ(Hash Collision)

ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ๋Œ€๊ฐœ ํ•ด์‹œ๊ฐ’์˜ ๊ฐœ์ˆ˜๋ณด๋‹ค ๋” ๋งŽ์€ ์ˆ˜์˜ ํ‚ค๊ฐ’์„ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

์ด๋•Œ๋ฌธ์— ํ•ด์‹œํ•จ์ˆ˜๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ํ‚ค์— ๋Œ€ํ•ด ๋™์ผํ•œ ํ•ด์‹œ๊ฐ’์„ ๋‚ด๋Š” ํ•ด์‹œ ์ถฉ๋Œ(Hash Collision)์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

 

์•„๋ž˜ ์˜ˆ์‹œ๋Š” ์ด๋ฆ„-์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ๊ฐœ๋…์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.

์œ„์˜ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” 'Daniel'๊ณผ 'Bill'์„ ๋ชจ๋‘ '04'๋กœ ๋งคํ•‘ํ•ด ํ•ด์‹œ ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๊ณ  ์žˆ๋‹ค.

 

3-3. ํ•ด์‹œ ์ถฉ๋Œ ํ•ด๊ฒฐ 1 : Chaining

(1) Separate Chaining

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

ํ•ด๋‹น ๋ฒ„ํ‚ท์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ์žˆ๋‹ค๋ฉด ์ฒด์ธ์ฒ˜๋Ÿผ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฉ์‹(์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ)์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

 

(2) ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ์‹œ๊ฐ„๋ณต์žก๋„

ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ํ‰๊ท ์ ์œผ๋กœ O(1)์„ ๊ฐ–๋Š”๋‹ค.

๋‹จ, ์ถฉ๋Œ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ์ˆ˜๋ ดํ•  ์ˆ˜ ์žˆ๋‹ค. (Chaining์œผ๋กœ ํ•ด์‹œ ์ถฉ๋Œ ํ•ด๊ฒฐ ์‹œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)
(์ฐธ๊ณ ) ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ํƒ์ƒ‰์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.

https://moominie.tistory.com/53

 

[Python ์ฝ”ํ…Œ ์ž…๋ฌธ] 2. ๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, deque

๐Ÿ–ฅ๏ธ ์ž…๋ฌธ์ž๋ฅผ ์œ„ํ•œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ํ•ต์‹ฌ - Python (๊น€ํƒœ์›, ์ธํ”„๋Ÿฐ) ์„น์…˜2. ๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, deque2-1. ๋ฐฐ์—ด(Array)(1) ๋ฐฐ์—ด์˜ ๊ฐœ๋…๋ฐฐ์—ด(Array)์€ ๊ฐ™์€ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ์ง‘ํ•ฉ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์˜

moominie.tistory.com

 

3-4. ํ•ด์‹œ ์ถฉ๋Œ ํ•ด๊ฒฐ 2 : Open Addressing

(1) Open Addressing

Open Addressing์€ Chaining๊ณผ ๋‹ฌ๋ฆฌ ํ•œ ๋ฒ„ํ‚ท๋‹น ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์—”ํŠธ๋ฆฌ๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ ํ•ด์‹œํ…Œ์ด๋ธ”์ด๋‹ค.

ํ•ด์‹œํ•จ์ˆ˜๋กœ ์–ป์€ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์ทจ์ง€์—์„œ Open Addressing์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํ•ด์‹œ ์ถฉ๋Œ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

 

 

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

์ตœ์ดˆ ํ•ด์‹œ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๋ฒ„ํ‚ท์— ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ํ•ด์‹œ๊ฐ’์—์„œ ๊ณ ์ •ํญ(์˜ˆ : 1์นธ)์„ ์˜ฎ๊ฒจ ๋‹ค์Œ ํ•ด์‹œ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๋ฒ„ํ‚ท์— ์—‘์„ธ์Šคํ•œ๋‹ค.

์—ฌ๊ธฐ์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋˜ ๋‹ค์‹œ ๊ณ ์ •ํญ์„ ์˜ฎ๊ฒจ ์—‘์„ธ์Šคํ•œ๋‹ค.

 

2) ์ œ๊ณฑํƒ์‚ฌ (Quadratic Probing)

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

์—ฌ๊ธฐ์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ํญ์ด ์ œ๊ณฑ์ˆ˜๋กœ ๋Š˜์–ด๋‚œ๋‹ค.

์˜ˆ์ปจ๋Œ€ ์ž„์˜์˜ ํ‚ค๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ์—‘์„ธ์Šคํ•  ๋•Œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋ฉด 12์นธ์„ ์˜ฎ๊ธด๋‹ค. ์—ฌ๊ธฐ์—์„œ๋„ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋ฉด ์ด๋ฒˆ์—๋Š” 22์นธ, ๊ทธ ๋‹ค์Œ์—๋Š” 32์นธ์„ ์˜ฎ๊ธฐ๋Š” ์‹์ด๋‹ค.

 

3) ์ด์ค‘ํ•ด์‹ฑ (Double Hashing)

ํƒ์‚ฌํ•  ํ•ด์‹œ๊ฐ’์˜ ๊ทœ์น™์„ฑ์„ ์—†์• ๋ฒ„๋ ค์„œ clustering์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. 2๊ฐœ์˜ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ค€๋น„ํ•ด์„œ ํ•˜๋‚˜๋Š” ์ตœ์ดˆ์˜ ํ•ด์‹œ๊ฐ’์„ ์–ป์„ ๋•Œ, ๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํ•ด์‹œ์ถฉ๋Œ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ ํƒ์‚ฌ ์ด๋™ํญ์„ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 

3-5. dictionary ์ž๋ฃŒ๊ตฌ์กฐ

(1) dictionary ๊ฐœ๋…

dictionary ๊ฐ์ฒด๋Š” key, value๋ฅผ ํ•œ ์Œ์œผ๋กœ ๊ฐ€์ง€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.

 

(2) dictionary ํ•จ์ˆ˜

1. dict() : dictionary ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž

sH = dict();

sH = {}

 

2. sH ๋”•์…”๋„ˆ๋ฆฌ์˜ key ํƒ์ƒ‰

sH = {'a': 3, 'b': 5, 'c': 2}
for key in sH:
	print(key)

a, b, c

 

3. sH ๋”•์…”๋„ˆ๋ฆฌ์˜ value ํƒ์ƒ‰

sH = {'a': 3, 'b': 5, 'c': 2}
for val in sH.values():
	print(val)

3, 5, 2

 

4. sH ๋”•์…”๋„ˆ๋ฆฌ์˜ key, value ๋™์‹œ ํƒ์ƒ‰

sH = {'a': 3, 'b': 5, 'c': 2}
for key, val in sH.items():
	print(key, val)

a 3

b 5

c 2

 

5. key in sH : sH ๋”•์…”๋„ˆ๋ฆฌ์— key๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์„œ ์žˆ์œผ๋ฉด True, ์—†์œผ๋ฉด False๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.

sH = {'a': 3, 'b': 5, 'c': 2}
p1 = 'a' in sH;
p2 = 'e' in sH;
print(p1, p2)

True, False

 

6. del(sH[key]) : sH์—์„œ key์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

sH = {'a': 3, 'b': 5, 'c': 2}
del sH['a']
print(sH)

{'b': 5, 'c': 2}

 

7. len(sH) : sH์˜ ํ‚ค์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.

sH = {'a': 3, 'b': 5, 'c': 2}
print(len(sH))

3

 

๋ฐ˜์‘ํ˜•

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Claire's Study Note

Hi.Claire

ํ™œ๋™ํ•˜๊ธฐ