散列表是根据键(KEY)来直接访问内存存储位置的一种数据结构,它通过散列函数计算键值对中键(KEY)的散列地址,然后将值存在此地址上,这样就可以直接根据键来取得所对应的值。
散列函数的冲突
对于不同的键(KEY),散列函数得到同一个散列地址,这种现象称为冲突。
如何处理散列冲突
开放定址法
-
线性探测法:就是一旦冲突了就放到下一个位置就好了,只要存储空间够大总会有位置放的(但是这样会产生堆积,因为他可能会把其他的原来属于别人的位置只是暂时空着的给占了)
-
二次探测法:冲突了就放在1或者2或者3等等的平方后的位置,而不是像前面那样就是单纯的不停地加1,这样就可以不让关键字对集中在一块地方
-
伪随机探测法:用一个种子产生一个随机数来作为位移量来避免冲突,然后最后查找这个数在不在的时候也用这个种子生成随机数来找
当散列表存在"堆积"(在函数地址的表中,散列函数的结果不均匀地占据表的单元,形成区块)的情况时,使用开放定址法的效率大大降低,此时不能再使用开放定址法
-
-
再散列:在上次散列计算发生冲突时,利用该次冲突的散列函数地址产生新的散列函数地址,直到冲突不再发生。这种方法不易产生"堆积",但增加了计算时间。
-
公共溢出区:将所有冲突的键值对放在一个数组中。查找时如果在散列表中没有找到就在数组中顺序查找。
散列表的查找效率
在理想情况下,散列表建立过程中没有出现冲突,那么在散列表中查找的效率则为O(1)。但是这仅是理想情况,散列冲突会影响查找效率,那么影响查找效率的因素就是影响产生冲突的因素:
-
散列函数是否均匀(均匀散列函数是指对于键值对中任意一个键(KEY)经过散列函数得到任意一个地址的概率是相等的)
-
处理散列冲突的方法
-
散列表的载荷因子
其中散列表的载荷因子计算公式为 α = 表中元素个数/表长度