哈希表 对于我们来说再熟悉不过了,因为在日常编程中用到的 对象,底层就是使用哈希表来实现的,本篇文章就准备好好聊聊它,开搞!
什么是哈希表
哈希表(Hash table,也叫散列表),是根据 关键码值(Key value) 而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做 散列函数,存放记录的 数组 叫做 哈希表
从上述概念的叙述中,我们可以知道要实现哈希表,必须存在四个元素
- 数组,也就是所需的存储空间是连续的
- 关键字key,需要实际存储的值
- 关键字值value,关键字key在数组中的实际地址
- hash函数,用来将key转为value
详聊hash函数
在实现哈希表的元素中,hash函数可谓是最重要的一部分,它直接决定了哈希表的性能,因此需要特别注意
在选择hash函数时,需要注意如下几点:
- 哈希函数所需时间
- 关键字的长度
- 哈希表的大小
- 关键字的分布情况
- 记录的查找频率
目前主流的hash方案有如下几种
- 直接寻址法:取关键字或关键字的某个线性函数值为散列地址,即H(key)=key或H(key) = a·key + b,其中a和b为常数,这种散列函数叫做自身函数。若其中H(key)中已经有值了,就往下一个找,直到H(key)中没有值了,就放进去
- 随机数法:选择一随机函数,取关键字的随机值作为散列地址,即H(key)=random(key),其中random为随机函数
- 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的 余数 为散列地址。即 H(key) = key mod p,p<=m,对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词
结语
哈希表是十分有用的数据结构,我们可以利用它很大程度地提高程序性能,因此一定要掌握,好啦,就写到这啦,over!