散列--算法笔记

散列

引例:N={8,3,7,6,2},M ={7,4,2},问这M个数中的每个数是否在N中出现过。M,N最直观的思路就是就是遍历,时间复杂度O(MN),当M和N都很大的时候,是无法承受的。

解法:空间换时间,定义一个bool型数组hashTable[100010],其中hashTable[x]==true表示正整数x在N个正整数中出现过。这样就可以在一开始读入N个正整数的时候就进行预处理。

这种直接把输入的数作为数组下标的方式是很好的,但是,它可以处理的数据毕竟有限,要是数字再大一些,或者输入的是字符串,这样直接作为数组下标的方式就不能用了。

解决方法:通过一个函数(散列函数),将输入的元素转换为整数,使得该整数可以唯一的代表这个元素。

不进行展开了,一般来说,可以使用map就直接使用hash功能了,C++11以后可以使用unordered_map。速度更快。

 

字符串hash:把A-Z作为0-25,把a-z作为26-51,相应地就转换称五十二进制与10进制的转换的问题。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值