Хешування в JavaScript

Хешування — це популярна техніка, яка використовується для якнайшвидшого зберігання та отримання даних. Основна причина використання хешування полягає в тому, що воно виконує вставку, видалення, пошук та інші операції

Навіщо використовувати хешування?

У хешуванні всі операції, такі як вставка, пошук і видалення, можуть виконуватися за O(1), тобто постійний час. Найгірша часова складність для хешування залишається O(n), але середня часова складність випадку дорівнює O(1).

HashTable

Використовується для створення нової хеш-таблиці.

Синтаксис:

// function to delete a key from the hashtable  delete (key) {  const index = this._setKey(key);  if (this.table[index]) {  this.table[index] = [];  this.size--;  return true;  } else {  return false;  } } 

Основні операції з синтаксисом

отримати:

Використовується для пошуку ключа в хеш-таблиці та повернення значення, пов’язаного з цим ключем.

Синтаксис:

// function inside hashtable class to  // access a value using its key get(key) {  const target = this._setKey(key);  return this.table[target]; } 

Вставити:

Використовується для вставки нової пари ключ-значення в хеш-таблицю.

Синтаксис:

// function to insert a value in the  // hash table using setKey function insert(value) {  const index = this._setKey(value);  this.table[index] = value;  this.size++; } 

пошук:

Використовується для пошуку значення.

Синтаксис:

// search a value (by getting its  // key using setKey function) search(value){  const index = this._setKey(value);  if(this.table[index]==value)  console.log('The value is found at index : ',index);  else  console.log('Not found'); } 

Видалити:

Використовується для видалення певної пари ключ-значення з хеш-таблиці.

Синтаксис:

// function to delete a key from the hashtable  delete (key) {  const index = this._setKey(key);  if (this.table[index]) {  this.table[index] = [];  this.size--;  return true;  } else {  return false;  } } 

Компоненти хешування в Javascript

1. Хеш-таблиця: Хеш-таблиця є узагальненням масиву. Це надає функціональні можливості, у яких колекція даних зберігається таким чином, що можна легко знайти ці елементи пізніше, якщо потрібно. Це робить пошук елемента дуже ефективним.

2. Хеш-функція: Хеш-функція використовується для перетворення даного ключа в певний індекс слота. він використовується для відображення кожного можливого ключа в унікальний індекс слота. Якщо кожен ключ відображається в унікальному індексі слота, тоді хеш-функція відома як ідеальна хеш-функція. Дуже складно створити ідеальну хеш-функцію, але наша робота як програміста полягає в тому, щоб створити таку хеш-функцію, за допомогою якої буде якомога менше колізій.

Хороша хеш-функція повинна мати такі властивості:

  • Ефективно обчислюється.
  • Слід рівномірно розподілити ключі (Кожна позиція таблиці однаково ймовірна для кожної).
  • Слід звести до мінімуму зіткнення.
  • Повинен мати низький коефіцієнт завантаження (кількість елементів у таблиці поділена на розмір таблиці).

3. Усунення зіткнень: Оскільки хеш-функція отримує невелике число для великого ключа, існує ймовірність того, що два ключі дадуть одне й те саме значення. Ситуація, коли щойно вставлений ключ відображається на вже зайнятий слот у хеш-таблиці, називається зіткненням і має бути оброблено за допомогою певної техніки обробки зіткнень. Нижче наведено способи вирішення конфліктів:

  • Зв'язування: Ідея полягає в тому, щоб кожна клітинка хеш-таблиці вказувала на пов’язаний список записів, які мають однакове значення хеш-функції. Зв'язування є простим, але вимагає додаткової пам'яті поза таблицею.
  • Відкрита адресація: При відкритій адресації всі елементи зберігаються в самій хеш-таблиці. Кожен запис таблиці містить або запис, або NIL. Під час пошуку елемента ми розглядаємо слоти таблиці по черзі, поки не знайдемо потрібний елемент або не стане ясно, що елемента немає в таблиці.

Реалізація з прикладом:

Крок 1: Створіть клас HashTable із початковими властивостями таблиці та розміру.

крок 2: Додайте приватну функцію setKey(key), щоб перетворити ключі на індекси.

