JavaScript数据结构-12.散列碰撞(线性探测法)

 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>

 

posted @ 2017-07-16 21:27  橙云生  阅读(404)  评论(0编辑  收藏  举报