자료ꡬ쑰

[자료ꡬ쑰] Hash

quedevel 2023. 3. 27. 15:32
728x90
λ°˜μ‘ν˜•

🎯 Hash


ν•΄μ‹œ(Hash)λŠ” 데이터λ₯Ό μ €μž₯ν•˜κ³  κ²€μƒ‰ν•˜κΈ° μœ„ν•œ 자료ꡬ쑰 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. ν•΄μ‹œλŠ” λ°μ΄ν„°μ˜ κ³ μœ ν•œ νŠΉμ • κ°’(ν‚€, Key)을 ν•΄μ‹œ ν•¨μˆ˜(Hash Function)λ₯Ό μ‚¬μš©ν•˜μ—¬ κ³„μ‚°ν•œ ν›„, κ·Έ 결과값을 λ°°μ—΄μ˜ 인덱슀둜 μ‚¬μš©ν•΄ 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ €μž₯된 λ°μ΄ν„°λŠ” O(1)의 μ‹œκ°„ λ³΅μž‘λ„λ‘œ 검색할 수 μžˆμœΌλ―€λ‘œ 맀우 λΉ λ₯Έ 검색이 κ°€λŠ₯ν•©λ‹ˆλ‹€.


ν•΄μ‹œ 좩돌(Hash Collision)


ν•΄μ‹œ μΆ©λŒμ΄λž€ ν•΄μ‹œ ν•¨μˆ˜κ°€ μ„œλ‘œ λ‹€λ₯Έ 두 개의 μž…λ ₯값에 λŒ€ν•΄ λ™μΌν•œ 좜λ ₯값을 λ‚΄λŠ” 상황을 μ˜λ―Έν•œλ‹€. ν•΄μ‹œ ν•¨μˆ˜κ°€ λ¬΄ν•œν•œ κ°€μ§“μˆ˜μ˜ μž…λ ₯값을 λ°›μ•„ μœ ν•œν•œ κ°€μ§“μˆ˜μ˜ 좜λ ₯값을 μƒμ„±ν•˜λŠ” 경우, λΉ„λ‘˜κΈ°μ§‘ 원리에 μ˜ν•΄ ν•΄μ‹œ μΆ©λŒμ€ 항상 μ‘΄μž¬ν•œλ‹€.

ν•΄μ‹œ μΆ©λŒμ€ ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ μžλ£Œκ΅¬μ‘°λ‚˜ μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ λ–¨μ–΄λœ¨λ¦¬λ©°, λ”°λΌμ„œ ν•΄μ‹œ ν•¨μˆ˜λŠ” ν•΄μ‹œ 좩돌이 자주 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ κ΅¬μ„±λ˜μ–΄μ•Ό ν•œλ‹€. μ•”ν˜Έν•™μ  ν•΄μ‹œ ν•¨μˆ˜μ˜ 경우 ν•΄μ‹œ ν•¨μˆ˜μ˜ μ•ˆμ „μ„±μ„ κΉ¨λœ¨λ¦¬λŠ” 좩돌 곡격이 κ°€λŠ₯ν•  수 있기 λ•Œλ¬Έμ— μ˜λ„μ μΈ ν•΄μ‹œ μΆ©λŒμ„ λ§Œλ“œλŠ” 것이 어렡도둝 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

  • λΉ„λ‘˜κΈ°μ§‘ 원리
    • λΉ„λ‘˜κΈ°μ§‘ μ›λ¦¬λŠ” n+1개의 물건을 n개의 μƒμžμ— 넣을 λ•Œ 적어도 μ–΄λŠ ν•œ μƒμžμ—λŠ” 두 개 μ΄μƒμ˜ 물건이 λ“€μ–΄ μžˆλ‹€λŠ” 원리λ₯Ό λ§ν•œλ‹€. 보톡 λΉ„λ‘˜κΈ°μ™€ λΉ„λ‘˜κΈ°μ§‘μ˜ ν˜•νƒœλ‘œ λΉ„μœ λ˜μ–΄ 쓰이며, 'μ„œλžκ³Ό 양말'둜 λΉ„μœ ν•˜μ—¬ μ„œλž 원칙 λ˜λŠ” λ””λ¦¬ν΄λ ˆμ˜ λ°© λ‚˜λˆ„κΈ° 원칙이라고 λΆ€λ₯΄κΈ°λ„ ν•˜λ©° ꡬ두 μƒμžμ˜ 원리라고도 ν•œλ‹€.

