哈希表Python

哈希表原理

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
记录的存储位置=f(关键字)
这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。
哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数即哈希函数转换成一个整型数字,将value存储在以该数字为下标的数组空间里。
而当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value。

数组的特点:寻址容易,插入和删除困难
链表的特点:寻址困难,插入和删除容易
而哈希表结合了数组和链表的优点,节省了空间时间,如下图:
在这里插入图片描述
参考博文:https://blog.csdn.net/yyyljw/article/details/80903391(很容易理解)

常见的哈希函数有:
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的数,就直接返回不是,其他情况继续。
代码:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值