Hash函数和Hash表一般被翻译为“散列”,也叫做哈希!
什么是散列表(哈希表):
基本概念
是根据key value而直接进行访问的一种数据结构!它可以通过把关键码映射到表中一个关键位置来访问记录,增加查找的速度!实际上,哈希表是算法在时间和空间上做出权衡的例子!
其中这个映射函数叫做哈希函数,存放记录的数组叫做哈希表
**详细解释:**就是把任意长度的输入,通过散列算法,变化为固定长度的输出,该输出值就是散列值!
而且,这种转化也是一种压缩映射!也就是说,散列值的空间一般情况下远远小于输入的空间,不同的输入可能会又散列相同的输出,(使用散列的查找算法就分俩步:第一步是用散列函数将被查找的键转化为数组的一个索引,,散列查找的第二步就是一个处理碰撞冲突的过程,)
具体实现和做法
就是key value通过一个固定的算法(什么算法?也就是哈希函数,下列介绍)转换为一个整型数字,然后就将该数字对数组长度进行取余这个过程也就是将键key value转换为数组的索引
怎么找到散列函数?
我们要找的散列函数应该易于计算并且能够据暖分布所有的键,散列函数和键堵塞类型有关
-
正整数
将整数散列最常用方法是除留余数法。我们选择大小为素数M 的数组, 423 23 35
对于任意正整数k, 计算k 除以M 的余数。 -
浮点数
我们可以将它乘以M并四舍五入得到一个0 至M-1 之间的索引值,但是有弊端,高位的作用更大,最低位对结果没有影响 -
字符串:
c++中 to_string()函数!也就是能够返回一个非负16位整数 -
组合键
哈希表:
Hash Table的查询速度非常的快,几乎是O(1)的时间复杂度。
维护一个Key为Query字串,Value为该Query出现次数的HashTable,每次读取一个Query,如果该字串不在Table中,那么加入该字串,并且将Value值设为1;
如果该字串在Table中,那么将该字串的计数加一即可。最终我们在O(N)的时间复杂度内完成了对该海量数据的处理。
再并补充