码迷,mamicode.com
首页 > 其他好文 > 详细

散列表

时间:2021-01-27 13:14:21      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:键值对存储   就会   函数   load   ddr   映射   通过   rect   必须   

散列表是普通数组概念的推广,由下标与值的映射提高为键值分别与下标的映射。

数组中查找元素需对下标遍历来查询值,复杂度通常是非常数。而散列表由键到下标是常数级,因此散列表是典型的空间换时间的数据结构。

由键到下标的映射有不同的方法,即哈希函数,可能会造成哈希冲突。

 

一、直接寻址表

当全域比较小时,关键字即为下标,因此全域中关键字的个数与表的长度大小相等。其中键值对存储在表中,而没有值的关键字在表中打上阴影。

direct-address table,记为T[0,,m-1],其中每个位置称为槽,对应全域中的一个关键字。查找、插入、删除的复杂度均为1。

二、散列表

当全域很大时,直接寻址表的长度就会变得很大。而且当键值对的数目远小于全域中关键字的个数时,表中的大部分阴影空间将被浪费掉。

因此引入散列表的结构,不再是一一映射。哈希函数可能将不同的关键字映射到表中的同一个槽,造成哈希冲突,因此一般有效槽的数目

小于等于键值对的数目。

(原文)理想的解决方法时避免所有的冲突。我们可以试图选择一个合适的散列函数h来做到这一点。一个想法就是使h尽可能的随机,从而避免冲突或者使冲突的次数最小化。

实际上,术语散列原意就是随机混杂与拼凑,即体现了这种思想。一个散列函数必须是确定的,因为一个给定的输入k必须得到唯一的h(k)。我们需精心设计散列函数来尽量减少

哈希冲突的次数,此外需要有解决哈希冲突出现后的办法。

通过链接法解决冲突 将散列到同一槽的所有元素放入一个链表中。槽中存放该链表的表头。

链接法散列的分析 记存放n个元素的、具有m个槽位的散列表的(load factor)装载因子a=n/m,即一个链的平均存储元素数。装载因子可以小于、等于、或大于1。

最坏情况下,所有的元素都被映射到同一个槽位,此时退化成链表,查找的复杂度为n。散列表的性能取决于散列函数将关键字分布在槽位上的均匀程度。

假设任何一个给定元素等可能地散列到m个槽位中的任何一个,且与其他元素被散列到什么位置上无关,为简单均匀散列,其查找的平均时间为1+a,包括关键字到槽位的1和链表的平均长度a(装载因子)。

三、散列函数

 

四、开放寻址法

 

五、完全散列

散列表

标签:键值对存储   就会   函数   load   ddr   映射   通过   rect   必须   

原文地址:https://www.cnblogs.com/faded828x/p/14328198.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!