<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>哈希表的封装</title> </head> <body> <script> function hashFunc(str, size) { var hashCode = 0; //霍纳算法 for (var i = 0; i < str.length; i++) { hashCode = 37 * hashCode + str.charCodeAt(i); } var index=hashCode%size return index } function HashTable(){ this.storage=[] this.count=0 this.limit=7*2 //方法 HashTable.prototype.put=function(key,value){ //根据key获取对应的index var index=this.hashFunc(key,this.limit) //根据index取出对应的bucket var bucket=this.storage[index] //、 if(bucket==null){ bucket=[], this.storage[index]=bucket } for(var i=0;i<bucket.length;i++){ var tuple=bucket[i] if(tuple[0]==key){ tuple[1]=value return } } bucket.push([key,value]) this.count+=1 //判断是否需要扩容 if(this.count>this.limit*0.75){ this.resize(this.limit*2) } } HashTable.prototype.get=function(key){ // var index=this.hashFunc(key,this.limit) //根据index取出对应的bucket var bucket=this.storage[index] if(bucket==null){ return null } 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) //根据index取出对应的bucket var bucket=this.storage[index] if(bucket==null){ return null } for(var i=0;i<bucket.length;i++){ var tuple=bucket[i] if(tuple[0]==key){ bucket.splice(i,1) this.count-- return tuple[1] if(this.limit>7&&this.count<this.limit*0.25){ this.resize(Math.floor(this.limit/2)) } } } return null } HashTable.prototype.isEmpty=function(key){ return this.count==0 } HashTable.prototype.size=function(key){ return this.count } HashTable.prototype.resize=function(key){ var oldStorage=this.storage //重置所有的属性 this.storage=[] this.count=0 this.limit=newLimit for(var i=0;i<bucket.length;i++){ var bucket=oldStorage[i] if(bucket==null){ continue } for(var j=0;j<bucket.length;j++){ var tuple=bucket[j] this.put(tuple[0],tuple[1]) } } } } </script> </body> </html>