[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
'๐ ์ฝ๋ฉํ ์คํธ > ์ ๋ฌธ์๋ฅผ ์ํ ์ฝ๋ฉํ ์คํธ ํต์ฌ - Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python ์ฝํ ์ ๋ฌธ] 3. (๋ฌธ์ 2๋ฒ) ๋น๋์(ver 2) (0) | 2024.08.31 |
---|---|
[Python ์ฝํ ์ ๋ฌธ] 3. (๋ฌธ์ 1๋ฒ) ๋น๋์(ver 1) (0) | 2024.07.06 |
[Python ์ฝํ ์ ๋ฌธ] 2. (๋ฐฑ์ค) 17608๋ฒ: ๋ง๋๊ธฐ (0) | 2024.06.09 |
[Python ์ฝํ ์ ๋ฌธ] 2. (๋ฌธ์ 6๋ฒ) ๋ ์์ ํฉ (0) | 2024.06.01 |
[Python ์ฝํ ์ ๋ฌธ] 2. (๋ฌธ์ 5๋ฒ) ์ค๋ณต ์ ๊ฑฐ (0) | 2024.05.29 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Claire's Study Note
Hi.Claire