关于哈希函数
- 哈希函数
一种函数H,根据这个函数和查找关键字key,可以直接确定查找值所在位置,这个函数就是哈希函数,而哈希表是基于哈希函数建立的一种查找表 - 哈希冲突
对应不同的关键字(数值)可能获得相同的hash地址 - 哈希冲突解决办法
链地址法:为每个哈希值维护一个链表,并将具有相同哈希值的元素都放入这一链表当中。
如下图
开放地址法:当发现哈希值 hh 处产生冲突时,根据某种策略,从 hh 出发找到下一个不冲突的位置。例如,一种最简单的策略是,不断地检查 h+1,h+2,h+3,\ldotsh+1,h+2,h+3,… 这些整数对应的位置。
再哈希法:当发现哈希冲突后,使用另一个哈希函数产生一个新的地址。 - 扩容
当哈希表元素过多时,冲突的概率将越来越大,而在哈希表中查询一个元素的效率也会越来越低。因此,需要开辟一块更大的空间,来缓解哈希表中发生的冲突。 - 创建哈希表,同时开辟链表
var MyHashSet = function() {
// 创建哈希表,用时开辟链表
this.BASE = 769;
this.data = new Array(this.BASE).fill(0).map(() => new Array());
};
在这里在了解几个函数
- Array()
Array 对象用于在单个的变量中存储多个值。
语法:
new Array();
new Array(size);
new Array(element0, element1, …, elementn);
参数:
参数 size 是期望的数组元素个数。返回的数组,length 字段将被设为 size 的值。
参数 element …, elementn 是参数列表。当使用这些参数来调用构造函数 Array() 时,新创建的数组的元素就会被初始化为这些值。它的 length 字段也会被设置为参数的个数。
返回值:
返回新创建并被初始化了的数组。
如果调用构造函数 Array() 时没有使用参数,那么返回的数组为空,length 字段为 0。
当调用构造函数时只传递给它一个数字参数,该构造函数将返回具有指定个数、元素为 undefined 的数组。
当其他参数调用 Array() 时,该构造函数将用参数指定的值初始化数组。
当把构造函数作为函数调用,不使用 new 运算符时,它的行为与使用 new 运算符调用它时的行为完全一样。
对象属性:
constructor 返回对创建此对象的数组函数的引用。
length 设置或返回数组中元素的数目。
prototype 使您有能力向对象添加属性和方法。
方法: - map()
定义用法:
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测。
注意: map() 不会改变原始数组。
语法:
array.map(function(currentValue,index,arr), thisValue)
什么是哈希映射(HashMap)
HashMap,又称哈希映射或散列图。是一个用于储存键—值对(key-value)的集合,每个键—值对又称Entry,将这些Entry储存在一个数组里,这个数组就为HashMap。
一般初始的HashMap为空,如上图。
而HashMap最主要有两种方法:Put和Get方法。
- get方法
Get方法就是通过Key的值来查找hashMap里相对应的数据 - put方法
Put方法就是将任意数据插入到HashMap中
设置哈希映射
设计哈希映射与设计哈希集合解法接近,唯一的区别在于我们存储的不是key 本身,而是 (key,value) 对。除此之外,代码基本是类似的。
var MyHashMap = function() {
this.BASE = 769;
this.data = new Array(this.BASE).fill(0).map(() => new Array());
};