您的位置:首页 > 其它

哈希表学习笔记

2015-07-28 21:31 176 查看
哈希表学习笔记
最近在学习了C++相关的容器知识,感觉在总结容器知识之前,有必要回顾一下之前学过的哈希表,感觉这个概念应该是最基本的概念。不过到现在我都不敢说自己真正了解了这个概念。只能先说说初步的学习感受了。

资料大部分参考了大学的教程《数据结构(C语言版)》,挺经典的一本教材。

引入的废话就不说了,哈希表就是为了提高查找效率而生的。怎么提高查找效率呢?那就必须在记录的存储位置和他的关键字之间简历一个确定的对应关系f,使得关键字和结构中一个唯一的存储位置相对应。简化来看就是f(key) = y。那么如此,用key就可以在常数时间内找到y。查找效率杠杠地。

那么简单的东西,往往存在着负责的情况。

首先,可以知道,f,是我们常说的哈希函数。它是一个映射,可以灵活地定义,只要使得任何key得到的函数值落在表长允许的范围内即可。

然后,定义了一个f,很多时候是会出现冲突的。即f(key1) =f(key2),这种现象叫冲突,而key1和key2叫做同义词。这个是不能完全避免的。而哈希表需要注意的地方也就是这里了。

一般情况下,冲突只能尽可能第少,而不能完全避免。因为哈希函数是从关键字集合到地址集合的映像。通常关键字集合比较大,他的元素包含所有可能的关键字,而地址集合的元素仅为哈希表中的地址值。因此,我们还需要考虑一个处理冲突的方法。

至此,我们大概说完了哈希表所需要知道的东西。综上所述,可以如下描述哈希表:根据设定的哈希函数和处理冲突的方法,将一组关键字映像到一个有限的连续地址集(区间)上,并以关键字在地址集合中的“像”作为记录在表中的存储位置,这种表便称为哈希表,这一映像过程称为哈希造表或散列,所得存储位置称哈希地址或散列地址。

 

1、哈希函数的构造方法

直接定址法、数字分析法、平方取中法,折叠法、除留余数法、随机数法

 

2、处理冲突的方法

开放地址法、再哈希法、链地址法、建立一个公共溢出区

只能这样做简单的回顾,总的来说现在还只是先复习了一遍,并没有什么心得体会,日后有改进,将继续更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HashTable