因为最近开始练习写做,文章所涉及的资料来自互联网整理和我的总结,意在于我的学习和经验汇总,若有什么地方侵权,请联系本人删除!
今天继续数据结构系列 哈希表 hash-table,看一代码实现
构造函数以下node
/** * @param {number} hashTableSize */ constructor(hashTableSize = defaultHashTableSize) { // Create hash table of certain size and fill each bucket with empty linked list. this.buckets = Array(hashTableSize).fill(null).map(() => new LinkedList()); // Just to keep track of all actual keys in a fast way. this.keys = {}; }
hash 方法数据结构
/** * Converts key string to hash number. * * @param {string} key * @return {number} */ hash(key) { // For simplicity reasons we will just use character codes sum of all characters of the key // to calculate the hash. // // But you may also use more sophisticated approaches like polynomial string hash to reduce the // number of collisions: // // hash = charCodeAt(0) * PRIME^(n-1) + charCodeAt(1) * PRIME^(n-2) + ... + charCodeAt(n-1) // // where charCodeAt(i) is the i-th character code of the key, n is the length of the key and // PRIME is just any prime number like 31. const hash = Array.from(key).reduce( (hashAccumulator, keySymbol) => (hashAccumulator + keySymbol.charCodeAt(0)), 0, ); // Reduce hash number so it would fit hash table size. return hash % this.buckets.length; }
set 方法app
/** * @param {string} key * @param {*} value */ set(key, value) { const keyHash = this.hash(key); this.keys[key] = keyHash; const bucketLinkedList = this.buckets[keyHash]; const node = bucketLinkedList.find({ callback: (nodeValue) => nodeValue.key === key }); if (!node) { // Insert new node. bucketLinkedList.append({ key, value }); } else { // Update value of existing node. node.value.value = value; } }
delete 方法函数
/** * @param {string} key * @return {*} */ delete(key) { const keyHash = this.hash(key); delete this.keys[key]; const bucketLinkedList = this.buckets[keyHash]; const node = bucketLinkedList.find({ callback: (nodeValue) => nodeValue.key === key }); if (node) { return bucketLinkedList.delete(node.value); } return null; }
get 方法学习
/** * @param {string} key * @return {*} */ get(key) { const bucketLinkedList = this.buckets[this.hash(key)]; const node = bucketLinkedList.find({ callback: (nodeValue) => nodeValue.key === key }); return node ? node.value.value : undefined; }
has 方法this
/** * @param {string} key * @return {boolean} */ has(key) { return Object.hasOwnProperty.call(this.keys, key); }
getKeys
方法code
/** * @return {string[]} */ getKeys() { return Object.keys(this.keys); }
至此,已经实现了一个简单hash-table!!!ci