散列表
一、概念
散列表也被称作哈希表(hash table),这种数据结构对查询操作来说是很快的,它提供了键(key)和值(value)的映射关系,只要给出一个键(key),就能找到那个值,时间复杂度接近O(1)。有没有发现,散列表和数组很像,通过一个值去找另一个值,其实散列表就是利用了数组支持下标随机访问的特性,这样说来,散列表其实是可以看做数组的扩展,可以说,没有数组就没有散列表。
二、散列函数(哈希函数)
散列函数,我们把它定义成hash(key),其中key表示元素的键值,hash(key)的值表示经过散 列函数计算得到的散列值。构造一个散列函数的条件:
1、散列函数计算得到的散列值是一个大于0的整数;
2、如果两个Key值相等,则散列值是相等的;反之不相等。
三、散列表的操作
(1)写入数据将新的键值对写入散列表。 但是当插入的数据越来越多,很容易发生 哈希冲突
解决哈希冲突的两种方法:
开放寻址法
当一个位置被占用时,就去寻找下一个有空的位置。
方法有:
线性探测法:就是挨着挨着去查有没有空位,hash(key)+1.....。
二次探测法:就是hash(key)+1^2,hash(key)+2^2.......这样
双重散列:使用几个散列函数。
链表法
在散列表中,每个桶会对应⼀条链表,所有散列值相同的元素都放到相同槽位对应的链表中,差不多就像分类格子一样,当有冲突时,放在链表中就可以。 (2)读取数据
利用给定的key,找到value。
(3)散列表扩容的条件
当散列表的当前长度(Capacity)和负载因子(LoadFactor)相乘<=hashMap.Size时该扩容。