9、开链法解决散列表碰撞问题

来源:互联网 发布:.cn溢价域名续费价格 编辑:程序博客网 时间:2024/05/21 04:19
// 散列法(Hashing)或哈希法是一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法。由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。// 散列函数先计算字符串中各字符的ASCII码值,求和时每次要乘以一个质数后得到一个散列值,作为散列数组的索引。// 如果数组的大小是待存储数据个数的1.5倍,则使用开链法。// 开链法解决碰撞问题:在创建散列数组时,通过调用一个函数创建一个新的空数组,然后将该数组赋给散列数组的每一个元素,这样即使两个键散列后的值相同,依然被保存在同样的位置,只不过它们在第二个数组中的位置不一样,这样就解决了碰撞问题。function HashTable(){this.table = new Array(137);this.hashFunc = hashFunc;this.showDistro = showDistro;this.buildChains = buildChains;this.put = put;this.get = get;}function put(data){var pos = this.hashFunc(data);var index = 0;if(this.table[pos][index] == null){this.table[pos][index] = data;}else{while(this.table[pos][index] != null){++index;}this.table[pos][index] = data;}}function get(data){var index = 0;var pos = this.hashFunc(data);if(this.table[pos][index] == data){return this.table[pos][index];}else{while(this.table[pos][index] != data){index += 1;}return this.table[pos][index];}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("索引值" + ":" + "对应的元素值");for(var i=0; i<this.table.length; ++i){if(this.table[i][0] != null){log(i + ": " + this.table[i]);}}}// 生成指定范围的随机数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", "Jennifer", "Donnie", "Raymond", "Cynthia", "Mike", "Clayton", "Danny", "Jonathan"];log("待散列的字符串: ");var str = "";for(var i=0; i<names.length; ++i){str += names[i] + " ";}log(str);log("");log("散列化后的字符串: ");var hTable = new HashTable();hTable.buildChains();for(var i=0; i<names.length; ++i){hTable.put(names[i]);}hTable.showDistro();log("");log("---------- 散列化整型键 ----------");var numStrdents = 9;//学生人数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]);}hStuTable.showDistro();

                                             
0 0