ν΄μ ν μ΄λΈ(Hash Table)
ν΄μ ν μ΄λΈμ΄λ?
ν΄μ ν μ΄λΈμ key - value μμ€ν μ μλ£κ΅¬μ‘°λ€λ€. key λ λ°°μ΄μ index μ²λΌ value μ λ°λ‘ μ κ·Όν μ μλλ‘ νλ κ°μ΄λ€. index μ λ¬λ¦¬ λ¬Έμμ΄, νμΌ λ± λ€μν λ°μ΄ν°κ° κ°λ₯ν΄μ valueμ κ΄λ ¨ μλ κ°μΌλ‘ μ€μ ν μ μλ€.
fruits = {
key: "μ¬κ³Ό", value: "λ§μλ€",
key: "볡μμ", value: "λ±λ±νκ² λ§μλ€."
}
//keyκ°μΌλ‘ λ°μ΄ν° λ°λ‘ μ κ·Ό
fruits["μ¬κ³Ό"] -> "λ§μλ€"
μ΄λ»κ² κ°λ₯νμ§?
μ¬μ€ ν΄μν μ΄λΈμ λ΄λΆλ λ°°μ΄κ³Ό λΉμ·νκ² index μ value λ‘ κ΅¬μ±λμ΄ μλ€. key λ hash function μ ν΅ν΄ ν΄μ μ½λλ‘ κ³μ°λκ³ , μ΄ ν΄μμ½λλ index λ‘ νμ°λλ€. hash function μ μ λ ₯λλ λ°μ΄ν°μ κΈΈμ΄κ° μΌλ§νΌμ΄λ μκ΄μμ΄ κ³ μ λ κΈΈμ΄μ μ½λλ‘ λ°νμμΌμ£Όλ ν¨μλ€. κ·Έλ¦¬κ³ μ΄λ κ² κ³μ°νλ μκ³ λ¦¬μ¦μ hash algorithm μ΄λΌκ³ νλ€. (μ°Έκ³ λ‘ hash λ κ°λ³ κΈΈμ΄μ λ°μ΄ν°λ₯Ό κ³ μ κΈΈμ΄λ‘ νμ°ν κ°μ μλ―Ένλ€.)
Hash Function
μμ£Ό κ°λ¨ν hash algorithm μ λ΄λΆ buckets μ΄λΌ λΆλ¦¬λ λ°μ΄ν° μ μ₯μμ μ¬μ΄μ¦λ§νΌ λλ λλ¨Έμ§(λλ¨Έμ§λ 무쑰건 λλλ μ μ΄νμ κ°μ΄ λμ¨λ€.)λ₯Ό index λ‘ μ°λ κ²μ΄λ€.
const bucketSize = 3;
hash_function(data) {
const index = data % bucketSize;
return index;
}
hash_function(24) = 24%3 = 0
hash_function(20) = 20%3 = 2
hash_function(16) = 16%3 = 1
λ¬Έμ λ μλ κ°μ΄, λ€λ₯Έ λ°μ΄ν°μΈλ° κ°μ index κ°μ΄ λμ€λ κ²½μ°κ° μλ€. μ΄λ° μν©μ Collision μ΄λΌκ³ νλ€.
hash_function(15) = 15%3 = 0
hash_function(21) = 21%3 = 0
Collision
Collision μ΄ λ°μνλ©΄ λνμ μΌλ‘ λ κ°μ§ ν΄κ²°μ± μ μ΄λ€. 첫λ²μ§Έλ 곡κ°μ κ°μ΄ 곡μ νλ κ²μ΄κ³ λλ²μ§Έλ λΉμ΄μλ λ€λ₯Έ 곡κ°μ λ£λ κ²μ΄λ€.
ν΄κ²°λ²1. Chaning
Collision μ΄ λ°μν λ°μ΄ν°λ€μ΄ 곡κ°μ κ°μ΄ 곡μ νλ€. λ³΄ν΅ Linked List λ‘ μ μΈλλ€. κ²μμ νλ κ²½μ° ν΄λΉ index λ‘ μ κ·Όνκ³ κ·Έ 곡κ°μμ μ νκ²μμ νλ€. λ°λΌμ ν΄μν μ΄λΈμ ν¨μ¨μ νκ· O(1) μ΄μ§λ§, μ΅μ μ κ²½μ° O(n) μ΄ λλ€.
ν΄κ²°λ²2. Open Addressing
λΉμ΄μλ λ€λ₯Έ 곡κ°μ μ°Ύμ λ£λλ€. λΉμ΄μλ 곡κ°μ μ°Ύλ λ°©λ²μ μλ μΈ κ°μ§κ° μλ€.
- Linear Probing : λ°λ‘ λ€μ μΉΈμ λ£λλ€. κ·Έ μΉΈμ΄ λΉμ΄μμ§ μλ€λ©΄ κ·Έ λ€μ λΉμ΄μλ μΉΈμ μ°Ύλλ€. κ²μνλ κ²½μ° key λ‘ νμ°ν index μ μ κ·Όν΄μ, κ²μνλ €λ λ°μ΄ν°κ° μλλΌλ©΄ λ€μμΉΈμ κ²μνλ€.
- Quadratic probing : Linear Probing μ +1 μΉΈμ μ°Ύλλ°, Quadratic μ 1^2μΉΈ, 2^2μΉΈ, 3^2 μΉΈκ³Ό κ°μ΄ μ κ³±μλ§νΌ μ°¨μ΄λλ μΉΈμ νμν΄ λΉμ΄μλ κ³³μ λ£λλ€. μ΄ κ²½μ° κ°μ index λ‘ νμ°λ λ°μ΄ν°λ€μ μ΄λνμ΄ κ°μμ§λ ν΄λ¬μ€ν°λ§ λ¬Έμ κ° μκΈ΄λ€.
- Double hashing probing : ν΄λ¬μ€ν°λ§ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ ν΄μ ν¨μλ₯Ό 2κ° λλ€. νλλ indexκ° νμ°μ©μ΄κ³ , λ€λ₯Έ νλλ Collision λ°μ μ λΉμ΄μλ μΉΈμ μ°Ύλ λ° μ¬μ©ν μΉΈμλ₯Ό κ³μ°νλ ν¨μλ€. μ¦, h2(key) λ§νΌ μ΄λνλ©° λΉμ΄μλ μΉΈμ μ°Ύλλ€.
μ’μ Hash Altorithm μ΄λ...
Collision μ΄ λ무 μμ£Ό μΌμ΄λμ λ°μ΄ν°κ° ν 곡κ°μλ§ μ§μ€λλ©΄ ν΄μ ν μ΄λΈμ ν¨μ¨μ΄ λ¨μ΄μ§ κ²μ΄λ€. κ·Έλ¬λ―λ‘ Collision μ΄ λ λ°μν μ μλλ‘ hash algorithm μ μ μ§μΌνλ€.(key-index κ° 1:1λ‘ λμ€λ μλ²½ν μκ³ λ¦¬μ¦μ νλμ λ³λ°κΈ°λ€...) μ΄λ―Έ μ¬λ¬ νλ‘κ·Έλλ° μΈμ΄κ° hash table μ μ§μνκ³ μκ³ , λλν μ¬λλ€μ΄ λ§λ hash algorithm λ€μ΄ λ§μΌλ μ°Έκ³ νλ©΄ μ’μ κ²μ΄λ€.
ν΄μν μ΄λΈ vs λ°°μ΄
ν΄μ ν μ΄λΈμ λ΄λΆμ μΌλ‘ λ°°μ΄κ³Ό κ°μ ꡬ쑰μ΄λ€. hash_function(key) μ ν΅ν΄ νμ°λ index λ‘ λ°μ΄ν°μ λ°λ‘ μ κ·Όνκ³ , λ΄λΆ λ°μ΄ν° 곡κ°μ μ¬μ΄μ¦κ° μ ν΄μ Έ μλ€. κ·Έλ¬λ λ°°μ΄μ index λ 0μΌλ‘ μμνλ μ μμ΄λ―λ‘ value μ μ°κ΄κ΄κ³κ° μμ΄μ value λ₯Ό μ°ΎμΌλ €λ©΄ 곡κ°μ νλνλ νμν΄μΌ νλ€. ν΄μ ν μ΄λΈμ value μ κ΄λ ¨μλ key λ‘ λ°λ‘ μ κ·Όν μ μκΈ° λλ¬Έμ λ°°μ΄λ³΄λ€ νμμ΄ λ λΉ λ₯΄λ€.
ν΄μ ν μ΄λΈ Resize
μκΉ μΈκΈνλ― ν΄μ ν μ΄λΈμ Bucket μ μ¬μ΄μ¦λ 미리 μ ν΄μ§λ€. μ ν΄μ§ μ¬μ΄μ¦μ 곡κ°μ ν¨μ¨μ μΌλ‘ μ°κ³ μΆμ λ ν΄μν μ΄λΈ μλ£κ΅¬μ‘°λ₯Ό μ΄μ©νλ©΄ μ’λ€. κ·Έλ¬λ€ μ λ ₯λλ λ°μ΄ν°μ μμ΄ λ λ§μμ Έμ 곡κ°μ΄ λΆμ‘±ν κ²½μ°κ° μκΈ°λλ°, μ΄λ΄ λ ν΄μ ν μ΄λΈμ μ¬μ΄μ¦λ₯Ό λ리λ λ°©λ²μ΄ μλ€. λ³΄ν΅ μΌμ κ°μ μ΄μ(λ³΄ν΅ 75%μ λ μ°¨λ©΄) μ΄ λλ©΄ λ²ν· μ¬μ΄μ¦λ₯Ό 2λ°°λ‘ λλ¦°λ€. 0.75 μμΉλ₯Ό load factor λΌκ³ νλ€.