持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
前言
哈希表实际上在js中一直在用的对象{a:1},在代码中是对象的语法来写,但是在硬件或者机器中都是有序的存储,在对象中key和value中,根据key查找到value因为它是一一对应,通过hashTable哈希表、散列表,而且应用非常广泛
哈希表
每个key都有哈希算法,通过该算法把它转换成一组数字,随后把这组数字加起来落到命名空间内,这就是哈希算法后生成的数组
该数组内第一个位置存储着对象内value,第二个存储着哈希函数算法,每次像根据key查找value时,先把key算一次哈希值,随后去数组中取第一个位置的值,这样就把存储的数据取出
哈希函数
由于数组空间是有限的,并哈希算法设计出现了问题,就会出现哈希结果是相同的结果,数组的命名空间是无限的,但哈希算法后的数组是有限的空间,所以会出现碰撞的问题
-
哈希算法的特点 哈希算出来的值,尽可能均匀分布,源数据小修改会让哈希值的变化比较大,这样就解决了数据比较相似,距离过近导致的碰撞
-
碰撞问题 无论哈希函数设计的很好,但还是出现碰撞,最好的解决办法是扩容,原本长度为
N的数组,最后扩展成N+1长度的数组,也可以通过链表存储解决,如果发生碰撞,在数组中不直接存储名字,而存储key:value,链表都有next属性,如果碰撞来临,则把next属性指向一个新的存储空间即可
链表的特点:无论怎么存储,只要算出稳定的哈希值,再去数组中查找,所以它的查找复杂度为
O/1,但是数据量大的时候会导致存储空间会增大
重复序列之哈希表
- 用对象实现一个哈希表,它存放的
key,是一堆字符串,它的value存储的是次数,并定义指针来记录循环次数
let times = {}
let res = []
var item = 0;
- 循环
它的条件是循环肯定不能超过数组的总长度,随后截取长度是10个,并往
times中添加
while(i+10 <= temp.legnth){
var se = s.slice(i,i+10)
i++
}
如果第一次遇到便进行存储,如果是第二次遇到,则把它存储到res中
time[se] = times[se]+1 || 1
if(times[se] == 2){
res.push(se)
}