Относно серията #data-structures
Поредицата #data-structures е колекция от публикации за повторно внедрени структури от данни в JavaScript.
Ако не сте запознати със структурите от данни, кратко въведение и пълният списък на повторно внедрени структури от данни можете да намерите в въвеждащата публикация от поредицата за структури от данни в JavaScript.
Ако се чувствате добре с концепцията на всяка структура от данни и искате да видите само кода, погледнете обобщената публикация на поредицата. Той премахва всички обяснения и съдържа само JavaScript кода за всички структури от данни, обсъждан в поредицата.
Вземете кода от Github
Разбира се, целият код може да бъде намерен и в Github в хранилището data-structures-in-javascript.
Определение
Хеш таблица (хеш карта) е структура от данни, използвана за внедряване на асоциативен масив, структура, която може да съпоставя ключове със стойности. Хеш таблицата използва хеш функция за изчисляване на индекс в масив от кофи или слотове, от които може да бъде намерена желаната стойност. От Уикипедия
Хеш таблиците се считат за по-ефективната структура на данни за търсене и поради тази причина те се използват широко.
Сложност
Средно аритметично:
Достъп =› -, Търсене =› O(1), Вмъкване =› O(1), Изтриване =› O(1)
За да получите пълен преглед на времевата и пространствената сложност на структурата на данните на хеш-таблицата, вижте този отличен Big O cheat sheet.
Кодът
Тъй като функцията ми CalculateHash е прекалено проста (мода на дължината на ключа), трябва да съм сигурен, че мога да запазя повече от една стойност за всеки хеш. В резултат на това съхранявам друг обект за всеки хеш в моята хеш таблица.
По-добър пример би имал функция CalculateHash, която връща само един възможен хеш за всеки ключ. Можех да направя това с обикновен JavaScript обект (хешът е същият като ключа), но спецификата на структурата на данните на таблицата с хеширане е да има тази специална функция CalculateHash.
function HashTable(size) { this.values = {}; this.numberOfValues = 0; this.size = size; } HashTable.prototype.add = function(key, value) { var hash = this.calculateHash(key); if(!this.values.hasOwnProperty(hash)) { this.values[hash] = {}; } if(!this.values[hash].hasOwnProperty(key)) { this.numberOfValues++; } this.values[hash][key] = value; }; HashTable.prototype.remove = function(key) { var hash = this.calculateHash(key); if(this.values.hasOwnProperty(hash) && this.values[hash].hasOwnProperty(key)) { delete this.values[hash][key]; this.numberOfValues — ; } }; HashTable.prototype.calculateHash = function(key) { return key.toString().length % this.size; }; HashTable.prototype.search = function(key) { var hash = this.calculateHash(key); if(this.values.hasOwnProperty(hash) && this.values[hash].hasOwnProperty(key)) { return this.values[hash][key]; } else { return null; } }; HashTable.prototype.length = function() { return this.numberOfValues; }; HashTable.prototype.print = function() { var string = ‘’; for(var value in this.values) { for(var key in this.values[value]) { string += this.values[value][key] + ‘ ‘; } } console.log(string.trim()); }; var hashTable = new HashTable(3); hashTable.add(‘first’, 1); hashTable.add(‘second’, 2); hashTable.add(‘third’, 3); hashTable.add(‘fourth’, 4); hashTable.add(‘fifth’, 5); hashTable.print(); // => 2 4 1 3 5 console.log(‘length gives 5:’, hashTable.length()); // => 5 console.log(‘search second gives 2:’, hashTable.search(‘second’)); // => 2 hashTable.remove(‘fourth’); hashTable.remove(‘first’); hashTable.print(); // => 2 3 5 console.log(‘length gives 3:’, hashTable.length()); // => 3
Първоначално публикувано в blog.benoitvallon.com.