ν΄μ ν μ΄λΈ
νΈλ¦¬ μλ£κ΅¬μ‘°λ₯Ό μ¬μ©νμ¬ μ½μ κ³Ό μμ μ°μ° μ μν μκ°μ μ΅μ O(logn)μ΄ λμ€λλ°,(μ΄ κ²½μ°λ AVL νΈλ¦¬)
μ΄λ³΄λ€ λΉ λ₯Έ μ°μ° μλλ₯Ό μν΄ μ μλ λ°©λ²μ΄ λ°λ‘ ν΄μ ν μ΄λΈμ΄λ€.
ν΄μ ν μ΄λΈμ ν€μ 1μ°¨μ λ°°μ΄μ μΈλ±μ€μ κ΄κ³λ₯Ό μ΄μ©ν΄ ν€(νλͺ©)μ μ§μ νλ€.
ν€λ₯Ό λ°°μ΄μ μΈλ±μ€λ‘ κ·Έλ₯ μ¬μ©νλ©΄ λμ§ μλκ³ ν μ μμ§λ§, μλ μμμ²λΌ ν€λ μ«μκ° μλ μΌλ ¨μ λ¬Έμμ΄μΌ μ μλ€. κ·Έλ κΈ°μ λ©λͺ¨λ¦¬ λλΉλ₯Ό μ€μ΄κΈ° μν΄ μ°λ¦¬λ ν΄μ ν μ΄λΈμ μ¬μ©νλ€.
ν΄μ± : ν€λ₯Ό ν΄μ ν¨μλ₯Ό μ¬μ©ν΄ λ³νν ν΄μ κ°μ λ°°μ΄μ μΈλ±μ€λ‘ μ΄μ©νμ¬ νλͺ©μ μ μ₯νλ κ²μ λ§νλ€.
μ©μ΄ μ 리λ₯Ό νλ² ν΄λ³΄μλ©΄,
ν΄μ ν¨μλ ν€λ€μ ν μ΄λΈμ μΈλ±μ€λ‘ λ³ννλ ν¨μμΈλ°, μ΄λ κ°μ₯ μ΄μμ μΈ ν΄μ ν¨μλ ν€λ€μ κ· λ±νκ² μΈλ±μ€λ‘ λ³ννλ ν¨μμ΄λ€.
- λνμ μΈ ν΄μ ν¨μλ‘ μ€κ° μ κ³± ν¨μ(Mid-square)μ μ κΈ° ν¨μκ° μλ€.
- μ€κ° μ κ³± ν¨μλ ν€λ₯Ό μ κ³±ν ν, μ μ ν ν¬κΈ°μ μ€κ° λΆλΆμ μ¬μ©νλ ν¨μμ΄λ€.
- μ κΈ° ν¨μλ λͺ μ리 μ© μΌμ νκ² λμ΄μ λ§λ μ«μλ€μ ν©μ μ΄μ©νλ€.
- ν΄μ ν¨μλ€μ ν€μ λͺ¨λ μ리μ μ«μκ° ν¨μ κ³μ°μ μ°Έμ¬νλ€λ νΉμ§μ΄ μκ³ ,
- κ³μ° κ²°κ³Όμμ ν΄μ ν μ΄λΈμ ν¬κΈ°μ λ°λΌ νΉμ λΆλΆλ§μ ν΄μ κ°μΌλ‘ νμ©νλ€.
- κ°μ₯ λ리 μ¬μ©νλ ν΄μ ν¨μλ λλμ ν¨μμ΄λ€. μ΄λ ν€λ₯Ό μμ MμΌλ‘ λλ λ€, κ·Έ λλ¨Έμ§λ₯Ό ν΄μ κ°μΌλ‘ μ¬μ©νλ ν¨μμ΄λ€.
- h(key) = key % M
- Mμ μμλ‘ μ¬μ©νλ μ΄μ λ λλμ μ°μ°μ νμ λ, μμκ° ν€λ€μ κ· λ±νκ² μΈλ±μ€λ‘ λ³ννκΈ° λλ¬Έμ΄λ€.
ν΄μ κ°μ μ΄λ¬ν ν΄μ ν¨μκ° κ³μ°ν κ°μ λ§νκ³ (νΉμ ν΄μ μ£Όμ)
ν΄μ ν μ΄λΈμ νλͺ©μ΄ ν΄μ κ°μ λ°λΌ μ μ₯λλ λ°°μ΄μ μλ―Ένλ€.
β» μλ°μ hashCode()
- μλ°μ λͺ¨λ ν΄λμ€λ signed 32λΉνΈ intλ₯Ό λ°ννλ hashCode()λ₯Ό ν¬ν¨νλ€.
- μλ°λ₯Ό μ΄μ©νμ¬ ν΄μ ν μ΄λΈμ ꡬν ν λμ μΌλ°μ μΌλ‘ hashCode()μ overrideνμ¬ ν΄μ ν¨μλ₯Ό ꡬννλ€.
κ·Έλ λ€λ©΄, μλλ λΉ λ₯΄κ³ λ©λͺ¨λ¦¬ λ©΄μμλ μ±λ₯μ΄ λ°μ΄λ ν΄μ ν μ΄λΈμ μΆ©λμ΄ μμ΄ μλ²½ν κΉ?
그건 μλλ€.
μ무리 λ°μ΄λ ν΄μ ν μ΄λΈμ΄λΌκ³ νλλΌλ νμ μΆ©λμ΄ λ°μν μ λ°μ μλ€.
(μ¬κΈ°μ μΆ©λμ΄λ μλ‘ λ€λ₯Έ ν€λ€μ΄ λμΌν ν΄μ κ°μ κ°μ§λ κ²½μ°λ₯Ό λ§νλ€.)
κ·Έλμ ν΄μ ν μ΄λΈμ μ νν λ κ°μ§ λ°©λ²μ μκ±°νμ¬ μΆ©λμ ν΄κ²°νλ€.
1. νμ μ£Όμ λ°©μ
κ°μ₯ λνμ μΈ λ°©λ²μΌλ‘ 체μ΄λ λ°©λ²μ΄ μλ€.
κ°λ¨νκ² λ§ν΄ κ°μ μΈλ±μ€λ₯Ό κ°μ§λ ν€λ€μ λν΄ μλ‘ μ°κ²°μ μμΌμ€λ€.
λ§μΉ μ¬μ¬λ‘ μ°κ²°νλ―μ΄ κ°μ ν€λ€μ λν μνΈλ¦¬λ€μ μ΄μ΄μ£Όλ κ²μ΄λ€.
2. κ°λ°© μ£Όμλ²(open Adressing)
κ°λ°© μ£Όμ λ°©μμ ν΄μ ν μ΄λΈ μ 체λ₯Ό μ΄λ¦° 곡κ°μΌλ‘ κ°μ νκ³ , μΆ©λλ ν€λ₯Ό μΌμ ν λ°©μμ λ°λΌ μ°ΎμλΈ empty μμμ μ μ₯νλ€.
μ¦, λΉμ΄μλ κ³³μ ν€λ₯Ό μ μ₯νκ² λ€ μ΄λ§μΈλ°, λΉμ΄μλ κ³³μ μ°Ύμλ΄λ λ°©μμ λ°λΌ λ°©λ²μ΄ λ λλλ€.
μ ν μ‘°μ¬(Linear Probing)
μΆ©λμ΄ μΌμ΄λ μμλ‘λΆν° μμ°¨μ μΌλ‘ κ²μνμ¬ λΉ κ³΅κ°μ μ²μμΌλ‘ λ°κ²¬ν λ, ν€ κ°μ μ μ₯νλ λ°©λ²μ΄λ€.
μλ₯Ό λ€μ΄ keyλ₯Ό ν΄μ±ν ν΄μ κ°μ΄ iλΌλ©΄, a[i], a[i+1], ... a[i+j] μ°¨λ‘λ‘ κ²μνμ¬ μ²μμΌλ‘ λΉ κ°μ μ μ₯νλ€.
μ ν μ‘°μ¬λ μμ°¨ νμμ ν΅ν΄ μΆ©λλ ν€λ₯Ό μ°Ύμ μ μ₯νκΈ° λλ¬Έμ ν€λ€μ΄ λΉνμμ΄ λμ³μ§λ νμμ΄ λ°μνκΈ° μ½λ€. μ΄λ¬ν νμμ κ΅°μ§νλΌκ³ νλλ°, κ΅°μ§νλ νμ, μ½μ , μμ μ°μ° μ κ΅°μ§λ ν€λ€μ μμ°¨μ μΌλ‘ λ°©λ¬Έν΄μΌ νλ€λ λ¬Έμ μ μ΄ μλ€.
μ΄μ°¨ μ‘°μ¬(Quadratic Probing)
μ ν μ‘°μ¬μ κ·Όλ³Έμ μΌλ‘ λμΌν μΆ©λ ν΄κ²° λ°©λ²μ΄λ, λΉ κ³΅κ°μ μ°Ύλ λ°©λ²μμ μ°¨μ΄μ μ 보μΈλ€.
μΆ©λ ν, λ°°μ΄ aμμ (h(key) + j^2) % M, j=0, 1, 2, 3...μ κ°μ΄ μλνλλ°
μ½κ² λ§ν΄ μ ν μ‘°μ¬λ νλμ© λμ΄λλ©° κ²μνλ€λ©΄, μ΄μ°¨ μ‘°μ¬λ μ κ³± λ¨μλ‘ κ²μμ μ€μνλ€.
μλ₯Ό λ€μ΄ μ μΌ μ²μμλ μΆ©λ λ€μ μ§μ (1)μ κ²μ¬νκ³ , κ·Έ μ΄νμλ 4λ§νΌ λ¨μ΄μ§ μ§μ , μ΄νμλ 9λ§νΌ...
μ¦, μ΄μ°¨ μ‘°μ¬λ 1μ°¨ κ΅°μ§ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ±μ₯ν κ²μ΄λ€.(λμ λμ μ°Ύμ μ μ₯νλκΉ..!)
νμ§λ§ μ΄μ°¨ μ‘°μ¬μλ μΉλͺ μ μΈ λ¨μ μ΄ μ‘΄μ¬νλλ°, λ°λ‘ μ€ν¨ν κ°λ₯μ±μ΄ μλ€λ κ²μ΄λ€.
μ κ³± λ¨μλ‘ κ²μνλ―λ‘ λΉμ리λ₯Ό μ°ΎμλΌ κ°λ₯μ±μ΄ μ€μ΄λ€κΈ° λλ¬Έμ΄λ€.
λΏλ§ μλλΌ κ°μ ν΄μ κ°μ κ°μ§λ λμμ΄μ κ²½μ° λλ€λ₯Έ ννμ κ΅°μ§νμΈ 2μ°¨ κ΅°μ§ν νμλ λ°μν μ μλ€.
(λμμ΄ λΌλ¦¬ λͺ¨μ΄λ νμ)
μ΄μ€ ν΄μ±(Double Hashing)
μ΄μ€ ν΄μ±μ 2κ°μ ν΄μ ν¨μλ₯Ό μ¬μ©νλ λ°©λ²μ΄λ€.
μ¦, h(key)λ₯Ό ν΅ν΄ ν€λ₯Ό ν΄μ ν μ΄λΈμ μΈλ±μ€λ‘ λ³ννκ³ λ§μ½ μΆ©λμ΄ λ°μνλ€λ©΄ λ€μ μμΉλ₯Ό μν μ ν ν¬κΈ°λ₯Ό μ νκΈ° μν΄ d(key)λΌλ μλ‘μ΄ ν΄μ ν¨μλ₯Ό μ μ©μν¨λ€.
μ΄λ κ² νλ€λ©΄ λμμ΄λ€μ΄ μ λ§λ€ μ 2μ ν΄μ ν¨μλ₯Ό κ°κΈ° λλ¬Έμ μ ν μνμ€κ° μΌμ νμ§ μκ² λκ³ , λͺ¨λ μ’ λ₯μ κ΅°μ§νλ₯Ό ν΄κ²°ν μ μλ€.
- μ 2μ ν¨μ d(key)λ μ ν ν¬κΈ°λ₯Ό μ νλ ν¨μμ΄λ―λ‘ 0μ λ°ννλ©΄ μλλ€.
- d(key)μ κ°κ³Ό ν΄μ ν μ΄λΈμ ν¬κΈ° Mκ³Ό μλ‘μ κ΄κ³μΌ λ, μ’μ μ±λ₯μ 보μΈλ€.(Mμ μμλ‘ μ ν μ 쑰건 λ§μ‘±)
μ¬ν΄μμ λμ ν΄μ±
μ΄λ ν κ²½μ°λΌλ ν΄μ ν μ΄λΈμ΄ λΉμ΄μλ λΆλΆμ΄ κ±°μ μλ€λ©΄, μ±λ₯μ μ νλ μ λ°μ μλ€.
κ°μ μ μ₯νλ €λ©΄, λΉ μ리λ₯Ό μ°ΎμμΌ νλλ° μ μ΄μ ν μ΄λΈμ λΉμλ¦¬κ° μκΈ° λλ¬Έμ΄λ€.
μ΄λ¬ν μν©μμ, μ¬ν΄μ(Rehash)λΌλ ν΄μ ν μ΄λΈμ νμ₯μν€κ³ μλ‘μ΄ ν΄μ ν¨μλ₯Ό μ¬μ©νμ¬ λͺ¨λ ν€λ₯Ό μ ν΄μ ν μ΄λΈμ λ€μ μ μ₯νλ ν¨μλ₯Ό μ¬μ©ν μ μλ€.
μ΄λ μ€νλΌμΈμμ μνλλ©° λͺ¨λ ν€λ₯Ό λ€μ μ μ₯ν΄μΌ νλ―λ‘ O(n)μ μκ°μ΄ μμλλ€.
μ¬ν΄μλ κ·Έλ¬λ©΄ μΈμ μνλλ κ²μΌκΉ?
ν€μ μλ₯Ό ν μ΄λΈ ν¬κΈ°λ‘ λλ κ²μ μ μ¬μ¨μ΄λΌκ³ νλλ°, μ¬ν΄μμ μν μ¬λΆλ μ΄ μ μ¬μ¨μ μν΄ κ²°μ λλ€.
μ΄ μ μ¬μ¨μ΄ 0.75λ³΄λ€ ν¬λ€λ©΄(μ΄κ³Ό) ν΄μ ν μ΄λΈμ 2λ°°λ‘ νμ₯νκ³ ,
μ μ¬μ¨μ΄ 0.25λ³΄λ€ μλ€λ©΄(λ―Έλ§) ν΄μ ν μ΄λΈμ 1/2λ°°λ‘ μΆμνλ κ²μ΄ μΌλ°μ μ΄λ€.
λμ ν΄μ±(Dynamic Hashing)
μ μ¬ν΄μ±μ μννμ§ μκ³ , λ§μΉ cμΈμ΄μ malloc μ²λΌ λμ μΌλ‘ ν΄μ ν μ΄λΈμ ν¬κΈ°λ₯Ό μ‘°μ νλ λ°©λ²μ΄λ€.
μ΄λ μ£Όλ‘ λμ©λμ λ°μ΄ν°λ² μ΄μ€λ₯Ό μν ν΄μ λ°©λ²μ΄λ€.
μ£Ό κΈ°λ²μ νμ₯ ν΄μ±κ³Ό μ ν ν΄μ±μ΄ μλ€.
π€ ν΄μ±μ λ λ€λ₯Έ λ§λ‘?
ν΄μ±μ νμ ν€μ μ°μ μ μΈ μ°μ°μΌλ‘ λ²ν·μ μ£Όμλ₯Ό κ³μ°νλ κ²μ λ§νλ€.
μ¦, ν΄μ ν¨μκ° νμ ν€ μ§ν©μ μ΄λ€ λ²ν·μ μ μ₯λ μ§ μλ €μ€λ€.
(λ²ν· : λ°μ΄ν°λ₯Ό μ μ₯νλ κ³³μ λ¨μ)
1. νμ₯ ν΄μ±
νμ₯ ν΄μ±μ λλ ν°λ¦¬λ₯Ό ν΅ν΄ λ²ν·μ μ κ·Όνλ€.
μλ κ·Έλ¦Όμ 보면 μ μ μλ―μ΄, λͺ¨μ‘°ν€μ λΆν©νλ νμ ν€λ€λΌλ¦¬ λͺ¨μλ κ³³μ λ²ν·μ΄λΌκ³ νλ λ―νλ€.
(λͺ¨μ‘°ν€ : νμ ν€ κ°μ ν΄μ ν¨μλ‘ μΌμ κΈΈμ΄μ λΉνΈ μ€νΈλ§μΌλ‘ λ³νν ν€)
μ΄λ¬ν νμ₯μ± ν΄μ±μ λΆν μ μ€λ²νλ‘μ°κ° λμ¨λ€λ©΄ λλ ν°λ¦¬λ₯Ό λΆν ν΄ μ€ μ μλ€.
μ¦, μλ‘μ΄ κ°μ΄ μ½μ λμ΄ λ²ν·μ΄ κ°λ μ°¨λ©΄ λ²ν·μ νλ λ μμ±νμ¬ κΈ°μ‘΄μ λ²ν· λ΄λΆ κ°μ λλκ³ , λλ ν°λ¦¬λ₯Ό νμ₯νλ€.
2. μ ν ν΄μ±
μ ν ν΄μ±μ λλ ν°λ¦¬ μμ΄ μ½μ ν λ, λ²ν·μ μμλλ‘ μΆκ°ν΄μ£Όλ κ²μ μλ―Ένλ€.
μ΄λ μμ°¨μ μΌλ‘ λ²ν·μ΄ μΆκ°λλ©°, μ½μ λλ λ²ν·μ μ μ₯ 곡κ°μ΄ μμΌλ©΄ overflow 체μΈμ μ ν€λ₯Ό μμλ‘ μ½μ νκ³ ,
체μΈμ λμ€μ λ²ν·μ΄ μΆκ°λλ©΄ overflow 체μΈμ ν€λ€μ λ²ν·μΌλ‘ μ΄λμν¨λ€.
ν΄μ λ°©λ²μ μ±λ₯ λΉκ΅
ν΄μ λ°©λ²μ μ±λ₯μ νμμ΄λ μ½μ μ°μ°μ μνν λ, μ±κ³΅κ³Ό μ€ν¨ν κ²½μ°λ₯Ό κ°κ° λΆμνμ¬ μΈ‘μ νλ€.
μ ν μ‘°μ¬λ μ μ¬μ¨μ΄ λ무 μλ€λ©΄, ν΄μ ν μ΄λΈμ λΉ μλ¦¬κ° λ무 λ§κ³ , μ μ¬μ¨μ΄ λ무 ν¬λ€λ©΄ κ΅°μ§νκ° μ¬νλλ€λ λ¬Έμ κ° μλ€.
κ°λ°© μ£Όμ λ°©μμ ν΄μ±μ μ μ¬μ¨μ΄ 0.5 μΈμ 리, Mμ 2nμΈ κ²½μ°μ O(1) μκ°μ΄λ€.
체μ΄λμ μ μ¬μ¨μ΄ λ무 μλ€λ©΄, λλΆλΆμ μ°κ²° 리μ€νΈλ€μ΄ λΉ μλ¦¬κ° λκ³ , μ μ¬μ¨μ΄ λ무 ν¬λ€λ©΄ μ°κ²° 리μ€νΈλ€μ κΈΈμ΄κ° λ무 κΈΈμ΄μ Έ ν΄μμ μ±λ₯μ΄ λ§€μ° μ νλλ€.
μΌλ°μ μΌλ‘ Mμ΄ μμμ΄κ³ , μ μ¬μ¨μ΄ 10μ λμ΄λ©΄ O(1)μ μ±λ₯μ 보μΈλ€.
java.util.Map μΈν°νμ΄μ€
java.util.HashMapμ΄ java.util.Map μΈν°νμ΄μ€λ₯Ό ꡬννλ€.
λν΄νΈ μ΄κΈ° μ©λμ 101μ΄λ©°, μ΅λ μ μ¬μ¨μ΄ 0.75μΈ νμ μ£Όμλ²μ μ¬μ©νλ€.
References