1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>线性探测法处理碰撞的散列</title> 6 </head> 7 <body> 8 <p>线性探测法隶属于开放寻址散列。当发生碰撞时,检查散列中的下一个位置是否为空。如果为空就将数据存入该位置,不为空继续查下去。</p> 9 <p>如果数组的大小是待存储数据个数的1.5倍,那么使用开链法,如果是两倍及以上,使用线性探测法。</p> 10 <script> 11 function HashTable(){ 12 this.table = new Array(137); 13 this.values = []; 14 this.betterHash = betterHash; 15 this.showDistro = showDistro; 16 this.put = put; 17 this.get = get; 18 } 19 20 function betterHash(data){ 21 const H =37; 22 var total = 0; 23 for(var i=0;i<data.length;i++){ 24 total += H*total + data.charCodeAt(i); 25 26 } 27 total %= this.table.length; 28 if(total <0){ 29 total += this.table.length-1; 30 } 31 console.log(data+"->"+ total % this.table.length); 32 return parseInt(total); 33 } 34 function put(key,data){ 35 36 //线性探测法 37 var pos = this.betterHash(key); 38 if(this.table[pos] == undefined){ 39 this.table[pos] = key; 40 this.values[pos] = data; 41 }else{ 42 while(this.table[pos] != undefined){ 43 pos++; 44 } 45 this.table[pos] = key; 46 this.values[pos] = data; 47 } 48 console.log("values",this.values); 49 console.log("table",this.table); 50 } 51 function showDistro(){ 52 for(var i = 0;i<this.table.length;i++){ 53 if(this.table[i] != undefined){ 54 console.log(this.table[i],":",this.table[i]); 55 } 56 } 57 } 58 function get(key){ 59 var hash = this.betterHash(key); 60 if(hash >-1){ 61 for(var i=hash;this.table[hash] != undefined;i++){ 62 if(this.table[hash] == key){ 63 return this.values[hash]; 64 } 65 } 66 } 67 return undefined; 68 } 69 70 71 var obj = new HashTable(); 72 obj.put("k1","zhangsan"); 73 obj.put("k2","lisi"); 74 obj.put("k3","javascript"); 75 obj.showDistro(); 76 console.log(obj.get("k3")); 77 </script> 78 </body> 79 </html>