近来从阿里到谷歌的面试笔试被虐,严重的反映出对基础数据结构与算法掌握的不足,痛定思痛,遂有此系列。
此篇是我从:http://www.php-internals.com/book/?p=chapt03/03-01-01-hashtable转载得之,此中哈希的结构简单易懂,是很好的一个可扩展哈希表的模版。可以记之,以后在慢慢填充。
里面有少量我改写的地方,我会标记出来。
此篇主要是讲哈希表的动态可扩展实现,使用的是链接法,以下不再重复。
基本概念:
哈希表是一种通过哈希函数,将特定的键映射到特定值的一种数据结构,它维护键和值之间一一对应关系。
- 键(key):用于操作数据的标示,例如PHP数组中的索引,或者字符串键等等。
- 槽(slot/bucket):哈希表中用于保存数据的一个单元,也就是数据真正存放的容器。
- 哈希函数(hash function):将key映射(map)到数据应该存放的slot所在位置的函数。
- 哈希冲突(hash collision):哈希函数将两个不同的key映射到同一个索引的情况。
哈希表的实现
在了解到哈希表的原理之后要实现一个哈希表也很容易,主要需要完成的工作只有4点:
- 数据结构
- 实现哈希函数
- 冲突的解决
- 操作接口的实现
数据结构
基本的数据结构主要有两个,一个用于保存哈希表本身,另外一个就是用于实际保存数据的单链表了,
typedef struct _Bucket
{
char *key;
void *value;
struct _Bucket *next;
} Bucket;
typedef struct _HashTable
{
int size;
int elem_num;
Bucket** buckets;
} HashTable;
http://blog.csdn.net/zuiaituantuan/article/details/6057586
http://blog.minidx.com/2008/01/27/446.html
http://www.php-internals.com/book/?p=chapt03/03-01-01-hashtable
http://hi.baidu.com/calrincalrin/item/dd826f76cffc935d0d0a07c5
http://www.cnblogs.com/nocode/archive/2011/10/14/2212586.html