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>