10、开链法解决散列表保存字典的碰撞问题
2017-01-04 21:55
246 查看
function HashTable(){ this.table = new Array(137); this.hashFunc = hashFunc; this.showDistro = showDistro; this.buildChains = buildChains; this.put = put; this.get = get; } function put(key, data){ var pos = this.hashFunc(key); var index = 0; if(this.table[pos][index] == null){ this.table[pos][index] = key; this.table[pos][index + 1] = data; } else{ while(this.table[pos][index+2] != null){ ++index; } this.table[pos][index + 2] = key; this.table[pos][index + 3] = data; } } function get(key){ var index = 0; var pos = this.hashFunc(key); if(this.table[pos][index] == key){ return this.table[pos][index + 1]; } else{ while(this.table[pos][index + 2] != key){ index += 2; } return this.table[pos][index + 3]; } return null; } function buildChains(){ for(var i=0; i<this.table.length; ++i){ this.table[i] = new Array(); } } function hashFunc(data){ const H = 31; var total = 0; for(var i=0; i<data.length; ++i){ total += H * total + data.charCodeAt(i); } total = total % this.table.length; if(total < 0){ total += this.table.length - 1; } return parseInt(total); } function showDistro(){ log("索引值" + ":" + "ID - 分数"); for(var i=0; i<this.table.length; ++i){ if(this.table[i][0] != null){ var str = i + ": "; for(var j=0; j<this.table[i].length; j+=2){ str += this.table[i][j] + "-" + this.table[i][j + 1] + " "; } log(str); } } } // 生成指定范围的随机数 function getRandomInt(min, max){ return Math.floor(Math.random() * (max - min + 1)) + min; } // 生成随机ID+分数组成的字符串 function getStuData(arr){ for(var i=0; i<arr.length; ++i){ var num = ""; for(var j=1; j<=idLen; ++j){ num += Math.floor(Math.random() * 10); } num += getRandomInt(50, 100); arr[i] = num; } } var log = console.log; log("---------- 散列化字符串字典 ----------"); var names = [{"David": "123"}, {"Jennifer": "456"}, {"Donnie": "789"}, {"Raymond": "111"}, {"Cynthia": "222"}, {"Mike": "333"}, {"Clayton": "345"}, {"Danny": "268"}, {"Jonathan": "999"}]; log("待散列的字符串字典: "); var str = "", i = 0; str += "David: " + names[i++].David + " "; str += "Jennifer: " + names[i++].Jennifer + " "; str += "Donnie: " + names[i++].Donnie + " "; str += "Raymond: " + names[i++].Raymond + " "; str += "Cynthia: " + names[i++].Cynthia + " "; str += "Mike: " + names[i++].Mike + " "; str += "Clayton: " + names[i++].Clayton + " "; str += "Danny: " + names[i++].Danny + " "; str += "Jonathan: " + names[i++].Jonathan + " "; log(str); log(""); log("散列化后的字符串字典: "); var j = 0; var hTable = new HashTable(); hTable.buildChains(); hTable.put("David", names[j++].David); hTable.put("Jennifer", names[j++].Jennifer); hTable.put("Donnie", names[j++].Donnie); hTable.put("Raymond", names[j++].Raymond); hTable.put("Cynthia", names[j++].Cynthia); hTable.put("Mike", names[j++].Mike); hTable.put("Clayton", names[j++].Clayton); hTable.put("Danny", names[j++].Danny); hTable.put("Jonathan", names[j++].Jonathan); hTable.showDistro(); log(""); log("输入键,获取对应的值: "); log("David" + ": " + hTable.get("David")); log("Jennifer" + ": " + hTable.get("Jennifer")); log("Donnie" + ": " + hTable.get("Donnie")); log("Raymond" + ": " + hTable.get("Raymond")); log("Cynthia" + ": " + hTable.get("Cynthia")); log("Mike" + ": " + hTable.get("Mike")); log("Clayton" + ": " + hTable.get("Clayton")); log("Danny" + ": " + hTable.get("Danny")); log("Jonathan" + ": " + hTable.get("Jonathan")); log(""); log(""); log("---------- 散列化整型字典 ----------"); var numStrdents = 10; //学生人数 var idLen = 9; //ID长度 var students = new Array(numStrdents); getStuData(students); log("待散列的整型字典: "); log("ID" + "---" + "分数"); for(var i=0; i<students.length; ++i){ log(students[i].substring(0, idLen) + " " + students[i].substring(idLen)); } log(""); log("散列化后的整型字典: "); var hStuTable = new HashTable(); hStuTable.buildChains(); for(var i=0; i<students.length; ++i){ hStuTable.put(students[i].substring(0, idLen), students[i].substring(idLen)); } hStuTable.showDistro(); log(""); log("输入ID,获取对应的分数: "); for(var i=0; i<students.length; ++i){ var ID = students[i].substring(0, idLen); log(ID + ": " + hStuTable.get(ID)); }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#中遍历Hashtable的4种方法
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- C#将HashTable中键列表或值列表复制到一维数组的方法
- 详解如何选择使用ArrayList、HashTable、List、Dictionary数组
- C#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)
- asp.net基于HashTable实现购物车的方法
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- 详解C#中HashTable的用法
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- JAVASCRIPT HashTable
- js实现hashtable的赋值、取值、遍历操作实例详解
- java HashMap和HashTable的区别详解