散列--算法笔记

散列

引例: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进制的转换的问题。

发布了98 篇原创文章 · 获赞 2 · 访问量 3700

猜你喜欢

转载自blog.csdn.net/qq_30377869/article/details/105024758