概念和结构
- 散列表是根据关键码值(Key value)而直接进行访问的数据结构。
- 若关键字为
k
,则其值存放在f(k)
的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f
为散列函数,按这个思想建立的表为散列表。
哈希表的操作
哈希表有三种常用操作,分别为
- 添加元素
put(key, value)
- 通过键移除元素
remove(key)
- 由键获取值
get(key)
JS实现
JS里面的哈希表结构需要通过数组(array)来实现,因为JS中只有数组才有快速定位的能力。
var HashTable = function(){
var hashTable = [];
//定义散列函数loseloseHashCode
function loseloseHashCode(key){
var hashcode = 0;
for(var i = 0; i < key.length; i++){
hashcode += key[i].charCodeAt();
}
return hashcode % 37;
}
//添加元素
this.put = function(key , value){
hashTable[loseloseHashCode(key)] = value;
}
//移除元素
this.remove = function(key){
hashTable[loseloseHashCode(key)] = undefined;
}
//获取元素值
this.get = function(key){
return hashTable[loseloseHashCode(key)];
}
}
哈希冲突
不同关键字的哈希函数值可能相同,这种现象称之为哈希冲突。
有两种解决方法:
- 分离链接法
- 线性探查法
分离链接法
分离链接法就是将散列值相同的所有元素保留到同一个链表中。
分离链接法的JS实现
因为要将哈希函数值相同的所有元素都保存到一个链表中,因此我们需要用到链表这个类。这个类在之前我们已经实现过了,如果有不清楚的同学可以前往JavaScript数据结构——链表(Linked List)。
var HashTable = function(){
//定义辅助类
var Node = function(key , value){
this.key = key;
this.value = value;
}
var hashTable = [];
//定义散列函数