int transform char key int number 0 while
int transform (char *key) { int number = 0; while (*key) number += *key++; return number; } int hash_function (char *key) { return transform(key) % TABLE_SIZE; } <군집화(clustering) 예제> 탐색 키 덧셈식 변환 과정 덧셈 합계 해싱 주소 do 100+111 211 3 for 102+111+114 327 2 if 105+102 207 12 case 99+97+115+101 412 9 else 101+108+115+101 425 9 return 114+101+116+117+114+110 672 9 function 102+117+110+99+116+105+111+110 870 12 C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011
do 버켓 1단계 for 2단계 if 3단계 case 4단계 else 5단계 return 6단계 [0] function 7단계 function [1] [2] [3] do for for for do do do case else return if if [4] [5] [6] [7] [8] [9] [10] [11] [12] C로 쉽게 풀어쓴 자료구조 if if © 생능출판사 2011 if
#define empty(e) (strlen(e. key) == 0) #define equal(eq, e 2) (!strcmp(e 1. key, e 2. key)) #define KEY_SIZE #define TABLE_SIZE void hash_lp_add(element item, element ht[]) { int i, hash_value; hash_value = i = hash_function(item. key); while (!empty(ht[i])) { if (equal(item, ht[i])) { fprintf(stderr, “탐색 키가 중복n”); return; } i = (i+1) % TABLE_SIZE; if (i == hash_value) { fprintf(stderr, “테이블이 가득 참n”); return; } } ht[i] = item; } typedef struct { char key[KEY_SIZE]; } element; C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011 10 13 element hash_table[TABLE_SIZE];
#define empty(e) (strlen(e. key) == 0) #define equal(eq, e 2) (!strcmp(e 1. key, e 2. key)) #define KEY_SIZE #define TABLE_SIZE void hash_qp_add(element item, element 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”); return; } inc = inc + 1; i = (i+inc*inc) % TABLE_SIZE; // i = (i+inc+1) % TABLE_SIZE; // inc = inc + 2; if (i == hash_value) { fprintf(stderr, “테이블이 가득 참n”); return; } } ht[i] = item; } typedef struct { char key[KEY_SIZE]; } element; C로 쉽게 풀어쓴 자료구조 © 생능출판사 2011 10 13 element hash_table[TABLE_SIZE];
#define equal(eq, e 2) (!strcmp(e 1. key, e 2. key)) void hash_chain_add(element item, List. Node *ht[]) { int hash_value = hash_function(item. key); List. Node *ptr; List. Node *node_before = NULL; List. Node *node = ht[hash_value]; for (; node_before=node, node=node->link) { if (equal(node->item, item)) { fprintf(stderr, “이미 키가 저장n”); return; } } ptr = (List. Node *)malloc(sizeof(List. Node)); ptr->item = item; ptr->link = NULL; if (node_before) node_before->link = ptr; else ht[hash_value] = ptr; } void hash_chain_find(element item, List. Node *ht[]) { List. Node *node; int hash_value = hash_function(item. key); for (node=ht[hash_value]; node=node->link) { if (equal(node->item, item)) { printf(“키를 찾음n”); return; } } fprintf(stderr, “키를 못찾음n”); © 생능출판사 2011 } C로 쉽게 풀어쓴 자료구조 #define KEY_SIZE #define TABLE_SIZE 10 13 typedef struct { char key[KEY_SIZE]; } element; typedef struct List. Node { element item; struct List. Node *link; } List. Node; List. Node *hash_table[TABLE_SIZE];
- Slides: 29