先说数组,数组优点之一:能通过索引很快定位到值,hashmap 就是利用了数组这个优点。
对比:
线性映射:定义一个数组 ,数组的元素是结构体,结构体包括 一对键,值。
伪代码表示 a[0] = struct{ "Bill" ,5} ,a[1] = struct{ "KK" ,6}
这样我们就可以通过键来找值,也就是先遍历找到“bill”,在通过bill的索引找到5。
这种方法最慢(ps:平均找n/2次,n为数组元素个数)
Hash映射:线性映射之所以慢,是因为你要遍历找Bill,这会花费很长时间。如果说能快速定位到Bill
那速度将会大大提高,那怎么样实现呢?
方法:
Bill------------------------------>Hash函数------------------------------->索引,将Bill 对应的值存入这个a[索引]
取得时候也一样,通过Hash函数定位到索引,取出值。
这样就将 线性映射遍历的时间 转换 Hash函数运行的时间
如果数组越长 线性映射遍历的时间 会大大增加 ,但对Hash函数却影响不大,大大缩短时间。
hash函数特点 :
- 输入x可以是任意长度的字符串
- 输出结果即H(x)的长度是固定的
- 计算 H(x) 的过程是高效的(对于长度为 n 的字符串 x ,计算出 H(x) 的时间复杂度应为 O(n) )
- 输入不同的值,出来的也必须不同。
- 不能通过输出的值反推输入的值
hash函数构造 :
不会! 调用库他不香吗