⭐️ ν•΄μ‹œ μΆ©λŒμ„ μ²˜λ¦¬ν•˜λŠ” 방법

  1. 뢄리 연쇄법(Separate Chaining)
    • ν•΄μ‹œ 좩돌이 λ°œμƒν•˜λ©΄ ν•΄λ‹Ή μΈλ±μŠ€μ— μ—°κ²° 리슀트(Linked List)λ₯Ό λ§Œλ“€κ³ , μ—°κ²° λ¦¬μŠ€νŠΈμ— 데이터λ₯Ό μΆ”κ°€ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 이 방법은 각 μΈλ±μŠ€λ§ˆλ‹€ μ—°κ²° 리슀트λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•˜λ―€λ‘œ λ©”λͺ¨λ¦¬ 곡간을 많이 μ‚¬μš©ν•˜μ§€λ§Œ, ν•΄μ‹œ 좩돌이 λ°œμƒν•΄λ„ 데이터λ₯Ό μ €μž₯ν•  수 μžˆμ–΄ 맀우 μœ μš©ν•©λ‹ˆλ‹€.
  2. 개방 μ£Όμ†Œλ²•(Open Addressing)
    • ν•΄μ‹œ 좩돌이 λ°œμƒν•˜λ©΄ λ‹€λ₯Έ 빈 인덱슀λ₯Ό μ°Ύμ•„ 데이터λ₯Ό μ €μž₯ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 이 λ°©λ²•μ—λŠ” μ„ ν˜• 쑰사(Linear Probing), 이차원 쑰사(Quadratic Probing), 더블 ν•΄μ‹±(Double Hashing) λ“± λ‹€μ–‘ν•œ 방법이 μžˆμŠ΅λ‹ˆλ‹€. 개방 μ£Όμ†Œλ²•μ€ ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ 크기λ₯Ό μž‘κ²Œ μœ μ§€ν•  수 μžˆμ–΄ λ©”λͺ¨λ¦¬ 곡간을 적게 μ‚¬μš©ν•˜μ§€λ§Œ, ν•΄μ‹œ 좩돌이 λ°œμƒν•  경우 더 λ§Žμ€ 계산이 ν•„μš”ν•˜λ―€λ‘œ 처리 속도가 느렀질 수 μžˆμŠ΅λ‹ˆλ‹€.

Hash μž₯단점


⭐️ Hash μž₯점

  1. λΉ λ₯Έ 검색 속도
    • ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ 데이터λ₯Ό μ €μž₯ν•˜λ―€λ‘œ, 검색 μ‹œκ°„μ΄ O(1)에 κ°€κΉŒμ›Œ 맀우 λΉ λ¦…λ‹ˆλ‹€. μ΄λŠ” λ°μ΄ν„°μ˜ 크기에 관계 없이 μΌμ •ν•œ μ‹œκ°„ 내에 데이터λ₯Ό 검색할 수 μžˆμœΌλ―€λ‘œ, λŒ€κ·œλͺ¨ λ°μ΄ν„°μ˜ 검색에 μœ μš©ν•©λ‹ˆλ‹€.
  2. κ³ μœ ν•œ κ°’μœΌλ‘œ 데이터λ₯Ό μ €μž₯
    • ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ 데이터λ₯Ό μ €μž₯ν•˜λ©΄, κ³ μœ ν•œ κ°’μœΌλ‘œ 데이터λ₯Ό μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 쀑볡 데이터λ₯Ό μ œκ±°ν•˜κ±°λ‚˜, λ°μ΄ν„°μ˜ μœ μΌμ„±μ„ 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. μ‰¬μš΄ κ΅¬ν˜„
    • ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ 데이터λ₯Ό μ €μž₯ν•˜λ©΄, μ½”λ“œμ˜ κ΅¬ν˜„μ΄ κ°„λ‹¨ν•΄μ§‘λ‹ˆλ‹€. μ΄λŠ” λ‹€λ₯Έ μžλ£Œκ΅¬μ‘°μ™€ λΉ„κ΅ν–ˆμ„ λ•Œ κ΅¬ν˜„μ΄ 쉽고 μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•˜λ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’€οΈ Hash 단점

  1. ν•΄μ‹œ 좩돌
    • ν•΄μ‹œ 좩돌이 λ°œμƒν•  경우, 검색 속도가 느렀질 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 좩돌 처리 μ•Œκ³ λ¦¬μ¦˜μ΄ ν•„μš”ν•˜λ©°, 이에 λ”°λ₯Έ 좔가적인 곡간이 ν•„μš”ν•©λ‹ˆλ‹€.
  2. μˆœμ„œκ°€ 보μž₯λ˜μ§€ μ•ŠμŒ
    • ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ 데이터λ₯Ό μ €μž₯ν•˜λ©΄, λ°μ΄ν„°μ˜ μˆœμ„œκ°€ 보μž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ •λ ¬λœ λ°μ΄ν„°μ˜ κ²€μƒ‰μ—λŠ” μ ν•©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
728x90
λ°˜μ‘ν˜•