12、线性探测法解决散列表保存字典的碰撞问题

来源:互联网 发布:什么云计算 编辑:程序博客网 时间:2024/06/06 01:55
function HashTable(){this.table = new Array(137);this.values = new Array();this.hashFunc = hashFunc;this.showDistro = showDistro;this.put = put;this.get = get;}function put(key, data){var pos = this.hashFunc(key);if(this.table[pos] == null){this.table[pos] = key;this.values[pos] = data;}else{while(this.table[pos] != null){++pos;}this.table[pos] = key;this.values[pos] = data;}}function get(key){var pos = -1;pos = this.hashFunc(key);if(pos > -1){for(var i=pos; this.table[pos] != null; ++i){if(this.table[pos] == key){return this.values[pos];}}}return null;}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] != null){var str = i + ": ";str += this.table[i] + " - " + this.values[i] + " ";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.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();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(i + " - " + ID + ": " + hStuTable.get(ID));}

0 0