ν¨μ¨μ μΈ λ°μ΄ν° κ΄λ¦¬λ₯Ό μν΄, λ°μ΄ν°λ₯Ό κ³ μ λ κΈΈμ΄μ λ°μ΄ν°λ‘ λ°κΎΈμ΄ μ μ₯νλ κ²
- ν€μ μ°μ μ°μ°μ μ μ©νμ¬ λμ¨ κ²°κ³Όλ₯Ό μ£Όμλ‘ νμ¬ κ°μ μ κ·Όνλ λ°©λ²
- ν΄μ ν μ΄λΈμ μ΄μ©ν νμ
- ν€μ κ°μ 맀νμν€λ κ³Όμ
ν΄μν¨μλ₯Ό μ¬μ©νμ¬ ν€λ₯Ό ν΄μκ°μΌλ‘ λ³ννκ³ , μ΄ ν΄μκ°μ μΈλ±μ€λ‘ νμ¬ λ°μ΄ν°λ₯Ό ν€μ ν¨κ» μ μ₯νλ μλ£κ΅¬μ‘°
- mκ°μ λ²ν·(bucket)μΌλ‘ μ΄λ£¨μ΄μ Έ μμΌλ©°, νλμ λ²ν·μ sκ°μ μ¬λ‘―(slot)μ κ°μ§ μ μλ€.
- μλ£λ₯Ό μ μ₯νλλ° λ°°μ΄μ μ¬μ©νλ€.
ν€κ°μ κ³ μ λ κΈΈμ΄μ ν΄μλ‘ λ³κ²½ν΄μ£Όλ ν¨μ
-
ν€κ°μ κ·Έλλ‘ μ μ₯μμ μμΈμΌλ‘ μ¬μ©ν κ²½μ° ν€μ κΈΈμ΄λ§νΌμ μ 보λ₯Ό μ μ₯ν 곡κ°λ λ§λ ¨ν΄μΌνκΈ° λλ¬Έμ, κ³ μ λ κΈΈμ΄μ ν΄μλ‘ λ³κ²½νλ€.
-
μ’μ ν΄μν¨μμ 쑰건
- μΆ©λ νλ₯ μ΄ μ μ ν¨μ
- κ°μ ν μ΄λΈ λ΄μ κ³ λ₯΄κ² λΆν¬ν μ μλ ν¨μ
- κ³μ°μ΄ λΉ λ₯Έ ν¨μ
μλ‘ λ€λ₯Έ ν€κ° ν΄μ± ν κ°μ ν΄μ μ£Όμλ₯Ό κ°μ§λ νμ
- ν΄μ μΆ©λμ΄ λΉλ²ν μΌμ΄λμ λΉ λ²ν·μ΄ λ¨μ§ μμΌλ©΄ μ€λ²νλ‘μ°κ° μΌμ΄λλ€ -> ν΄μν μ΄λΈμ κ°μ μ μ₯ν μ μκ² λλ€.
- ν΄μ μΆ©λμ μ€μ΄λ κ²μ΄ μμ£Ό μ€μ
-
μνλ νλͺ©μ΄ λ€μ΄ μλ μμΉλ₯Ό μκ³ μλ€λ©΄ λ§€μ° λΉ λ₯΄κ² μλ£μ μ κ·Ό κ°λ₯νλ€.
->μ΄μμ μΈ ν΄μ±μ κ²½μ°, O(1)μ μκ°λ³΅μ‘λλ₯Ό κ°μ§λ€.
-
ν€μ κ° μ¬μ΄μ μ°κ΄μ±μ΄ μμ΄ λ³΄μμλ λ§μ΄ μ¬μ©λλ€.
- λ°μ΄ν°κ° μ μ₯λκΈ° μ μ 미리 곡κ°μ λ§λ€μ΄λμΌνκΈ° λλ¬Έμ κ³΅κ° ν¨μ¨μ±μ΄ λ¨μ΄μ§λ€.
- μΆ©λμ΄ μΌμ΄λ κ²½μ°λ²ν· λ΄λΆμ μμ°¨νμ μκ°μ΄ κΈΈμ΄μ Έ νμ μ±λ₯μ΄ μ νλ μ μλ€.
- μΆ©λμ΄ λ²ν·μ ν λΉλ μ¬λ‘― μλ³΄λ€ λ§μ΄ λ°μνκ² λλ©΄ μ€λ²νλ‘μ°κ° λ°μνλ€.
-
ν€μ κ°μ λͺ¨λ κ²½μ°μ μλ₯Ό λ²ν·μΌλ‘ κ°μ§κ³ μλ κ²½μ°
-> ν΄μ ν¨μλ₯Ό κ³μ°νλ μκ°λ§ νμλ‘νλ€. ( μΆκ°μ μΈ λ°°μ΄ νμμ΄ νμμλ€.)
- ν΄μ ν μ΄λΈμ ν¬κΈ°κ° μ νλμ΄ μκΈ° λλ¬Έμ, νλμ ν€λΉ νλμ 곡κ°μ ν λΉνλ κ²μ λΆκ°λ₯νλ€.
- κ³΅κ° λλΉλ₯Ό κ³ λ €νμ¬, μ€μ λ‘λ λ μμ ν΄μν μ΄λΈμ λ§λ€μ΄μ£Όλ ν΄μν¨μλ₯Ό μ΄μ©νλ€. -> μΆ©λμ΄ μΌμ΄λλ μ΄μ
- μ€μ μ ν΄μ±μ κ²½μ° μ€λ²νλ‘μ°κ° μμ£Ό λ°μνκΈ° λλ¬Έμ μκ°λ³΅μ‘λκ° O(1)λ³΄λ€ λ¨μ΄μ§λ€.
-
κ°λ°© μ£Όμλ²(open addressing): μΆ©λμ΄ μΌμ΄λ νλͺ©μ ν΄μ ν μ΄λΈμ λ€λ₯Έ μμΉμ μ μ₯νλ λ°©λ². λΉμ΄μλ λ²ν·μ μ°Ύλλ€.
-
μ ν μ‘°μ¬λ²: μΆ©λμ΄ μΌμ΄λ λ²ν·μ λ€μ λ²ν·μ΄ λΉμ΄μλμ§ νμΈνλ λ°©λ²
- h(k), h(k)+1, h(k)+2 ... μμΌλ‘ νμ
- μ‘°μ¬λ₯Ό μμνλ κ³³μΌλ‘ λλμμ¬ λκΉμ§ νμΈμ κ³μνλ€.
- ν€λ€μ΄ μ§μ€λμ΄ μ μ₯λλ νμμ΄ μμ£Ό λ°μνλ©°, μ΅μ μ κ²½μ° μ§μ€λ νγ κ³ μ΄ κ²°ν©νλ νμλ λ°μνλ€.
- μ€λ²νλ‘μ°κ° μμ£Ό λ°μνλ©΄ μ§μ€κ³Ό κ²°ν©μ μν΄ νμ ν¨μ¨μ΄ ν¬κ² μ νλλ€.
//μ ν μ‘°μ¬λ²μ μ΄μ©νμ¬ ν μ΄λΈμ ν€ μ½μ . ν μ΄λΈμ΄ κ°λ μ°Όμ κ²½μ° μ’ λ£ #define empty(item) (strlen(item.key==0)) #define equal(item1, item2) (!strcmp(item1.key, item2.key)) void hash_lp_add(element item, emelent ht[]) { int i, hash_value; hash_value=i=hash_function(item.key); while(!empty(ht[i])){ if(equal(item, ht[i])){ fprintf(stderr, "νμν€κ° μ€λ³΅λμμ΅λλ€.\n"); exit(1); } i=(i+1)%TABLE_SIZE; if(i==hash_value){ fprintf(stderr, "ν μ΄λΈμ΄ κ°λμ°Όμ΅λλ€.\n"); exit(1); } } ht[i]=item; }
-
μ΄μ°¨ μ‘°μ¬λ²:
(h(k)+inc*inc)mod M for inc=0, 1, ..., M-1
μ μμ ν΅ν΄ λ€μ μ‘°μ¬ μμΉλ₯Ό κ²°μ νλ λ°©λ²- h(k), h(k)+1, h(k)+4, h(k)+9 ... μμΌλ‘ νμ
- μ ν μ‘°μ¬λ²μ μ§μ€κ³Ό κ²°ν¨μ ν¬κ² μνμν¬ μ μλ€.
void hash_qp_add(element item, emelent ht[]) { int i, hash_value, inc=0; hash_value=i=hash_function(item.key); while(!empty(ht[i])){ if(equal(item, ht[i])){ fprintf(stderr, "νμν€κ° μ€λ³΅λμμ΅λλ€.\n"); exit(1); } i=(hash_value+inc*inc)%TABLE_SIZE; inc=inc+1; if(i==hash_value){ fprintln(stderr, "ν μ΄λΈμ΄ κ°λμ°Όμ΅λλ€.\n"); exit(1); } } ht[i]=item; }
-
μ΄μ€ ν΄μ±λ²(μ¬ν΄μ±): μλμ ν΄μν¨μμ λ€λ₯Έ λ³κ°μ ν΄μ ν¨μλ₯Ό μ΄μ©ν΄ λ€μ μμΉλ₯Ό μ νλ λ°©λ²
-
h(k), h(k)+h'(k), h(k)+2*h'(k) ... μμΌλ‘ νμ. (μ¬κΈ°μ h'(k)=C-(k mod C), Cλ ν μ΄λΈ ν¬κΈ°λ³΄λ€ μ½κ° μμ μμ)
-
λ€λ₯Έ λ°©λ²λ€λ³΄λ€ ν μ΄λΈμ κ°μ κ· μΌνκ² λΆν¬μν¬ μ μμ΄ ν¨κ³Όμ μ΄λ€.
->μΆ©λμ΄ λ°μνμ λ ν΄μκ°μ μΌμ κ°μ λνλ λ€λ₯Έ λ°©λ²λ€μ μ‘°μ¬ μμΉκ° νμ μΌμ ν κ²μ λ°ν΄ ν€λ₯Ό μ°Έμ‘°νμ¬ κ°μ λνλ μ΄μ€ν΄μ±λ²μ μ‘°μ¬ μμκ° λ¬λΌμ§κΈ° λλ¬Έ.
void hash_dh_add(element item, emelent ht[]) { int i, hash_value, inc; hash_value=i=hash_function(item.key); inc=hash_function2(item.key); while(!empty(ht[i])){ if(equal(item, ht[i])){ fprintf(stderr, "νμν€κ° μ€λ³΅λμμ΅λλ€.\n"); exit(1); } i=(i+inc)%TABLE_SIZE; if(i==hash_value){ fprintln(stderr, "ν μ΄λΈμ΄ κ°λμ°Όμ΅λλ€.\n"); exit(1); } } ht[i]=item; }
-
-
-
체μ΄λ(chaining): ν΄μν μ΄λΈ νλμ μμΉκ° μ¬λ¬ κ°μ νλͺ©μ μ μ₯ν μ μλλ‘ ν΄μν μ΄λΈμ ꡬ쑰λ₯Ό λ³κ²½νλ λ°©λ².
- μΆ©λμ΄ λ°μνλ©΄ μλ‘μ΄ λ Έλλ₯Ό μμ±νμ¬ μ μ₯νλ€.
typedef struct{ int key; } element; struct list{ element item; struct list *link; }; struct list *hash_table[TABLE_SIZE]; //체μΈλ²μ μ΄μ©νμ¬ ν μ΄λΈμ ν€λ₯Ό μ½μ νλ μ½λ void hash_chain_add(element item, struct list *ht[]){ int hash_value = hash_function(item.key); struct list *ptr; struct list *node_before = NULL, *node=ht[hash_value]; for(;node;node_before=node, node=node->link){ if(node->item.key==item.key){ fprintf(stderr, "μ΄λ―Έ νμν€κ° μ μ₯λΌ μμ.\n"); return; } } ptr=(struct list*)malloc(sizeof(struct list)); ptr->item=item; ptr->link=NULL; if(node_before) node_before->link=ptr; else ht[hash_value]=ptr; }