Що таке хешування?
Хеш - це значення, яке має фіксовану довжину, і воно генерується за допомогою математичної формули. Значення хешу використовуються при стисненні даних, криптології тощо. При індексації даних використовуються хеш-значення, оскільки вони мають фіксований розмір довжини незалежно від значень, які використовувались для їх генерування. Це робить хеш-значення, щоб займати мінімальний простір порівняно з іншими значеннями різної довжини.
Хеш-функція використовує математичний алгоритм для перетворення ключа в хеш. Зіткнення відбувається, коли хеш-функція виробляє одне і те ж хеш-значення для більш ніж одного ключа.
У цьому уроці з алгоритму ви дізнаєтесь:
- Що таке хешування?
- Що таке хеш-таблиця?
- Хеш-функції
- Якості гарної хеш-функції
- Зіткнення
- Операції хеш-таблиці
- Приклад Python хеш-таблиці
- Пояснення коду хеш-таблиці
- Приклад словника Python
- Аналіз складності
- Реальні програми
- Переваги хеш-таблиць
- Недоліки хеш-таблиць
Що таке хеш-таблиця?
Хеш - таблиця являє собою структуру даних , яка зберігає значення з використанням пари ключів і значень. Кожному значенню присвоюється унікальний ключ, який генерується за допомогою хеш-функції.
Ім'я ключа використовується для доступу до пов'язаного з ним значення. Це робить пошук значень у хеш-таблиці дуже швидким, незалежно від кількості елементів у хеш-таблиці.
Хеш-функції
Наприклад, якщо ми хочемо зберігати записи працівників, і кожен працівник однозначно ідентифікується за допомогою номера працівника.
Ми можемо використовувати номер працівника як ключ і призначити дані працівника як значення.
Вищезазначений підхід вимагатиме додаткового вільного місця порядку (m * n 2 ), де змінна m - розмір масиву, а змінна n - кількість цифр для номера працівника. Цей підхід створює проблему простору зберігання.
Хеш-функція вирішує вищезазначену проблему, отримуючи номер працівника та використовуючи його для генерації цілочисельного значення хешу, фіксованих цифр та оптимізації місця для зберігання. Призначення хеш-функції - створити ключ, який буде використовуватися для посилання на значення, яке ми хочемо зберегти. Функція приймає значення, яке потрібно зберегти, а потім використовує алгоритм для обчислення значення ключа.
Далі наведено приклад простої хеш-функції
h(k) = k1 % m
ТУТ,
- h (k) - хеш-функція, яка приймає параметр k. Параметр k - це значення, для якого ми хочемо обчислити ключ.
- k 1 % m - алгоритм нашої хеш-функції, де k1 - значення, яке ми хочемо зберегти, а m - розмір списку. Для обчислення ключа ми використовуємо оператор модуля.
Приклад
Припустимо, що у нас є список із фіксованим розміром 3 та наступними значеннями
[1,2,3]
Ми можемо використовувати наведену вище формулу для обчислення позицій, які має займати кожне значення.
На наступному зображенні показані доступні індекси в нашій хеш-таблиці.
Крок 1)
Обчисліть позицію, яку буде займати перше значення приблизно так
h (1) = 1% 3
= 1
Значення 1 займе простір в індексі 1
Крок 2)
Обчисліть позицію, яку займе друге значення
h (2) = 2% 3
= 2
Значення 2 займе пробіл в індексі 2
Крок 3)
Обчисліть позицію, яку займе третє значення.
h (3) = 3% 3
= 0
Значення 3 займе пробіл в індексі 0
Остаточний результат
Тепер наша заповнена хеш-таблиця буде такою.
Якості гарної хеш-функції
Хороша хеш-функція повинна мати такі якості.
- Формула генерування хешу повинна використовувати значення даних, що зберігаються в алгоритмі.
- Хеш-функція повинна генерувати унікальні хеш-значення навіть для вхідних даних, що мають однакову кількість.
- Функція повинна мінімізувати кількість зіткнень. Зіткнення трапляються, коли одне і те ж значення генерується для більш ніж одного значення.
- Значення повинні бути розподілені послідовно по всіх можливих хешах.
Зіткнення
Зіткнення відбувається, коли алгоритм генерує один і той же хеш для більш ніж одного значення.
Давайте розглянемо приклад.
Припустимо, у нас є наступний перелік значень
[3,2,9,11,7]
Припустимо, що розмір хеш-таблиці дорівнює 7, і ми будемо використовувати формулу (k 1 % m), де m - розмір хеш-таблиці.
У наступній таблиці наведено хеш-значення, які будуть створені.
Ключ | Алгоритм хешу (k 1 % м) | Хеш-значення |
3 | 3% 7 | 3 |
2 | 3% 7 | 2 |
9 | 3% 7 | 2 |
11 | 3% 7 | 4 |
7 | 3% 7 | 0 |
Як ми бачимо з наведених вище результатів, значення 2 і 9 мають однакове хеш-значення, і ми не можемо зберігати більше одного значення в кожній позиції.
Дану проблему можна вирішити, використовуючи ланцюжок або зондування. У наступних розділах детально обговорюється ланцюжок та зондування.
Мережа
Прив’язка - це техніка, яка використовується для вирішення проблеми зіткнення за допомогою пов’язаних списків, кожен із яких має унікальні індекси.
Наступне зображення візуалізує, як виглядає ланцюговий список
І 2, і 9 займають один і той же індекс, але вони зберігаються як зв’язані списки. Кожен список має унікальний ідентифікатор.
Переваги ланцюгових списків
Нижче наведено переваги ланцюгових списків:
- Прив’язані списки мають кращу ефективність при вставці даних, оскільки порядок вставки - O (1).
- Не потрібно змінювати розмір хеш-таблиці, яка використовує ланцюговий список.
- Він може легко вмістити велику кількість значень, якщо є вільний простір.
Зондування
Інший прийом, який використовується для вирішення зіткнення, - зондування. Застосовуючи метод зондування, у разі зіткнення ми можемо просто рухатися далі і знаходити порожній слот для зберігання нашого значення.
Нижче наведені методи зондування:
Метод | Опис |
Лінійне зондування | Як і випливає з назви, цей метод здійснює пошук порожніх слотів лінійно, починаючи з положення, де сталося зіткнення і рухаючись вперед. Якщо кінець списку досягнуто і порожній слот не знайдено. Зондування починається на початку списку. |
Квадратичне зондування | Цей метод використовує квадратичні поліноміальні вирази, щоб знайти наступний вільний слот. |
Подвійне хешування | Цей метод використовує алгоритм вторинної хеш-функції для пошуку наступного вільного слота. |
Використовуючи наш наведений вище приклад, хеш-таблиця після використання зондування буде виглядати наступним чином:
Операції хеш-таблиці
Ось такі операції підтримуються таблицями хешу:
- Вставка - ця операція використовується для додавання елемента до хеш-таблиці
- Пошук - ця операція використовується для пошуку елементів у хеш-таблиці за допомогою ключа
- Видалення - ця операція використовується для видалення елементів з хеш-таблиці
Вставка операції з даними
Операція вставки використовується для зберігання значень у хеш-таблиці. Коли нове значення зберігається в хеш-таблиці, йому присвоюється номер індексу. Номер індексу обчислюється за допомогою хеш-функції. Хеш-функція вирішує будь-які колізії, які виникають при обчисленні номера індексу.
Пошук операції з даними
Операція пошуку використовується для пошуку значень у хеш-таблиці з використанням номера індексу. Операція пошуку повертає значення, пов’язане з номером індексу пошуку. Наприклад, якщо ми зберігаємо значення 6 в індексі 2, операція пошуку з індексом No 2 поверне значення 6.
Операція видалення даних
Операція видалення використовується для видалення значення з хеш-таблиці. Для видалення Операція виконується за номером індексу. Після видалення значення номер індексу стає вільним. Його можна використовувати для зберігання інших значень за допомогою операції вставки.
Реалізація хеш-таблиці на прикладі Python
Давайте розглянемо простий приклад, який обчислює хеш-значення ключа
def hash_key( key, m):return key % mm = 7print(f'The hash value for 3 is {hash_key(3,m)}')print(f'The hash value for 2 is {hash_key(2,m)}')print(f'The hash value for 9 is {hash_key(9,m)}')print(f'The hash value for 11 is {hash_key(11,m)}')print(f'The hash value for 7 is {hash_key(7,m)}')
Пояснення коду хеш-таблиці
ТУТ,
- Визначає функцію hash_key, яка приймає ключ параметрів і m.
- Використовує просту операцію модуля для визначення хеш-значення
- Визначає змінну m, яка ініціалізується до значення 7. Це розмір нашої хеш-таблиці
- Обчислює та друкує хеш-значення 3
- Обчислює та друкує хеш-значення 2
- Обчислює та друкує хеш-значення 9
- Обчислює та друкує хеш-значення 11
- Обчислює та друкує хеш-значення 7
Виконання наведеного вище коду дає такі результати.
The hash value for 3 is 3The hash value for 2 is 2The hash value for 9 is 2The hash value for 11 is 4The hash value for 7 is 0
Приклад словника Python
Python постачається із вбудованим типом даних, який називається Dictionary. Словник є прикладом хеш-таблиці. Він зберігає значення за допомогою пари ключів і значень. Хеш-значення автоматично генеруються для нас, і будь-які колізії вирішуються для нас у фоновому режимі.
Наступний приклад показує, як можна використовувати тип даних словника в python 3
employee = {'name': 'John Doe','age': 36,'position': 'Business Manager.'}print (f"The name of the employee is {employee['name']}")employee['position'] = 'Software Engineer'print (f"The position of {employee['name']} is {employee['position']}")employee.clear()print (employee)
ТУТ,
- Визначає словникову змінну співробітник. Назва ключа використовується для зберігання значення John Doe, віку зберігає 36 років, а позиція зберігає значення Business Manager.
- Отримує значення імені ключа та друкує його в терміналі
- Оновлює значення позиції ключа до значення Software Engineer
- Друкує значення імені та позиції ключів
- Видаляє всі значення, які зберігаються в нашій словниковій змінній співробітник
- Друкує вартість працівника
Запуск вищезазначеного коду дає такі результати.
The name of the employee is John Doe.The position of John Doe is a Software Engineer.{}
Аналіз складності
Хеш-таблиці мають середню часову складність O (1) у найкращому випадку. Найгірший часовий складність - O (n). Найгірший сценарій трапляється, коли багато значень генерують один і той же хеш-ключ, і нам доводиться вирішувати зіткнення шляхом зондування.
Реальні програми
У реальному світі хеш-таблиці використовуються для зберігання даних для
- Бази даних
- Асоціативні масиви
- Набори
- Кеш пам'яті
Переваги хеш-таблиць
Ось плюси / переваги використання хеш-таблиць:
- Хеш-таблиці мають високу продуктивність під час пошуку даних, вставки та видалення існуючих значень.
- Складність часу для хеш-таблиць є постійною незалежно від кількості елементів у таблиці.
- Вони працюють дуже добре навіть при роботі з великими наборами даних.
Недоліки хеш-таблиць
Ось мінуси використання хеш-таблиць:
- Ви не можете використовувати нульове значення як ключ.
- Неможливо уникнути зіткнень при генерації ключів за допомогою. хеш-функції. Зіткнення трапляються, коли генерується ключ, який уже використовується.
- Якщо у функції хешування багато зіткнень, це може призвести до зниження продуктивності.
Короткий зміст:
- Хеш-таблиці використовуються для зберігання даних за допомогою пари ключів і значень.
- Хеш-функція використовує математичний алгоритм для обчислення хеш-значення.
- Зіткнення відбувається, коли одне і те ж хеш-значення генерується для більш ніж одного значення.
- Мережа вирішує колізію, створюючи зв’язані списки.
- Зондування вирішує колізію, знаходячи порожні слоти в хеш-таблиці.
- Лінійне зондування шукає наступний вільний слот, щоб зберегти значення, починаючи з слота, де сталося зіткнення.
- Квадратичне зондування використовує поліноміальні вирази, щоб знайти наступний вільний слот при зіткненні.
- Подвійне хешування використовує алгоритм вторинної хеш-функції, щоб знайти наступний вільний слот при зіткненні.
- Хеш-таблиці мають кращу продуктивність у порівнянні з іншими структурами даних.
- Середня часова складність хеш-таблиць становить O (1)
- Словниковий тип даних у python є прикладом хеш-таблиці.
- Хеш-таблиці підтримують операції вставки, пошуку та видалення.
- Нульове значення не може використовуватися як значення індексу.
- У хеш-функціях не можна уникнути зіткнень. Хороша хеш-функція мінімізує кількість зіткнень, що виникають для покращення продуктивності.