Конспекти лекцій та Лабораторні роботи з дисципліни "Алгоритми та структури даних" для III курсу спеціальності 121 "Інженерія програмного забезпечення" ОКР "Фаховий молодший бакалавр" Херсонського політехнічного фахового коледжу Державного університету "Одеська політехніка"
Навчитися працювати з хеш-таблицями, як з структурою, призначеною для пришвидшеного пошуку даних.
Персональний комп’ютер, IDE Microsoft Visual Studio або інша середа розробки для мови C++
Хеш-таблиця (англ. Hash Table) - це структура даних в комп’ютерних науках, яка використовується для зберігання та пошуку даних з високою швидкістю. В основі хеш-таблиці лежить хеш-функція, яка призначена для перетворення вхідних даних (ключа) в індекс таблиці (хеш-код). Основна ідея полягає в тому, що завдяки хеш-функції можна швидко знайти місце, де зберігається відповідний запис (значення) для даного ключа.
Основні характеристики хеш-таблиці:
Хеш-таблиці широко використовуються в програмуванні для різноманітних завдань, таких як зберігання даних, швидкий пошук та видалення даних, реалізація словників, оптимізація запитів до баз даних та багато інших варіантів використання.
Переваги:
Недоліки:
Хеш-функція - це функція, яка призначена для перетворення вхідних даних (наприклад, ключа) в велике число (хеш-код) фіксованої довжини. Основна ідея хеш-функції полягає в тому, що вона повинна призводити до одного й того ж хеш-коду для одного й того ж вхідного значення. Іншими словами, для кожного унікального вхідного значення хеш-функція повинна генерувати унікальний хеш-код.
Хеш-функції використовуються у хеш-таблицях для визначення місця зберігання значення за його ключем. Найважливіші властивості хорошої хеш-функції включають:
Деякі популярні хеш-функції, які можна використовувати у хеш-таблицях, включають:
MD5 та CRC32: Ці хеш-функції також використовуються для генерації хеш-кодів, але вони менш стійкі до атак і не рекомендуються для криптографічних застосувань.
У теяких випадках можливе повторне хешування або додаткова модифікація отриманого хешу.
Приклади простих хеш-функцій:
h(key) = key % m
Колізії у хеш-таблицях - це ситуації, коли два або більше різних ключів призводять до одного і того ж хеш-коду або індексу в хеш-таблиці. олізії виникають тоді, коли різні ключі призводять до одного і того ж хеш-коду через хеш-функцію. Це може відбуватися через обмежену кількість можливих хеш-кодів в порівнянні з нескінченним числом можливих ключів.
Колізії можуть впливати на продуктивність хеш-таблиці, оскільки вони можуть призводити до збільшення часу доступу до даних та операцій вставки та пошуку. Якщо колізії стають дуже частими, це може суттєво зменшити продуктивність.
Вибір ефективної хеш-функції та методу вирішення колізій є критичним для успішної роботи хеш-таблиці. Хороша хеш-функція повинна рівномірно розподіляти ключі по всьому діапазону хеш-кодів, а метод вирішення колізій повинен бути ефективним та забезпечувати швидкий доступ до даних навіть під час колізій.
Існує кілька способів вирішення колізій у хеш-таблицях. Вибір методу вирішення колізій залежить від конкретних потреб та вимог вашого застосування. Ось деякі з найпоширеніших методів:
Завантажити Visual Studio. Знайдіть на робочому столі ярлик з Visual Studio або Пуск → Всі програми→ Microsoft → Microsoft Visual Studio.
Створити новий проект «Visual C++ (консольное приложение Win32)». Файл → Cтворити → Проект, тип проекту «Консольное приложение Win32».
Перевірити роботу програми та намалювати блок-схему алгоритму
#include <iostream>
using namespace std;
// Клас для представлення елементу хеш-таблиці
class HTItem {
public:
string value;
HTItem* next;
HTItem(string val) {
value = val;
next = nullptr;
}
int searchNext(string key) {
// Функція пошуку наступного елементу
}
};
// Клас для представлення хеш-таблиці
class HT {
private:
const unsigned long CAPACITY = 1024 * 64; // Розмір хеш-таблиці
public:
HTItem** rows;
// Конструктор хеш-таблиці
HT() {
rows = new HTItem* [CAPACITY];
for (unsigned long i = 0; i < CAPACITY; i++) {
rows[i] = nullptr;
}
}
// функція простого хешування рядку
unsigned long simpleHash(string str) {
unsigned long i = 0;
for (int j = 0; str[j]; j++)
i += str[j];
return i % CAPACITY;
}
// функція додавання рядку в таблицю
void insert(string value) {
unsigned long key = simpleHash(value);
rows[key] = new HTItem(value);
}
// функція друку таблиці
void print() {
for (unsigned long i = 0; i < CAPACITY; i++) {
if (rows[i] != nullptr) {
cout << hex;
cout << i << "\t" << rows[i]->value << endl;
}
}
}
// функція пошуку в таблиці
HTItem* search(string key) {
unsigned long sindex = simpleHash(key);
if (rows[sindex] != nullptr) {
return rows[sindex];
}
else {
return nullptr;
}
}
};
int main()
{
HT table;
table.insert("df agdf dsfhbsdg hbsdg dfagdfgadfgvafgdfhbd");
table.insert("dfg dfgdf agdh shbggadfgvafgdfhbd");
table.insert("df ag3333g dfagdfgadfgv555 6 6765 45afgdfhbd");
table.insert("jh kvjdf axfb dgfnbxfgn dfdfgadfgvafgdfhbd");
table.insert("hg hg6565 df agdf dsfhbsdg hbsdg dfagdfgadfgvafgdfhbd");
table.insert("df agd65832625 325 4654 000fgvafgdfhbd");
table.insert("df agdffxg vbk,yfu hsfd gshggdfgadfgvafgdfhbd");
table.insert("3243 435df agdf dsfhbsdg hbsdg dfag dfj ydgfchsdgfaesgrgsgvafgdfhbd");
table.insert("h jkgfhdf agdf dsfhbsdg hafgdfhbd");
table.insert("906 3 5 u7df agdf dsfhsf hgasehb bsdg hbsdg dfagd7 djdhghb s5 shstrhbs fgadfgvafgdfhbd");
table.insert("");
table.insert("a");
table.print();
cout << hex;
cout << table.search("a") << endl;
cout << table.search("asd") << endl;
cout << table.search("h jkgfhdf agdf dsfhbsdg hafgdfhbd") << endl;
}