крок 3: Додайте функції insert() і get() для додавання та доступу до пар ключ-значення з таблиці.

крок 4: Додайте функцію remove(), щоб видалити ключ із хеш-таблиці.

приклад 1: Припустимо, ми маємо зберегти 5 чисел 100, 87, 86, 12, 25 і 9 у хеш-таблиці. У цьому випадку ми створимо функцію setKey, у якій ми візьмемо значення як аргумент і перетворимо його на індекс хеш-таблиці. Нижче наведено реалізацію.

Javascript




// HashTable Implementation> class HashTable {> > constructor() {> > this> .table => new> Array(10);> > this> .size = 0;> > }> > // private function to convert key to index> > // _ shows that the function is private> > _setKey(key) {> > return> key % 10;> > }> > // insert value in the hashtable> > insert(value) {> > const index => this> ._setKey(value);> > this> .table[index] = value;> > this> .size++;> > }> > get(key) {> > const target => this> ._setKey(key);> > return> this> .table[target];> > }> > search(value) {> > const index => this> ._setKey(value);> > if> (> this> .table[index] == value)> > console.log(> 'The value is found at index : '> , index);> > else> > console.log(> 'Not found'> );> > }> > delete> (key) {> > const index => this> ._setKey(key);> > if> (> this> .table[index]) {> > this> .table[index] = [];> > this> .size--;> > return> true> ;> > }> else> {> > return> false> ;> > }> > }> }> const hashExample => new> HashTable();> // insert> hashExample.insert(100);> hashExample.insert(87);> hashExample.insert(86);> hashExample.insert(12);> hashExample.insert(9);> console.log(hashExample.table);> // ->показує хеш-таблицю> // search> hashExample.search(87);> // found> hashExample.search(10);> // not found> // delete> hashExample.> delete> (12);> // showing table after deletion> console.log(hashExample.table);>

Вихід:

[ 100,  ,  12,  ,  86,  87,  ,  9 ] The value is found at index : 7 Not found [ 100,  ,  [],  ,  86,  87,  ,  9 ] 

У вихідних даних або показує, що таблиця має 1 або 3 послідовні порожні місця/індекси.

приклад 2: Припустімо, ми хочемо зберегти контактні номери сім’ї з 5 членів у хеш-таблиці. Для цього ми створимо хеш-таблицю розміром 10 і збережемо контактні дані. Індекс буде встановлено за допомогою приватної функції setKey, яка перетворить останню цифру контактного номера в індекс хеш-таблиці.

Javascript




// HashTable Implementation> class HashTable {> > constructor() {> > this> .table => new> Array(10);> > this> .size = 0;> > }> > // private function to convert key to index> > // _ shows that the function is private> > _setKey(key) {> > const lastDigit = key % 10;> > return> lastDigit;> > }> > // insert value in the hashtable> > insert(value) {> > const index => this> ._setKey(value);> > this> .table[index] = value;> > this> .size++;> > }> > get(key) {> > const target => this> ._setKey(key);> > return> this> .table[target];> > }> > search(value) {> > const index => this> ._setKey(value);> > if> (> this> .table[index] == value)> > console.log(> 'The contact number is found at index : '> , index);> > else> > console.log(> 'Contact Number not found'> );> > }> > delete> (key) {> > const index => this> ._setKey(key);> > if> (> this> .table[index]) {> > this> .table[index] = [];> > this> .size--;> > return> true> ;> > }> else> {> > return> false> ;> > }> > }> }> const hashExample => new> HashTable();> // insert> hashExample.insert(98754525);> hashExample.insert(98747512);> hashExample.insert(94755523);> hashExample.insert(92752521);> hashExample.insert(98556529);> console.log(hashExample.table);> // ->показує хеш-таблицю> // search> hashExample.search(92752521);> // found> hashExample.search(92755784);> // not found> // delete> hashExample.> delete> (92752521);> // showing table after deletion> console.log(hashExample.table);>

Вихід:

[ ,  92752521,  98747512,  94755523,  ,  98754525,  ,  98556529 ] The contact number is found at index : 1 Contact Number not found [ ,  [],  98747512,  94755523,  ,  98754525,  ,  98556529 ] 

У вихідних даних або показує, що таблиця має 1 або 3 послідовні порожні місця/індекси.