哈希表对于数组的操作是特别好用的!
因为js中的对象是基于哈希表结构的,而哈希表的查找时间复杂度为O(1),所以很多人喜欢用对象来做映射,减少遍历循环。
具体参见这篇博文
https://segmentfault.com/a/1190000007692754
简单点来说,我们举个例子:
在计算机中,是怎么存储数据的呢?
我们查找数据的时候,又是怎么查找的呢?
- 计算机存储空间有两个属性:存储地址和所存储的值,机器可以根据给定的存储地址去读写该地址下的值。根据这种结构,假如我们将一块存储空间分成一个一个的格子,然后将这些数据依次塞到每个格子里,接下来我们就可以根据格子编号直接访问格子的内容了。这种方式就是数组(也叫线性连续表):数组头保存整个数组储存空间的起始地址,不同下标代表不同的储存地址的偏移量,访问不同下标所对应的地址就能实现数组元素的读写。所以,很自然就会想到将上述的键值对数据的key映射成数组下标,接着读写数组就变成了读写value值。将key的字符串转换成代表下标数值比较简单,可以用特定的码表(如ASCII)进行转换。
在js中有这样的一个对象,如下图所示:
将key值转换为ASCII值之后,

那么下一个问题来了,就是如果按照他们的索引值,69存放小明;7存放18,10010存放176,那么从69到10010这么巨大的空间居然只存放了8个值,简直是极大的浪费啊!!!!!
所以我们的哈希算法出来了,如果用取模的方式,假设我们要求这些信息要在长度为10的空间里存放,那么name对应的value值可以存放在69%10=9这里,age对应的value值可以存放在7%10=7这里,那如果地址发生冲突了呢?
假设phone:138788中索引的ASCII值为89,89%10=9,与name所存放的地址重合了,怎么解决?


具体的还是要参考那篇博文哦!
网友评论