μ•Œκ³ λ¦¬μ¦˜

[자료ꡬ쑰] 해쉬 ν…Œμ΄λΈ” with Python

mangdo 2021. 5. 18. 17:24

πŸ’‘ 해쉬 ν…Œμ΄λΈ”?

: ν•΄μ‹œν…Œμ΄λΈ”μ€ 킀에 λŒ€ν•œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” 데이터ꡬ쑰이닀.

: ν‚€λ₯Ό ν•΄μ‹œν•¨μˆ˜λ‘œ μ—°μ‚°ν•˜μ—¬ ν•΄μ‹œ 값을 μ•Œμ•„λ‚΄κ³ , 이λ₯Ό 기반으둜 킀에 λŒ€ν•œ 데이터값을 μ•Œμ•„λ‚Ό 수 μžˆλ‹€.

: 즉, ν‚€λ₯Ό 톡해 데이터λ₯Ό λ°”λ‘œ μ•Œμ•„λ‚Ό 수 μžˆμ–΄ 속도가 획기적으둜 빨라진닀.

: 파이썬의 λ”•μ…”λ„ˆλ¦¬ νƒ€μž…μ΄ λ°”λ‘œ ν•΄μ‹œν…Œμ΄λΈ”κ΅¬μ‘°λ‘œ κ΅¬ν˜„ λ˜μ–΄μžˆλ‹€.

 

πŸ’‘ 해쉬 ν…Œμ΄λΈ” κ΅¬ν˜„ν•˜κΈ°

class Dict:
    def __init__(self):
        self.items = [None] * 8

    def put(self, key, value):
        index = hash(key) % len(self.items)
        self.items[index] = value

    def get(self, key):
        index = hash(key) % len(self.items)
        return self.items[index]

my_dict = Dict()
my_dict.put("test", 3)
print(my_dict.get("test"))  # 3이 λ°˜ν™˜

 

πŸ’‘ ν•΄μ‰¬ ν…Œμ΄λΈ”μ˜ νŠΉμ§•

[ μž₯점 ]

1) ν‚€λ₯Ό 톡해 데이터λ₯Ό λ°”λ‘œ μ•Œμ•„λ‚Ό 수 μžˆμ–΄ μ €μž₯/읽기 속도가 ꡉμž₯히 빨라진닀.

   -> λ°°μ—΄μ˜ κ²½μš°μ—λŠ” λͺ¨λ“  μš”μ†Œλ“€μ„ ν•˜λ‚˜μ”© νƒμƒ‰ν•΄μ•Όν•œλ‹€.

2) ν•΄μ‹œλŠ” 킀에 λŒ€ν•œ 데이터가 μžˆλŠ”μ§€ 확인이 쉬움(쀑볡 체크)

 

[ 단점 ]

1) μ €μž₯ 곡간이 많이 ν•„μš”ν•˜λ‹€.

    -> 곡간과 νƒμƒ‰μ‹œκ°„μ„ λ§žλ°”κΎΈλŠ” 기법이닀.

2) 데이터 곡간을 μž‘κ²Œ 작으면 좩돌이 λ°œμƒν•  수 μžˆλ‹€.

   -> 킀에 ν•΄λ‹Ήν•˜λŠ” μ£Όμ†Œκ°€ 동일할 경우, μΆ©λŒμ„ ν•΄κ²°ν•˜κΈ° μœ„ν•œ λ³„λ„μ˜ μžλ£Œκ΅¬μ‘°κ°€ ν•„μš”ν•˜λ‹€.

   -> ν•˜λ‹¨μ˜ ν•΄μ‹œν…Œμ΄λΈ”μ˜ 좩돌 ν•΄κ²° μ°Έκ³ 

 

[ μ£Όμš” μš©λ„ ]

1) 검색이 많이 ν•„μš”ν•œ 경우

2) μ €μž₯/μ‚­μ œ/읽기가 λΉˆλ²ˆν•œ 경우

3) 캐쉬 κ΅¬ν˜„μ‹œ(쀑볡 체크가 λΉ λ₯΄κ²Œ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έ)

 

πŸ’‘ ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 좩돌 ν•΄κ²°

1) Open hashing(개방 ν•΄μ‹œ)

: 좩돌이 λ°œμƒν•œ 데이터에 λŒ€ν•΄μ„œλŠ” ν•΄μ‹œν…Œμ΄λΈ” 밖에 좔가적인 데이터곡간에 μ €μž₯ν•˜λŠ” 방법이닀.

open hashing의 λŒ€ν‘œμ μΈ μ˜ˆλŠ” channing기법이 μžˆλ‹€.

channing κΈ°λ²•μ—μ„œλŠ” 좩돌이 μΌμ–΄λ‚˜λ©΄ linked listλ₯Ό μ΄μš©ν•΄μ„œ 뒀에 μ—°κ²°μ‹œμΌœ μ €μž₯ν•œλ‹€.

μ΄λ•Œ μ–Όλ§ŒνΌ 좩돌이 일어날지λ₯Ό λͺ°λΌμ„œ 배열이 μ•„λ‹Œ linked listλ₯Ό μ“΄λ‹€.

2) Linear Probing(폐쇄 ν•΄μ‹œ)

: ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 빈 곡간에 μ €μž₯ν•˜λŠ” 방법이닀.

: hash address의 λ‹€μŒλΆ€ν„° 맨 처음 λ‚˜μ˜€λŠ” λΉˆκ³΅κ°„μ— μ €μž₯ν•œλ‹€.

: μ €μž₯곡간 ν™œμš©λ„λ₯Ό 높일 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.

 

πŸ’‘ ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ μ‹œκ°„λ³΅μž‘λ„

1) 일반적인 경우 O(1)

2) μ΅œμ•…μ˜ 경우(좩돌이 λͺ¨λ‘ μΌμ–΄λ‚˜λŠ” 경우) O(n)

 

ν•˜μ§€λ§Œ ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 경우 일반적인 경우λ₯Ό κΈ°λŒ€ν•˜κ³  λ§Œλ“€κΈ° λ•Œλ¬Έμ— μ‹œκ°„ λ³΅μž‘λ„λŠ” O(1)이라고 ν•  수 μžˆλ‹€.