标签:log 大小 href 拉链法 rod 分类 div csdn 简便
查找算法大总结: http://www.cnblogs.com/maybe2030/p/4715035.html#_label6
常用的hash函数: http://blog.csdn.net/mycomputerxiaomei/article/details/7641221
什么是哈希表(Hash)?
什么是哈希函数?
哈希函数的规则是:通过某种转换关系,使关键字适度的分散到指定大小的的顺序结构中,越分散,则以后查找的时间复杂度越小,空间复杂度越高。
算法思想:哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。
算法流程:
实现:
定义hash:
1 typedef struct node 2 { 3 int value; 4 struct node *next; 5 }NODE; 6 7 typedef struct hash 8 { 9 int size; 10 NODE **list; 11 }HASH;
初始化hash:
1 HASH *HashInit(int size) 2 { 3 if (size <= 0) 4 return NULL; 5 HASH *hash = (HASH*)malloc(sizeof(HASH)); 6 if (NULL == hash) 7 return NULL; 8 hash->size = size; 9 hash->list = (NODE**)malloc(sizeof(NODE*) * hash->size); 10 if (NULL == hash->list) 11 { 12 free(hash); 13 hash = NULL; 14 return NULL; 15 } 16 int i; 17 for (i = 0; i < size; i++) 18 { 19 hash->list[i] = (NODE*)malloc(sizeof(NODE)); 20 hash->list[i]->next = NULL; 21 } 22 return hash; 23 }
hash查找:
NODE *HashFind(HASH *hash, int key) { NODE *list = hash->list[HashFun(key, hash->size)]; NODE *node = list->next; for (;NULL != node && node->value != key; node = node->next); return node; }
hash插入:
void HashInstert(HASH* hash, int key) { if (NULL != HashFind(hash, key)) return; NODE *node = (NODE*)malloc(sizeof(NODE)); if (NULL == node) return; NODE *list = hash->list[HashFun(key, hash->size)]; node->value = key; node->next = list->next; list->next = node; }
标签:log 大小 href 拉链法 rod 分类 div csdn 简便
原文地址:http://www.cnblogs.com/dapaitou2006/p/6644921.html