哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数。
1.哈希表是一种数据结构。
2.用哈希表和数组对比学习,数组中存放的是单独的数据(类似于函数中的y),而哈希表存放的是键值对(类似于函数中的(x,y)),键值对由两部分构成,分别为key(关键值)和value(数值),key对应函数中的x,value对应函数中的y,我们根据哈希函数也就是函数中的f(x)来通过key寻找value。
3.根据例题来进一步理解:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/two-sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
用哈希表法求解:我们要求两个数的和为9,只需要把每个数放入表中,然后检查 target-目标数值是否在表中就可以了。
以为我们最终结果为两个数组的下标,如[0,1] 所以我们把数组下表设置为value,我们通过num数值来确定该数值对应数组的下标是否满足我们的要求,所以是通过数值num来确定结果,所以我们把num定位关键值key。
对于例题:
开始阶段,哈希表中为空,计算target-2=6,由于哈希表中为空白(没有key=6),所以将数值2和数组下标0(key=6,value=0)放入表中
key | 2 | |||
value | 0 |
接下来,计算target-7=2,比较后得出2在哈希表中,所以返回key=2的value值0以及当前数值得下标1,也就是[0,1].
4.进一步讨论,如果题目条件变更,允许两个7存在,如nums=[2,7,7],该如何存放,这一类问题被称为哈希冲突
解决方法有两种:一是开放寻址法,二是拉链法。
开放寻址法就是如果位置被占了,那找其他的位置呢,这里 很多的实现方法, 最基本的就是看该位置的后一个位置是否可用,也就是1的位置被占用了,就看2的位置,如果没有被占用,那就放到这里,如果2的位置也被占用了,那就继续往下看3的位置,依次类推,直到找到空位置。
拉链法就是在存储键值对的同时多存储一个next指针,这个指针指向第二个结果,第二个结果的指针指向第三个结果以此类推。也就是说,key=7对应的value不仅仅是1了,他还对应next指针指向的数值,如果我们把第二个7存储在下标2处那指针就指向2,如果存在下标等于n处,那指针指向n
key | 2 | 7 |
value | 0 | 1 |
next | ——> |
key | 7 | |
value | 2 | |
next | .... |