数据结构之哈希表
来源:互联网 发布:飞常准 航旅 知乎 编辑:程序博客网 时间:2024/06/03 23:40
wikipedia上的解释
http://zh.wikipedia.org/wiki/%E5%93%88%E5%B8%8C%E8%A1%A8
下图示意了哈希表(Hash Table)这种数据结构。
哈希表
如上图所示,首先分配一个指针数组,数组的每个元素是一个链表的头指针,每个链表称为一个槽(Slot)。哪个数据应该放入哪个槽中由哈希函数决定,在这个例子中我们简单地选取哈希函数h(x) = x % 11,这样任意数据x都可以映射成0~10之间的一个数,就是槽的编号,将数据放入某个槽的操作就是链表的插入操作。
如果每个槽里至多只有一个数据,可以想像这种情况下search
、insert
和delete
操作的时间复杂度都是O(1),但有时会有多个数据被哈希函数映射到同一个槽中,这称为碰撞(Collision),设计一个好的哈希函数可以把数据比较均匀地分布到各个槽中,尽量避免碰撞。如果能把n个数据比较均匀地分布到m个槽中,每个糟里约有n/m个数据,则search
、insert
和delete
和操作的时间复杂度都是O(n/m),如果n和m的比是常数,则时间复杂度仍然是O(1)。一般来说,要处理的数据越多,构造哈希表时分配的槽也应该越多,所以n和m成正比这个假设是成立的。
请读者自己编写程序构造这样一个哈希表,并实现search
、insert
和delete
操作。
如果用我们学过的各种数据结构来表示n个数据的集合,下表是search
、insert
和delete
操作在平均情况下的时间复杂度比较。
各种数据结构的search、insert和delete操作在平均情况下的时间复杂度比较
根据以上算法,抽象数据结构如下:
/*哈希表*/
struct obj_container {
obj_hash_fn *hash_fn;//哈希函数
obj_callback_fn *cmp_fn;
int n_buckets; //分配多少个slot ?
int elements; //哈希表中元素数目
int version;
/*!variable size */
struct bucket buckets[0]; /*! lengthen tailq, each bucket is a linkedlist */
};
// 每个slot 为一个链表
struct bucket_entry {
SPD_LIST_ENTRY(bucket_entry)entry;
int version;
struct obj *pobj; /* pointer to internal data */
}bucket;
接下来实现 search, link , unlink函数。
- 数据结构之哈希表
- 数据结构之哈希表
- 数据结构之哈希表(4)
- 数据结构之哈希表
- 数据结构之哈希表
- 数据结构之哈希表
- 数据结构之哈希表
- 数据结构之哈希表
- 数据结构之哈希表
- 数据结构之哈希表
- 7.数据结构之哈希表
- 数据结构之 哈希表
- 数据结构之哈希表
- 计蒜客:数据结构之哈希表
- 数据结构算法之哈希表
- 数据结构之哈希表
- 数据结构之哈希表
- 数据结构之哈希表
- 关于资源密码
- Oracle中时间格式在TO_DATE与TO_CHAR中的应用
- dlsym
- lds链接叫本文件
- 开源数据库全接触-MongoDB,Cassandra,Hypertable,CouchDB,Redis,HBase,Voldemort等35款数据库简介
- 数据结构之哈希表
- 用鼠标点击获得位置信息以及来绘制自己的名字
- Some of my thoughts on life's crossroads.
- 关于Linux嵌入式系统开发
- 自动化脚本框架1
- Linux kernel boot process——从实模式(real mode)到保护模式(protected mode),再到分页(paging)
- IP地址后斜杠和数字代表的意思
- DOM 操作整理
- 2011美国信息领域大学排名