哈希表原理
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
记录的存储位置=f(关键字)
这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。
哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数即哈希函数转换成一个整型数字,将value存储在以该数字为下标的数组空间里。
而当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value。
数组的特点:寻址容易,插入和删除困难
链表的特点:寻址困难,插入和删除容易
而哈希表结合了数组和链表的优点,节省了空间时间,如下图:
常见的哈希函数有:
1、直接定址法
2、数字分析法
3、平方取中法
4、折叠法
5、除留余数法
(最重要的还有冲突处理方法,明天继续完善~~)
哈希表应用
LeetCode第1题 两数之和 (哈希解法)
第一次做的时候第一反应只想到了“暴力法”,看完答案发现还有哈希法,但是第一次没看懂,(哈希表能懂,题目意思也能懂,但就是看不懂哈希的思想是怎么应用的,很痛苦。。。。好在今天在Deng同学的提示下开窍了 嘻嘻~~)
其实这里用了哈希函数很巧妙的思路,题目中要求求两数之和,给定一个数组和一个目标和值,求数组中和为给定值的两个数(不能重复利用数组中的相同元素),假设我们要求的两个数为a和b(未知),给定的和值为target(已知),其实是是求a+b=target的a和b,而a和b存在于数组中。那么这里可以构造哈希函数:value=target-key。在构造哈希表的时候,直接将关键值为a的key存贮到value为 target-key的数组里(不知道我讲清楚了没有,总之觉得很巧妙~)
附上代码:
速度比暴力法提高了好多:
LeetCode202题 Happy number
问题描述:设计一个算法,判断一个数字是否是“快乐数”。快乐数的定义如下:一个正整数,计算出它各位数字的平方和,得到一个新的数字,再对这个新的数字重复这一过程,直到最后得到数字1或是其他某几个数字的无限循环。在这些数字中,经过上述流程最终能得到数字1的数字,被称为“快乐数”。
分析:整个算法的设计分为两步
第一步:计算下一个数
第二步:判断数值是否是快乐数
算法分两步进行,第一步计算下一个数,第二步做判断,可以一个哈希表保存计算过的数,如果出现1就直接返回True,如果出现重复(已存在哈希表中的)的非1的数,就直接返回不是,其他情况继续。
代码: