9、开链法解决散列表碰撞问题
2017-01-04 21:52
232 查看
// 散列法(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();
相关文章推荐
- 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的区别详解