语雀入口
https://www.yuque.com/along-n3gko/ezt5z9
介绍
散列是一种常用的数据存储技术,散列后的数据可以快速的插入或取用。散列所使用的数据结构叫散列表。
散列算法的作用是尽可能的在数据结构中找到一个值。
基本特点:插入,删除,取用数据都非常快,但是查询效率很低,如果你希望快速查找一般是借助其他的数据结构,比如二叉查找树。
示例
我们将要使用最常见的散列函 数——“lose lose”散列函数,方法是简单地将每个键值中的每个字母的ASCII值相加。
HashTable类
先实一个简单的散列函数,它是HashTable类中的一个私有方法:
1 var loseloseHashCode = function (key) { 2 var hash = 0; //存储ASCII总和 3 for (var i = 0; i < key.length; i++) { //对key值遍历 4 hash += key.charCodeAt(i); //计算每个字符的ASCII值相加 5 } 6 return hash % 37; //和任意数做除法 7 };
完整代码
1 class hashTable { 2 constructor() { 3 this.table = new Array(7); 4 } 5 put(key) { 6 let pos = this.loseloseHashCode(key); 7 this.table[pos] = key; 8 9 } 10 get(key) { 11 return table[loseloseHashCode(key)]; 12 } 13 remove(key) { 14 table[loseloseHashCode(key)] = undefined; 15 } 16 showDistro() { 17 let n = 0; 18 for (let i = 0, len = this.table.length; i < len; ++i) { 19 if (this.table[i] !== 'undefined') { 20 console.log(`${i}:${this.table[i]}`) 21 } 22 } 23 } 24 loseloseHashCode(key) { 25 var hash = 0; 26 for (var i = 0; i < key.length; i++) { 27 hash += key.charCodeAt(i); 28 } 29 console.log('hashValue:' + hash) 30 return hash % this.table.length; 31 } 32 } 33 34 let dataa = ['Clayton', 'Raymond', 'kitty', 'Miachale']; 35 let htable = new hashTable(); 36 dataa.forEach(item=>{ 37 htable.put(item) 38 }) 39 htable.showDistro() 40 41 //执行结果 42 hashValue:730 43 hashValue:730 44 hashValue:565 45 hashValue:788 46 0:undefined 47 1:undefined 48 2:Raymond 49 3:undefined 50 4:Miachale 51 5:kitty 52 6:undefined
结论:simpleHash在计算某些值的哈希值时,会有键一样而丢失的情况,那么需要一个更好的散列函数。