实现一个哈西函数
// 设计哈西函数
// 1.将字符串转为比较大的数字,这个数字成为hashCode
// 2.将hashCode压缩到某一个数组的范围之内
function hashFunc(str,size){
var hashCode = 0
// 霍纳法则计算hashCode的值
// eg:cats
for(var i=0;i<str.length;i++){
// 常用37做此时的质数处理
hashCode = 37 * hashCode + str.charCodeAt(i)
}
// 进行取模运算,获取下标值
var index = hashCode % size
return index
}
哈希表的封装
function HashTable(){
// 属性
this.storage = [] //当前数组
this.count = 0 //已经存放的数据总数
this.limit = 7 //当前数组的总长度
// loadFactor < 0.25 的时候进行缩容器
// loadFactor > 0.75 的时候进行扩容
// 方法
HashTable.prototype.hashFunc = function(str,size){
var hashCode = 0
// 霍纳法则计算hashCode的值
// eg:cats
for(var i=0;i<str.length;i++){
// 常用37做此时的质数处理
hashCode = 37 * hashCode + str.charCodeAt(i)
}
// 进行取模运算,获取下标值
var index = hashCode % size
return index
}
// 数据的插入与修改
HashTable.prototype.put=function(key,value){
// 1.根据key获取index
var index = this.hashFunc(key,this.limit)
// 根据index取出对应的桶
var bucket = this.storage[index]
// 如果对应的位置没有桶那么就进行新创建
if(!bucket){
bucket = []
this.storage[index] = bucket
}
// 判断是否是修改数据
for(var i=0;i<bucket.length;i++){
var tuple = bucket[i] //此时bucket的每一个元素也是数组的形式
if(tuple[0] == key){
tuple[1] = value
return
}
}
// 进行添加
bucket.push([key,value])
this.count += 1
}
}
实现哈希表的获取方法
HashTable.prototype.get=function(key){
var index = this.hashFunc(key,this.limit)
var bucket = this.storage[index]
if(!bucket){
return null
}else{
for(var i=0;i<bucket.length;i++){
var tuple = bucket[i]
if(tuple[0] == key){
return tuple[1]
}
}
return null
}
}
实现哈希表的删除方法
HashTable.prototype.remove=function(key){
var index = this.hashFunc(key,this.limit)
var bucket = this.storage[index]
if(!bucket){
return null
}else{
for(var i=0;i<bucket.length;i++){
var tuple = bucket[i]
if(tuple[0] == key){
// 从bucket数组中删除当前元素i
bucket.splice(i,1)
// 总数减少
this.count--
// 返回当前删除的元素
return tuple[1]
}
}
return null
}
}
实现其他的方法
// 判断哈希表是否为空
HashTable.prototype.isEmpty=function(){
return this.count ==0
}
// 哈希表长度
HashTable.prototype.size=function(){
return this.count
}