λ€μ΄κ°κΈ°μ μμ ν΄μκ° μ΄λμ μ°μ΄λμ§ μμ보λλ‘ νκ² μ΅λλ€.
μ νλΈλ₯Ό μμλ‘ μκ°ν΄ 보λλ‘ νκ² μ΅λλ€.
μ κ° μ΄λ€ μ¬λμ λμμμ κ·Έλλ‘ μ μ±λμ μ¬λ¦¬λ €κ³ νλ€λ©΄, κ·Έ μκ° λ°λ‘ μ νλΈμμ μ€λ³΅λλ λμμμ΄λΌλ μλ¬ λ©μΈμ§λ₯Ό 보λ΄μ€λλ€.
λμμμ ν¬κΈ°λ λ§€μ° ν¬κ³ , κ·Έ μλ λ§€μ° λ§μ΅λλ€.
κ·Έλ κ² λ§μ λμμ μ€μμ μ΄λ»κ² μ€λ³΅λλ λμμμΈμ§λ₯Ό λΉ λ₯΄κ² νλ¨ν μ μμκΉμ?
μμΌλ‘ μ΄ν΄λ³Ό μλ£κ΅¬μ‘°μΈ ν΄μν μ΄λΈμ΄ λ°λ‘ μ΄κ²μ κ°λ₯νκ² λ§λ€μ΄μ€λλ€.
Hash Function (ν΄μ ν¨μ)
ν΄μ ν¨μ (Hash Function) λλ ν΄μ μκ³ λ¦¬μ¦μ μμμ λ°μ΄ν°λ₯Ό λ°°μ΄μ μΈλ±μ€λ‘ 맀ν(λ³ν)νλ ν¨μμ λλ€.
ν΄μ ν μ΄λΈμ λ°°μ΄μ λλ€.
λ°λΌμ μΈλ±μ€λ₯Ό ν΅ν΄ μ κ·Όν λμλ O(1)μ μκ°λ³΅μ‘λλ‘ λ§€μ° λΉ λ₯΄κ² μ κ·Όν μ μμ΅λλ€.
μ μκ° μλ μμμ λ°μ΄ν°λ₯Ό μ μλ‘ λ§λλ ν¨μ
μμμ λ°μ΄ν°λ₯Ό Hash Code(μ μκ°)μΌλ‘ λ°κΎΈλ ν¨μλ₯Ό μλ―Έν©λλ€.
μ΄λ ν λ°μ΄ν°μ λνμ¬ ν΄λΉ λ°μ΄ν°κ° μ‘°κΈμ΄λΌλ λ³νν κ²½μ° ν΄λΉ λ°μ΄ν°μ ν΄μμ½λλ λ§€μ° ν¬κ² λ¬λΌμ§λλ€.
μ΄λ¬ν νμμ λμ¬ν ν¨κ³Ό(Avalanche effect)λΌκ³ λΆλ¦ λλ€.
λ°μ΄ν°κ° κ°λ³ κΈΈμ΄ νΉμ λ§€μ° κΈ΄ λ¬Έμμ΄μΈ κ²½μ°
μ΄λ¬ν κ²½μ° λλΆλΆ 볡μ‘ν μ’ μκ΄κ³λ‘ μΈν΄ μ΄λ₯Ό κ·Έλλ‘ μ μλ‘ λ³νν κ²½μ° λΆν¬κ° κ· μΌν΄μ§μ§ μμ΅λλ€.
μ΄λ¬ν λ°μ΄ν°μ κ²½μ° λ¬Έμμ΄μ λͺ¨λ λ¬Έμμ μμ‘΄νκ³ κ° λ¬Έμμ λ€λ₯Έ λ°©μμΌλ‘ μμ‘΄νλ ν΄μ ν¨μλ₯Ό μ¬μ©νλ κ²μ΄ νλͺ ν©λλ€
λνμ μΈ λ°©λ²μΌλ‘λ κ° λ¬Έμμ΄μ μ€λ²νλ‘λ₯Ό 무μνκ³ λ€μ λ¬Έμλ₯Ό μΆκ°νκΈ° μ μ ν΄μ ν©κ³μ μμ(μΌλ°μ μΌλ‘ μλΉν μμ)λ₯Ό κ³±νλ κ²μ λλ€.
μλ°μμλ λ€μκ³Ό κ°μ΄ μ¬μ©ν©λλ€.
31μ μ¬μ©νλ μ΄μ λ μμμ΄λ©΄μ νμμ΄κΈ° λλ¬Έμ λλ€.
νμκ° μ νλλ μ΄μ λ μ§μλ₯Ό κ³±νλ κ²½μ° μ΄μ§μμ΄λ―λ‘ λΉνΈκ° μ¬ννΈλμ΄ κΈ°μ‘΄ ν΄μκ°μ μ λ³΄κ° μ¬λΌμ§ μ μκΈ° λλ¬Έμ
λλ€.
κ·Έλ¬λ κΌ μμμΌ νμλ μμ΅λλ€.
ν©μ±μλ‘ μ¬μ©νλ μ¬λ‘λ μλ€κ³ ν©λλ€λ§, κ·Έμ κ΄νμ μΌλ‘ 31μ μ¬μ©νλ€ λ³΄μλ©΄ λ κ² κ°μ΅λλ€.
ν΄λΉ ν¨μμ μ΅μ’ κ³Όμ μ λλ¨Έμ§ μ°μ° νΉμ μ΄ν λ°°μΈ middle of square λ±μ μ μκ°μ ν΄μν μ΄λΈ ν¬κΈ°μ μΈλ±μ€λ‘ 맀ννλ ν¨μκ° λ κ²μ λλ€
μ μκ°μ λ°°μ΄μ μΈλ±μ€λ‘ 맀ννλ ν¨μ
λ°μ΄ν°μ Hash Codeλ₯Ό λ°°μ΄μ μΈλ±μ€ (0 μ΄μμ μ μ)λ‘ λ³νν΄μ£Όλ ν¨μμ λλ€.
λ³΄ν΅ λλ¨Έμ§ μ°μ°μ μ¬μ©νλ©°, μ΄λ λλλ κ°μ 20 μ΄μμ μμμ κ³±μ΄ κΆμ₯λλ€κ³ μλ €μ Έ μμ΅λλ€.
hash = key.hashcode()
index = hash % hashTable.length;
μμ λ ν¨μμ μ‘°ν©μ λ³΄ν΅ ν΄μ ν¨μλΌ λΆλ¦ λλ€.
μ¦ λ€μκ³Ό κ³Όμ μ κ±°μ³ μμμ λ°μ΄ν°λ μΈλ±μ€λ‘ 맀νλ©λλ€.
key -> (function 1) -> hashcode(integer) -> (function 2) -> index in hashtable
(μΌλ° μ μμ κ²½μ° κ·Έ μμ²΄λ‘ μΈλ±μ€κ° λ μλ μμΌλ―λ‘, ν΄λΉ κ²½μ°μλ μ μκ°μ μΈλ±μ€λ‘ 맀νν΄μ£Όλ ν¨μλ§ μ¬μ©λ μλ μμ΅λλ€.)
Hash Table
(μλ°μ μ‘΄μ¬νλ Hash Table ν΄λμ€κ° μλλλ€)
ν΄μ ν μ΄λΈμ μλ κ·Έλ¦Όκ³Ό κ°μ΄ μ¬λ¬ Bucket(λ²ν·)μ κ°μ§κ³ μμΌλ©°, μ€μ keyμ ν΄μν¨μκ° μ μ©λμ΄ λ°νλ μΈλ±μ€λ₯Ό ν΅ν΄ λ²ν·μ μ μ₯νκ³ , μ‘°ννλ λ±μ μ°μ°μ μνν μ μμ΅λλ€.
μ΄λ¬ν λ²ν·λ€μ λ°°μ΄μ ννλ‘ μ‘΄μ¬νλ―λ‘ μΆκ°, μμ , μ‘°νλ±μ μ°μ°μ΄ O(1)μ μκ°λ³΅μ‘λλ‘ κ°λ₯ν΄μ§λλ€.
Hash Tableμ μ¬μ€ λ€μκ³Ό κ°μ΄ νλμ Bucketμμ μ¬λ¬ Slotμ΄ μ‘΄μ¬ν μλ μμ΅λλ€.
κ·Έλ¬λ λλΆλΆμ κ²½μ°, Slotμ ν¬κΈ°λ 1μ λλ€. μ¦ Slotμ΄ μλ€κ³ λ΄λ 무방ν©λλ€.
Identifier Density & Loading Factor (μλ³μ λ°λ & λΆνμ¨)
Tμ nμ μ μνκ² μ΅λλ€.
T : μ΄λ ν νλ‘κ·Έλ¨μμ κ°λ₯ν λͺ¨λ μλ³μ(identifier)μ κ°μ
n : μ€μ μ¬μ©νλ μλ³μμ κ°μ
Identifier Density
$$\frac{n}{T}$$
λλΆλΆμ κ²½μ° Identifier Densityλ λ§€μ° μμ μμ΄λ―λ‘, κ³ λ €νμ§ μμλ λ©λλ€.
Load Factor
(sμ bλ κ°κ° Hash Tableμ slotκ³Ό bucketμ μλ‘, λλΆλΆμ κ²½μ° s = 1 μ λλ€.)
$$\frac{n}{sb}$$
μμ
λ²ν·μ μκ° 26κ°, slotμ κ°μκ° 2κ°μΈ Hash Tableμ μκ°ν΄ λ³΄κ² μ΅λλ€.(nμ 10μ΄λΌ κ°μ νκ² μ΅λλ€)
ν΄λΉ ν΄μ ν μ΄λΈμ μ¬μ©νλ νλ‘κ·Έλ¨μ μλ³μλ₯Ό λ§λ€ λ 3κ°μ μμ΄ λλ¬Έμ νΉμ μ«μλ₯Ό μ¬μ©ν΄μλ§ λ§λ€ μ μμΌλ©°, μ΄λ λ§λμ 맨 μκΈμλ μμ΄ λλ¬Έμκ° μμΌ νλ€κ³ κ°μ νκ² μ΅λλ€.
μ΄λ ν΄λΉ νλ‘κ·Έλ¨μμ κ°λ₯ν λͺ¨λ μλ³μμ κ°μλ λ€μκ³Ό κ°μ΅λλ€.
$$T = 26 + 26 \cdot (26+ 10) + 26 \cdot (26+ 10) \cdot (26+ 10) = 34658$$
μ΄ κ²½μ° Identifier Densityλ λ€μκ³Ό κ°μ΅λλ€.
$$\frac{n}{T} = \frac{10}{34658} = 0.00003$$
Load Factorλ λ€μκ³Ό κ°μ΅λλ€.
$$\frac{n}{sb} = \frac{10}{2\cdot 26} = 0.19$$
Collision (μΆ©λ)
μλ‘ λ€λ₯Έ μλ³μμ ν΄μ ν¨μλ₯Ό μ μ©νμμ λ, λμΌν κ°μ΄ λμ€λ κ²½μ°, μ¦
λμΌν λ²ν·μ 맀νλλ κ²½μ° μΆ©λ(Collision)μ΄ λ°μνλ€κ³ ν©λλ€.
$$I_1 \neq I_2 \;\; but\;\; f(I_1) = f(I_2)$$
νλ‘κ·Έλ¨μμ μ¬μ© κ°λ₯ν μλ³μμ μλ μ μ μμ μ λλ‘ λ§μ΅λλ€.
μλ₯Ό λ€μ΄ μλ°μ κ²½μ°λ§ ν΄λ λ³μλ₯Ό μμ±ν λ, κ°λ₯ν κ°μ§μκ° κ΅μ₯ν λ§λ€λ κ²μ μμ€κ²λλ€.
μ΄λ¬ν λͺ¨λ μλ³μλ€μ ν΄μ ν μ΄λΈμ λ€λ₯Έ λ²ν·μ λ£κΈ° μν΄μλ μλ³μλ€μ μλ§νΌμ 곡κ°μ΄ ν΄μ ν μ΄λΈμ μ‘΄μ¬ν΄μΌ ν©λλ€.
κ·Έλ¬λ μ΄λ λ무 λ§μ λ©λͺ¨λ¦¬λ₯Ό μ°¨μ§νλ©°, μ¬μ€μ ν λΉ μ체λ μλ κ²μ λλ€.
κ²°κ΅ μλ³μλ€μ μλ³΄λ€ ν΄μ ν μ΄λΈμ λ²ν·μ μκ° μ κΈ° λλ¬Έμ, μλ‘ λ€λ₯Έ μ΄λ ν μλ³μλ€μ ν΄μ ν μ΄λΈμ λμΌν λ²ν·μ μ μ₯λ μλ°μ μμ΅λλ€. (λΉλκΈ°μ§ μ리)
λκ°μ μλ³μ $I_1$ , $I_2$ μ λνμ¬ κ°κ°μ ν΄μν¨μ(hash function) fλ₯Ό μ μ©ν κ²°κ³Όκ° λμΌν κ²½μ°, μ¦ λ€μκ³Ό κ°μ λ
$$f(I_1) = f(I_2)$$
$I_1$ κ³Ό $I_2$ λ fμ λν Sysnonyms(λμμ΄)λΌκ³ λΆλ¦ λλ€.
Overflow (μ€λ²νλ‘)
μ΄λ ν μλ³μμ ν΄μν¨μλ₯Ό μ μ©νμ¬ λ§€νλ λ²ν·μ΄ μ΄λ―Έ κ°λ μ°¨ μλ κ²½μ°, Overflowκ° λ°μνλ€κ³ ν©λλ€.
Overflowμ Collisionμ μ°¨μ΄
Collisionμ ν΄μ ν¨μμ κ²°κ³Όκ° λμΌν κ°μΈ κ²½μ°, μ¦ λμΌν λ²ν·μ 맀νλ μν©μ μλ―Ένλ©°,
Overflowλ Collisionμ΄ λ°μνμμ λ, ν΄λΉ λ²ν·μ΄ μ΄λ―Έ κ°λ μ°¨ μ μ₯μ΄ λΆκ°λ₯ν μν©μ μλ―Έν©λλ€.
μ¦ Overflowκ° λ°μνμλ€λ©΄ Collision μμ λ°μν κ²μ΄μ§λ§,
Collisionμ΄ λ°μνμλ€κ³ ν΄μ Overflowκ° λ°μν κ²μ μλλλ€.
Perfect Hash Function (μμ ν΄μ ν¨μ)
μλ‘ λ€λ₯Έ λͺ¨λ μλ³μλ€μ
μλ‘ λ€λ₯Έ λ²ν·μΌλ‘ λμμν€λ ν΄μ ν¨μλ₯Ό Perfect Hash Functionμ΄λΌκ³ ν©λλ€.
μ΄λ₯Ό κ°λ₯νκ² νκΈ° μν΄μλ ν΄μ¬ν¨μλ₯Ό μ μνκΈ° μ μ μ μλ μλ³μλ€μ μ§ν©μ μκ³ μμ΄μΌ ν©λλ€.
κ·Έλ¬λ μ΄λ λ§€μ° ν° μ μ₯곡κ°μ νμλ‘ νλ©°, λ©λͺ¨λ¦¬ λλΉκ° μ¬νκΈ° λλ¬Έμ, κ±°μ μ¬μ©νμ§ μμ΅λλ€.
μμΌλ‘λ μμ ν΄μ ν¨μλ₯Ό κ³ λ €νμ§ μμ 체, μ€λͺ μ μ΄μ΄κ°λλ‘ νκ² μ΅λλ€.
μ’μ ν΄μ ν¨μμ λν΄μ
Collisionμ μ΅μννκΈ° μν΄
ν΄μ ν μ΄λΈμμ μλ³μλ€μ΄ κ· λ±ν λΆν¬(Uniformly distributed) λ₯Ό κ°λλ‘ νλ©°
κ³μ°νκΈ° μ¬μμΌ ν©λλ€.
μμμ μ΄ν΄λ³΄μλ―μ΄ ν΄μ ν¨μλ κ²°κ΅ λ€λ1(Many-to-One) 맀νμ΄λ©°,
λ°λΌμ λΉλκΈ°μ§ μ리μ μν΄ Collisionμ λ°λμ λ°μν μλ°μ μμ΅λλ€.
μ΄λ λ°μνλ Collisionμ μλ₯Ό μ΅λν μ€μ΄λ κ²μ΄ νμν©λλ€.
Collisionμ μ΅μννκΈ° μν΄μλ μλ³μλ€μ ν΄μ ν μ΄λΈμμ κ· λ±νκ² λΆν¬(Uniformly distributed)μμΌμΌ ν©λλ€.
Uniform Hash Function (κ· λ± ν΄μ ν¨μ)
μ μκ°(νΉμ μ΄μ§μ)μ ν΄μν μ΄λΈμ μΈλ±μ€μ 맀νν΄ μ£Όλ ν¨μμ΄λ©° λ€μμ λ§μ‘±μμΌμΌ ν©λλ€.
ν΄μ ν μ΄λΈμ λ²ν·μ μ bμ, ν΄μ ν¨μ fμ λνμ¬
λ§μ½ xκ° μμλ‘ μ νλ μλ³μλΌλ©΄, ν΄λΉ μλ³μμ fλ₯Ό μ μ©νμ¬ μμμ μΈλ±μ€ iκ° λμ¬ νλ₯ μ $\frac{1}{b}$ μ¬μΌ ν©λλ€.
$$P(f(x) = i) = \frac{1}{b}$$
Uniform Hash Functionμ μ¬λ¬ μ’ λ₯κ° μμΌλ©°, κ·Έμ€ 3κ°μ§ ν¨μμ λν΄μ μμ보λλ‘ νκ² μ΅λλ€.
- Division
- Middle of Square
- Folding
Division
λ²ν·μ ν¬κΈ° bλ₯Ό Mμ΄λΌ μ μνκ² μ΅λλ€.
Division λ°©μμ Hash Functionμ λ€μκ³Ό κ°μ΅λλ€.
f(X) : X modulo M
(moduloλ λλ¨Έμ§ μ°μ°μ μλ―Έν©λλ€.)
(Xλ μμ΄μλ μ μμ λλ€.)
ν΄λΉ λ°©μμμ Mμ μ ννλ κ²μ΄ λ§€μ° μ€μν©λλ€.
κ²°λ‘ λΆν° λ§νλ©΄ λ€μμ΄ κΆμ₯λ©λλ€.
20 μ΄μμ μμ(prime number)λ€μ κ³±μ μ ννλ κ²μΌλ‘ μΆ©λΆν©λλ€.
λ§μ½ Mμ 2μ kμ κ³±μΌλ‘ μ ν κ²½μ°, ν΄μν¨μμ κ²°κ³Όλ Xμ μ€λ₯Έμͺ½ kλΉνΈλ₯Ό μ¬λΌμ§κ² λ§λλλ€.
κ·Έ κ²°κ³Ό ν΄μ ν¨μλ Xμ λͺ¨λ κ°μ λ°μνμ§ λͺ»νλ©°, μ΄λ ν΄μκ°μ κ· λ±νκ² λΆν¬νμ§ λͺ»ν©λλ€.
λλΆλΆμ κ²½μ° Division λ°©μμ΄ κ°μ₯ μ¬μ°λ©°, κΆμ₯λλ λ°©μμ λλ€.
Middle of Square
λ²ν·μ ν¬κΈ° bλ₯Ό λ€μκ³Ό κ°μ΄ μ μν©λλ€.
$$b = 2^{r}$$
Middle of Square λ°©μμ Hash Functionμ λ€μκ³Ό κ°μ΅λλ€.
f(X) : X(μ΄μ§μ)λ₯Ό μ κ³±ν κ°μμ κ°μ΄λ° rλΉνΈλ₯Ό μ·¨ν κ°
λ²ν·μ ν¬κΈ°λ₯Ό 2μ μ κ³±μλ‘ μ ν΄μ€ μ΄μ λ λ€μκ³Ό κ°μ΅λλ€.
nλΉνΈ μ΄μ§μλ‘ ννν μ μλ κ°μ λ²μ(μμ λΆνΈ X)
$$0 \sim 2^{n} - 1$$
λ°λΌμ Middle of Square λ°©μμΌλ‘ ν΄μκ°μ μμ±νλ©΄ κ·Έ κ°μ λ²μλ λ€μκ³Ό κ°μ΅λλ€.
$$0 \leq f(X) \leq 2^{r}-1$$
$X^2$ μ κ°μ΄λ° λΉνΈλ€μ Xλ₯Ό νννλ λͺ¨λ μ΄μ§μλ₯Ό λ°μνκ² λλ―λ‘ Middle of Square λ°©μμΌλ‘ μμ±λ μΈλ±μ€λ κ· λ±ν κ°μ κ°μ§ μ μμ΅λλ€.
Folding
Xλ₯Ό νΉμ ν κΈΈμ΄λ‘ μͺΌκ°λλ€.
μ΄ν ν΄λΉ μͺΌκ° κ°κ°μ λΆλΆμ λͺ¨λ λν©λλ€.
Foldingμ Shift Foldingκ³Ό Folding at boundaryμ λ κ°μ§ λ°©λ²μ΄ μμ΅λλ€.
κ°κ°μ μμλ λ€μκ³Ό κ°μ΅λλ€.
X = 12320324111220 μ΄λΌκ³ νκ² μ΅λλ€.
3μλ¦¬μ© λμ΄μ λνκ² μ΅λλ€. μ¦
$$X_1 = 123, \;\; X_2 = 203\;\; X_3 = 241\;\; X_4 = 112\;\; X_5 = 20$$
Shift Folding
λ¨μν λνλ©΄ λ©λλ€.
$$f(X) = 123 + 203 + 241 + 112 + 20 = 669$$
Folding at Boundary
μ’ μ΄λ₯Ό μ λ λλμΌλ‘ νλ²μ κ·Έλλ‘, νλ²μ μμΌλ‘ λνλ κ²μ λ°λ³΅ν©λλ€.
f(X) = 123 + 302 + 241 + 211 + 20 = 897
μ§κΈκΉμ§λ Collisionμ λ°μμ μ΅μνλ λ°©λ²μ μ΄ν΄λ³΄μμ΅λλ€.
κ·Έλ¬λ κ²°κ΅ μμ ν΄μ ν¨μλ₯Ό λ§λ€μ§ μλ μ΄μ Collisionμ λ°μν κ²μ΄κ³ , λ°λΌμ Overflowλ λ°μν κ²μ λλ€.
μ΄μ λΆν°λ Overflowκ° λ°μνμ λ μ΄λ₯Ό μ΄λ»κ² ν΄κ²°νλμ§ νμΈν΄ 보λλ‘ νκ² μ΅λλ€.
Overflow Handling
Overflowλ₯Ό ν΄κ²°νλ λ°©λ²μ ν¬κ² λ μ’ λ₯λ‘ κ΅¬λΆλ©λλ€.
- Close Hashing (Internal Hashing) (Open addressing)
- Open Hashing (External Hashing) (Closed addressing)
Close Hashing (Open addressing) (νμ ν΄μ± νΉμ κ°λ°© μ£Όμλ²)
μ£Όμ΄μ§ ν΄μ ν μ΄λΈ λ΄μ λ©λͺ¨λ¦¬ κ³΅κ° μμμ Overflowλ₯Ό ν΄κ²°νλ λ°©λ²μ μλ―Έν©λλ€.
μ¦ ν μ΄λΈ λ΄ κ³ μ λ κ³΅κ° λ΄μμ ν΄κ²°νλ κ²μ΄λ―λ‘ κ³΅κ°μ΄ λ«νμλ€κ³ νμ¬ Close Hashingμ λλ€.
μ’ λ₯λ λ€μκ³Ό κ°μ΅λλ€.
- Linear Probing (Linear Open Addressing) (μ ν νμ¬)
- Quadratic Probing (μ κ³± νμ¬)
- Rehashing (μ¬ν΄μ±, μ΄μ€ ν΄μ±)
- Random Probing (μμ νμ¬)
- ...
Linear Probing (μ ν νμ¬)
Overflowκ° λ°μνμ λ μ΄ν μ‘΄μ¬νλ λ²ν·λ€ μ€μ λΉμ΄μλ λ²ν·μ μ νμ μΌλ‘ νμνμ¬ μ½μ νλ λ°©λ²μ λλ€.
λ§€μ° κ°λ¨νκ² Overflowλ₯Ό ν΄κ²°ν μ μμΌλ μ¬λ¬ λ¨μ μ΄ μ‘΄μ¬ν©λλ€.
λ¨Όμ λΉμ΄μλ λ²ν·μ μ°ΎκΈ° μν λΉκ΅ μ°μ°μ νμκ° λ§μμ§μλ‘, μ€λ μκ°μ΄ 걸립λλ€.
λν λ°μ΄ν°μ μμ μ°μ°μ΄ λ°μνλ€λ©΄, μ΄ν κ²μ μ λ°μ΄ν°κ° μ‘΄μ¬ν¨μλ μ΄λ₯Ό μ°Ύμ§ λͺ»νλ μν©μ΄ λ°μν©λλ€.
μμ
μλ³μλ λ°λμ 첫 κΈμκ° μμ΄ λλ¬Έμλ‘ μμνλ©°, ν΄μν¨μλ 첫κΈμμ ν΄λΉνλ μμ΄μ μμλ₯Ό λ°ννλ€ κ°μ νκ² μ΅λλ€.
μ¦ Axx -> 0, Bxx -> 1, ... , Zxx -> 25 μ λλ€.
λ€μκ³Ό κ°μ 26κ°μ λ²ν·μ κ°μ§ ν΄μν μ΄λΈμ κ°μ νκ² μ΅λλ€.
μ λ ₯μ΄(sequence)μ λ€μκ³Ό κ°μ΅λλ€.
GA -> D -> A -> G -> E -> A2 -> A1 -> A3 -> Z -> ZA
μμ κ°μ μν©μμ, A2λ₯Ό μ κ±°ν΄ λ³΄λλ‘ νκ² μ΅λλ€.
μ΄ μν©μμ A1μ μ°Ύμ μ μμκΉμ???
A1μ μ°ΎκΈ° μν΄μλ μ°μ 0λ² μμΉμ κ°μ Aμ λΉκ΅ν©λλ€. μ‘΄μ¬νμ§ μλλ€λ©΄ μ΄ν μ‘΄μ¬νλ λ²ν·μ νμν΄μΌ νλλ°, 1λ² λ²ν·μ΄ λΉμ΄μμΌλ―λ‘ μ‘΄μ¬νμ§ μλλ€κ³ νλ¨ν΄ λ²λ¦½λλ€.
μ ν μ‘°μ¬μ λΉκ΅ μ°μ°μ μ€μ΄κΈ° μν΄, Quadratic Probing, Rehashing, Random Probing λ±μ λ°©λ²μ μ¬μ©ν©λλ€.
μ΄λ ν μ’ λ₯μ λ°©λ²μ μ¬μ©νλ Close Hashingμμλ μλ³μλ₯Ό λ€λ₯Έ ν΄μκ°μ κ°μ§ μλ³μμ λΉκ΅νλ κ³Όμ μ νΌν μ μμ΅λλ€.
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ Close Hashing보λ€λ Open Hashingμ μ¬μ©ν©λλ€.
Open Hashing (Closed addressing) (κ°λ°© ν΄μ± νΉμ νμ μ£Όμλ²)
λ³λμ λ©λͺ¨λ¦¬λ₯Ό ν λΉνμ¬ νμν λ§νΌ μ¬μ©νλ λ°©λ²μ λλ€.
LinkedListμ λΉμ·νκ² μ°κ²° 체μΈμ μ¬μ©νμ¬ Overflowλ₯Ό ν΄κ²°ν©λλ€.
μ΄λ₯Ό Chaining κΈ°λ² μ΄λΌκ³ ν©λλ€.
μλ°μ HashMapμ κΈ°λ³Έ μ΅λ μ μ¬μ¨μ΄ 0.75μΈ νμμ£Όμλ²μ μ¬μ©ν©λλ€.
Static Hash
μμμ μ΄ν΄λ³΄μλ λ°©λ²λ€μ΄ λͺ¨λ Static Hash μ λλ€.
κ³ μ ν¬κΈ°μ λ°°μ΄μ μ΄μ©ν λ°©λ²μΌλ‘, ν΄μ ν μ΄λΈμ λ²ν·μ μλ₯Ό κ³ μ μμΌ μ¬μ©νλ λ°©λ²μ λλ€.
κ·Έλ¬λ μ΄λ λ°μ΄ν°μ μκ° μ¦κ°ν¨μ λ°λΌ ν¨μ¨μ΄ λ¨μ΄μ§κ² λ©λλ€.
μμ μμμμ Close Addressing λ°©λ²μ μ¬μ©νμ¬ Overflowλ₯Ό ν΄κ²°νλ κ²½μ°, κ²°κ΅ λ°μ΄ν°μ μκ° λ§μμ§λ©΄ Overflow Chainλ κΈΈμ΄μ§ κ²μ΄λ©°, μ΄λ λ°μ΄ν°μ νμμμ λ§μ μκ°μ΄ μμλ κ²μ λλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ ν΄μν μ΄λΈμ λΆνμ¨ (Load Factor)λ₯Ό 70~80% μ λλ‘ μ μ§νλ©°,
μ΄λ₯Ό μ΄κ³Όν κ²½μ° μλ‘μ΄ ν¬κΈ°μ ν΄μν μ΄λΈμ μμ±νμ¬
κΈ°μ‘΄ ν΄μν μ΄λΈμ μ‘΄μ¬νλ λͺ¨λ μμλ€μ λν΄μ μ¬ν΄μ±μ κ±°μ³ ν΄μν μ΄λΈμ μ¬κ΅¬μ±ν΄μ£Όλ μμ μ΄ νμν©λλ€.
ν΄μ ν μ΄λΈμ μ ꡬμ±νλ κ³Όμ μμ λͺ¨λ μμλ€μ λνμ¬ rehashνλ κ³Όμ μ λ§€μ° λΉν¨μ¨μ μ λλ€.
Dynamic Hashμμλ λͺ¨λ μμκ° μλ λ¨μΌ λ²ν·μ λν΄μλ§ μ¬ν΄μ±μ ν΄μ£Όλ λ°©μμΌλ‘ μλνμ¬,
Static Hashμ λΉν΄ ν¨μ¨μ μΌλ‘ λμν©λλ€.
Dynamic Hash
λ°μ΄ν°μ μ¦κ°μ λ°λΌ λ°°μ΄μ ν¬κΈ°λ₯Ό λμ μΌλ‘ λ³νμν€λ λ°©λ²μ λλ€.
μ¦ λ²ν·μ μλ₯Ό κ³ μ νμ§ μκ³ , νμν κ²½μ° λ리거λ μ€μΌ μ μμ΅λλ€.
Static Hashμ λ¬λ¦¬ λ°μ΄ν°κ° μ¦κ°νμμ λ ν΄μν μ΄λΈμ μ¬μ‘°μ νλ κ³Όμ μμ,
λͺ¨λ μμλ€μ λν΄ μ¬ν΄μ±μ νλκ²μ΄ μλ
νλ²μ Overflowμ νλμ Bucketμ μμλ€μ λν΄μλ§ μ¬μ‘°μ νμ¬ Static Hashμ λΉν΄ ν¨μ¨μ μΌλ‘ μλν©λλ€.
Dynamic Hashλ ν¬κ² Directoryλ₯Ό μ¬μ©νλ ν΄μ λ°©λ²κ³Ό
Directoryλ₯Ό μ¬μ©νμ§ μλ(Directoryless) ν΄μ λ°©λ²μΌλ‘ λλ μ μμ΅λλ€.
λνμ μΌλ‘λ λ€μκ³Ό κ°μ΅λλ€.
Directory μ¬μ© : Extendible Hashing (νμ₯ ν΄μ±)
Directory μ¬μ© X : Linear Hashing (μ ν ν΄μ±)
Dynamic Hashingμ λ°μ΄ν°λ² μ΄μ€μμ μ£Όλ‘ μ¬μ©λ©λλ€.
Dynamic Hashμμμ Hash Funtion
Hash FunctionμΈ $h(k, p)$ λ₯Ό μ μν©λλ€.
$h(k)$ : hash function
$h(k, p)$ : $h(k)$ μ κ°μμ μ΅μ°μΈ‘ pλΉνΈλ§μ μ¬μ©νλ hash function
μμ
h(k)κ° λ€μκ³Ό κ°μ λ
$h(A0, 2) : 00 = 0$
$h(A1, 2) : 01 = 1$
$h(B0, 2) : 00 = 0$
$h(C1, 4) : 0001 = 1$
$h(C1, 5) : 10001 = 17$
$h(C1, 6) : 110001 = 49$
...
Extendible Hashing (νμ₯ ν΄μ±)
Directoryλ₯Ό μ¬μ©νλ©°, Directoryμλ Bucketμ λν μ£Όμ(Pointer)κ° λ€μ΄μμ΅λλ€.
Directoryλ λ©λͺ¨λ¦¬μ μ‘΄μ¬νλ©°, Bucketμ λλΆλΆμ κ²½μ° Diskμ μ‘΄μ¬ν©λλ€.
(λ©λͺ¨λ¦¬ μ©λλ‘ μ¬μ©ν μλ μμΌλ Dynamic Hashλ λλΆλΆμ κ²½μ° λ°μ΄ν°μ κ°μκ° λ§€μ° λ§μ κ²½μ°μ μ¬μ©νλ―λ‘, memory μ©λλ‘λ μ μ¬μ©νμ§ μμ΅λλ€.)
$h(k, p)$λ₯Ό μ¬μ©ν κ²½μ°,
Directory Size : $2^p$
Directory Depth : p
λ°μ΄ν°λ₯Ό κ²μνλ λ°©λ²
$h(k, p)$ λ₯Ό μ μ©νμ¬ κ°μ μ°Ύμ΅λλ€.
(μμΌλ‘μ λͺ¨λ μμ μμ Bucketμ slotμ μλ 2κ°μ λλ€.)
B1μ μ°Ύμ보λλ‘ νκ² μ΅λλ€.
$h(B1, 2) = 01 = 1$
μ¦ d[1]μ΄ κ°λ¦¬ν€λ Bucketμ μ£Όμλ‘ μ΄λνμ¬ B1μ νμν©λλ€.
μ΄ κ²½μ° μ‘΄μ¬νλ―λ‘ μ°Ύμ μ μμ΅λλ€.
Overflowλ₯Ό ν΄κ²°νλ λ°©λ²
μ΄ μν©μμ C5λ₯Ό μΆκ°ν΄ 보λλ‘ νκ² μ΅λλ€.
$h(C5, p)$ λ₯Ό ꡬν©λλ€.
μμ κ²½μ° $h(C5, 2) = 01 = 1$ μ΄λ―λ‘ d[1]μ μΆκ°ν΄μΌ ν©λλ€.
μΆκ°νλ €κ³ d[1]μ BucketμΌλ‘ μ΄λνμλλ°, μ΄λ―Έ Bucketμ΄ κ°λ μ°¨ μλ μν©μ λλ€.
μ¦ Overflowκ° λ°μνμμ΅λλ€.
μ΄ κ²½μ° directoryμ ν¬κΈ°λ₯Ό νμ₯ν΄μΌ ν©λλ€.
νμ₯ν directoryμ ν¬κΈ°λ₯Ό κ²°μ ν΄μΌ ν©λλ€.
Overflowκ° λ°μν Bucketμ μ‘΄μ¬νλ μμλ€λ§ λμμΌλ‘ μ΄λ€μ κ΅¬λ³ κ°λ₯νκ² νλ μ΅μ λΉνΈ uλ₯Ό κ²°μ ν©λλ€.
h(A1) = 100001
h(B1) = 101001
h(C5) = 110101
μ΄ κ²½μ° uλ 3μ λλ€.
μ΄μ pλ₯Ό uλ‘ λ°κΎΈμ΄μ€λλ€.
μμ κ²½μ° pκ° 3μΌλ‘ λ°λλ―λ‘, Directory Sizeλ $2^3 =$ 8μ΄ λ©λλ€.
μΆκ°λ ν¬κΈ°λ§νΌ Directoryλ₯Ό 볡μ¬ν©λλ€.
Directoryλ₯Ό 볡μ¬ν κ²μ΄λ―λ‘ Diskμ μ‘΄μ¬νλ Bucketμ κ·Έλλ‘ μ μ§λ©λλ€.
λ³΅μ¬ μ΄ν Overflowκ° λ°μν λ²ν·μ μ¬μ‘°μ ν©λλ€.
Overflowκ° λ°μν λ²ν·μ λν΄μ μ¦κ°λ pλ₯Ό μ μ©ν $h(k, p)$ λ₯Ό ν΅ν΄ μ¬ν΄μ±μ μ§ννμ¬ μ¬λ°°μΉν©λλ€.
μμ κ²½μ°μ
$h(A1, 3) = 001 = 1$
$h(B1, 3) = 001 = 1$
$h(C5, 3) = 101 = 5$
μ λλ€.
μμ μμμμλ μ°μ°ν A1κ³Ό B1μ μμΉκ° λ°λμ§ μμμ§λ§, λ§μ½ B1μ΄ 101101 μ΄μλ€λ©΄ B1λ d[5]μ μμΉλ‘ μ΄λνμ κ²μ λλ€.
Extendible Hashing μμ½
Overflowκ° λ°μνμμ λλ λ°μν Bucketμ λν΄μλ§ rehashλ₯Ό μ§νν©λλ€.
κ²μμ κ²½μ° Disk μ κ·Όμ΄ 1νλ§ λ°μν©λλ€.
λ°μ΄ν°λ₯Ό μΆκ°νλ κ²½μ° Overflowκ° λ°μνμμ λ
1λ²μ Disk μ½κΈ°μ, 2λ²μ Disk μ°κΈ° μ κ·Όμ΄ λ°μν©λλ€.
Directoryλ₯Ό 볡μ¬νλ κ³Όμ μ Disk Accessκ° λ°μνμ§ μμ΅λλ€.
Linear Hashing (μ ν ν΄μ±)
Directoryλ₯Ό μ¬μ©νμ§ μλ Hashingμ λλ€.
μ¦ Diskμ μ‘΄μ¬νλ Bucketμ μ£Όμλ₯Ό κ°μ§ Directoryλ₯Ό μ¬μ©νλ λμ ν΄μ±μ κ²°κ³Όλ‘ λμ€λ κ°μ κ°μ§κ³ μ΄μ체μ μ λμμ λ°μ Diskμ μ§μ μ κ·Όν©λλ€.
Linear Hashingμμλ λμ΄μ νμ₯λ κ°λ₯μ±μ΄ μλ κ°λ₯ν κ°μ₯ κ±°λν λ°°μ΄ ht[]λ₯Ό κ°μ ν©λλ€.
Active Bucketsκ³Ό Overflow Bucketsμ΄λΌλ λκ°μ§ κ°λ μ μ¬μ©ν©λλ€.
κ·Έλ¦¬κ³ μ΄λ₯Ό μν΄ λ λ³μ q, rμ μ μν©λλ€.
μ΄ λ λ³μ μ¬μ΄μλ λ€μ κ΄κ³μμ΄ μ±λ¦½ν©λλ€.
$$0 \leq q < 2^{r}$$
Active Bucket(νμ± λ²ν·)
λ°°μ΄ htμμ λ€μ μΈλ±μ€μ ν΄λΉνλ λΆλΆμ Active BucketsμΌλ‘ μ¬μ©ν©λλ€.
$$ht[0] \;\sim\; ht[2^{r}+q-1]$$
κ°κ°μ Active Bucketμλ bucket chainμ μμμ΄ λ€μ΄μμ΅λλ€.
μλ₯Ό λ€μ΄ r=3, q=5μΈ κ²½μ°
Active Bucketsμ ht[0]~ht[12]μ λλ€.
Overflow Bucket
Active Bucketμμ bucket chainμ μμμ μ μΈν λλ¨Έμ§λ₯Ό Overflow Bucketμ΄λΌ λΆλ¦ λλ€.
Overflowκ° λ°μν κ²½μ°, μ΄λ―Έ ν΄λΉ λ²ν·μ΄ κ°λ μ°¬ μννλ©΄ overflowλ λ°μ΄ν°λ₯Ό chainingν©λλ€.
μ΄λ―Έ chaingλ Overflow Bucketμ΄ μ‘΄μ¬νλ κ²½μ°, μ΄μ΄μ μ°κ²°ν©λλ€.
κ·Έλ°λ° μ΄λ¬λ©΄ static hashμμμ closed addressing λ°©λ²κ³Ό λ€λ₯Ό λ° μμ΄λ³΄μ λλ€.
μ΄μ λν μλ¬Έμ μ‘°κΈ λ€μ΄ νμ΄λ³΄λλ‘ νκ² μ΅λλ€.
μΈλ±μ±(Indexing)
$h(k, r+1)$ : qκ° 0μ΄ μλ κ²½μ°, λ€μ λ²μμ μΈλ±μ±μ μ¬μ©ν©λλ€.
$$ht[0] \;\sim\; ht[ q-1 ],\;\; ht[ 2^r ] \;\sim\; ht[ 2^r + q-1 ]$$
$h(k, r) $ :
$$ht[q] \;\sim\; ht[2^r -1 ]$$
κ²μ
μ°μ $h(k, r)$ μ μ μ©ν©λλ€.
$h(k, r)$ μ κ²°κ³Όκ° qλ³΄λ€ μλ€λ©΄ , $h(k, r+1)$μ μ μ©ν κ²°κ³Όλ‘ λμ€λ κ°μ ν΅ν΄ htμμ νμν©λλ€.
$$ht[\;h(k,\;r+1\;)\;]$$
$h(k, r)$μ κ²°κ³Όκ° qμ΄μμ΄λΌλ©΄ ,ν΄λΉ κ²°κ³Όλ₯Ό ν΅ν΄ htμμ νμν©λλ€.
$$ht[\;h(k,\;r\;)\;]$$
Overflow λμ²
Overflowκ° λ°μν κ²½μ° Active Bucketμ 1κ° μ¦κ°μμΌ ν΄κ²°ν©λλ€.
Active Bucketμ΄ μ¦κ°νμμ λ, μ¦κ°λ μμΉμμ $2^r$ μ μ μ‘΄μ¬νλ Active Bucketκ³Ό
μ΄μ Chainingλ Overflow Bucketsμ μμλ€μ λν΄μλ§ rehashνμ¬ Hash Tableμ μ¬κ΅¬μ±ν©λλ€.
Active Bucketμ 1κ° λλ Έμμλ Overflowκ° ν΄κ²°λμ§ μμλ€λ©΄ Overflow chainμΌλ‘ μ°κ²°ν©λλ€.
Actvie Bucketμ 1κ° μ¦κ°μν¨λ€λ κ²μ qλ₯Ό 1 μ¦κ°μν€λ κ²κ³Ό λμΌνλ©°,
λ§μ½ μ¦κ°μν¨ qμ κ°μ΄ $2^r$ κ³Ό λμΌν κ²½μ° rμ 1 μ¦κ°μν€κ³ qλ 0μΌλ‘ λ°κΏλλ€.
λ€μ Hash Tableμ μμλ‘ μ΄ν΄λ³΄κ² μ΅λλ€.
μ΄ κ²½μ° C5λ₯Ό μ½μ ν΄ λ³΄λλ‘ νκ² μ΅λλ€.
$h(C5, 2) = 01 = 1$
μ΄λ q μ΄μμ΄κΈ°μ ν΄λΉ κ°μ κ·Έλλ‘ μΈλ±μ€λ‘ μ¬μ©ν©λλ€. μ¦ h[1]μ μ¬μ©ν©λλ€.
κ·Έλ¬λ ν΄λΉ μμΉλ‘ μ΄λν΄λ³΄λ μ΄λ―Έ Bucketμ΄ κ°λ μ°¬ μνμ΄λ―λ‘ Overflowκ° λ°μνμ΅λλ€.
Overflowκ° λ°μνκΈ°μ Active Bucketμ 1κ° λ립λλ€.
Active Bucketμ΄ μ¦κ°νμμΌλ―λ‘, ν΄λΉ μμΉμμ $2^r$ μ΄μ μ μ‘΄μ¬νλ Bucketμ λν΄μ rehashλ₯Ό μ§νν©λλ€.
μμ μμμμλ μ¦κ°λ Active Bucketμ΄ ht[4]μ΄λ―λ‘, $2^2$ λ₯Ό λΊ ht[0]μ λνμ¬ rehashλ₯Ό μ§νν©λλ€.
μ€μν μ μ Overflowλ h[1]μμ λ°μνμλλ°, rehashλ h[0]μ λ²ν·μμ μ§νλμλ€λ κ²μ λλ€.
μ¦ μ΄λ₯Ό ν΅ν΄ λ€μ μ€μν μ¬μ€μ μ μ μμ΅λλ€.
Linear Hashingμμλ Overflowκ° λ°μν Bucketκ³Ό rehashλλ Bucketμ΄ λμΌνμ§ μμ μ μμ΅λλ€.
Reference
https://en.wikipedia.org/wiki/Hash_function
https://www.cpp.edu/~ftang/courses/CS240/lectures/hashing.htm
https://stackoverflow.com/questions/24555783/hashmap-hashcode-to-internal-table-index-conversion#
http://faculty.tamuc.edu/dcreider/csci520/Note520/Note%207.htm
https://searchall.tistory.com/74
https://programming.guide/hash-tables-open-vs-closed-addressing.html
'π₯ Computer Science > μλ£κ΅¬μ‘°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μλ£κ΅¬μ‘°] - 2-3 Tree (4) | 2022.06.10 |
---|---|
[μλ£κ΅¬μ‘°] - AVL νΈλ¦¬ (0) | 2022.06.09 |
[μλ£κ΅¬μ‘°] - λ₯(Deap : Double Endeded Heap) (0) | 2022.06.07 |
[μλ£κ΅¬μ‘°] - μ°μ μμ ν(Priority Queue) (0) | 2022.06.06 |
[μλ£κ΅¬μ‘°] - ν(Heap) (0) | 2022.06.06 |