λ€μ΄κ°κΈ°μ μμ ν΄μκ° μ΄λμ μ°μ΄λμ§ μμ보λλ‘ νκ² μ΅λλ€.
μ νλΈλ₯Ό μμλ‘ μκ°ν΄ 보λλ‘ νκ² μ΅λλ€.
μ κ° μ΄λ€ μ¬λμ λμμμ κ·Έλλ‘ μ μ±λμ μ¬λ¦¬λ €κ³ νλ€λ©΄, κ·Έ μκ° λ°λ‘ μ νλΈμμ μ€λ³΅λλ λμμμ΄λΌλ μλ¬ λ©μΈμ§λ₯Ό 보λ΄μ€λλ€.
λμμμ ν¬κΈ°λ λ§€μ° ν¬κ³ , κ·Έ μλ λ§€μ° λ§μ΅λλ€.
κ·Έλ κ² λ§μ λμμ μ€μμ μ΄λ»κ² μ€λ³΅λλ λμμμΈμ§λ₯Ό λΉ λ₯΄κ² νλ¨ν μ μμκΉμ?
μμΌλ‘ μ΄ν΄λ³Ό μλ£κ΅¬μ‘°μΈ ν΄μν μ΄λΈμ΄ λ°λ‘ μ΄κ²μ κ°λ₯νκ² λ§λ€μ΄μ€λλ€.
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
Hash function - Wikipedia
From Wikipedia, the free encyclopedia Jump to navigation Jump to search Type of function that maps data of arbitrary size to data of fixed size "hashlink" redirects here. For the Haxe virtual machine, see HashLink. This article is about a computer programm
en.wikipedia.org
https://www.cpp.edu/~ftang/courses/CS240/lectures/hashing.htm
CS240: Data Structures & Algorithms I
A hash function maps each key to an integer in the range [0, N -1], where N is the capacity of the bucket array for the hash table. The main idea is to use the hash value, h(k), as an index into our bucket array, A, instead of the key k (which is most like
www.cpp.edu
https://stackoverflow.com/questions/24555783/hashmap-hashcode-to-internal-table-index-conversion#
Hashmap hashcode to internal table index conversion
Hashmaps usually implemented using internal array (table) of buckets. On accessing hashmap by key, we get key's hashcode using key-type specific(logic type specific) hash function. Then we need to ...
stackoverflow.com
http://faculty.tamuc.edu/dcreider/csci520/Note520/Note%207.htm
Note 7: Hash Algorithms in Data Structure for Application
faculty.tamuc.edu
https://searchall.tistory.com/74
[λ°νμ ] μ΅μ μμ ν΄μ¬ ν¨μ (Minimal Perfect Hash Function)
minimal perfect hash function(MPHF, μ΅μ μμ ν΄μ¬ ν¨μ) mκ°μ ν€λ₯Ό mκ°μ λ²ν·μ μΆ©λμμ΄ ν΄μ±νλ μμ ν΄μ¬ν¨μ μ¦, ν€μ λ²ν·μ΄ μΌλμΌ λμμ΄λ©°, 100% μ μ¬μ¨μ κ°μ§ ν΄μ¬ ν¨μ perfect hash function(..
searchall.tistory.com
https://programming.guide/hash-tables-open-vs-closed-addressing.html
Hash Tables: Open vs Closed Addressing | Programming.Guide
A key is always stored in the bucket it's hashed to. Collisions are dealt with using separate data structures on a per-bucket basis.
programming.guide
'π₯ 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 |