12-13 Хеш-таблиці й алгоритми їх обробки
Перелік алгоритмів, що розглядаються
- побудова хеш-функції методом ділення;
- пошук елемента при відкритому хешуванні;
- запис елемента при відкритому хешуванні;
- вилучення елемента при відкритому хешуванні;
- запис елемента при закритому лінійному хешуванні.
Короткі теоретичні відомості
Питання для повторення
- Реалізація лінійних списків.
Постановка задачі
У хеш-таблиці замість безпосереднього використання ключа як індексу масиву, індекс обчислюється за значенням ключа. Функція, що відображає елемент множини ключів {0, 1, ..., n-1} на множину індексів {0, 1, ..., m-1} (m <n), називається хеш-функцією. Якщо два ключі хешуються в одну й ту саму комірку, то говорять про виникнення колізії. За способом вирішення колізій розрізняють:
- відкрите хешування — усі елементи, що хешуються в одну комірку, об’єднуються у зв’язний список
- закрите хешування — усі елементи зберігаються безпосередньо у хеш-таблиці, при потраплянні у зайняту комірку обирається послідовність інших хеш-значень.
- пошук елемента;
- запис елемента;
- читання елемента.
Опис алгоритмів
Опис структур даних
При закритому хешуванні хеш-таблиця є масивом, елементи якого занумеровані від 0 до m-1.При відкритому хешуванні хеш-таблиця є масивом, кожна комірка якого містить покажчики на заголовок списку всіх елементів, хеш-значення ключа яких дорівнює індексу комірки.
1. Побудова хеш-функції методом ділення
Ідея
Значенням хеш-функції є остача від ділення ключа на розмір хеш-таблиці.Псевдокод
h(x) = x mod m
2.Пошук елемента при відкритому хешуванні
Ідея
Знайти відповідне хеш-значення і здійснити пошук у списку, заголовок на який міститься у відповідній комірці хеш-таблиці.Псевдокод
заголовок = хеш-таблиця [h (ключ)]
знайти позицію ключа в списку, заданого заголовком
повернути позиція != NULL
знайти позицію ключа в списку, заданого заголовком
повернути позиція != NULL
3.Запис елемента при відкритому хешуванні
Ідея
Якщо елемент не знайдено, то додати його на початку списку, що відповідає хеш-значенню.Псевдокод
якщо Пошук (ключ) == FALSE то
{
заголовок = хеш-таблиця [h (ключ)}
вставити ключ в позицію 1 списку, заданого заголовком
{
{
заголовок = хеш-таблиця [h (ключ)}
вставити ключ в позицію 1 списку, заданого заголовком
{
4.Вилучення елемента при відкритому хешуванні
Ідея
Вилучити елемент зі списку, заголовок на який міститься у відповідній комірці хеш-таблиці.Псевдокод
заголовок = хеш-таблиця [h (ключ)]
p = позиція ключа в списку, заданого заголовком
видалити елемент в позиції p зі списку, заданого заголовком
p = позиція ключа в списку, заданого заголовком
видалити елемент в позиції p зі списку, заданого заголовком
5. Вставка елемента при закритому хешуванні
Ідея
При лінійному хешуванні використовується хеш-функція h(x, i)=(h1(x)+i) mod m, де h1(x) — звичайна хеш-функція, i — номер спроби розмістити елемент. Якщо комірка, відповідна хеш-значенню зайнята, то обчислюється значення для наступної спроби.Псевдокод
i = 0
повторювати
{
k
= h(x, i)
}
поки хеш-таблиця[k] ==0
хеш-таблиця[k] = x
повторювати
{
k
= h(x, i)
}
поки хеш-таблиця[k] ==0
хеш-таблиця[k] = x
Завдання для виконання
Постановка задачі
Скласти програми, що забезпечують виконання операцій з хеш-таблицями. Програми повинні забезпечувати- реалізацію основних процедур із хеш-таблицею;
- заповнення хеш-таблиці послідовністю випадково згенерованих чисел;
- виведення на екран графа хеш-таблиці;
- виконання вказаних викладачем дій з хеш-таблицею.
Технічні умови
- розмір хеш-таблиці дорівнює 13;
- множина ключів містить 50 елементів.
Хід роботи
- Скласти програму Hash.cpp для реалізації операцій з хеш-таблцею при відкритому хешуванні; хеш-фунція будується методом ділення.
- Забезпечити виконання дій, зазначених викладачем.
- Виконати програму в покроковому режимі.
- Скласти програму Hash2.cpp для реалізації додавання елементів у хеш-таблицю при лінійному хешуванні і заповнення її випадково згенерованими числами.
- Виконати програму в покроковому режимі для 8 випадкових чисел.
Запитання для самоконтролю
- У чому особливість хеш-таблиці?
- У чому відмінність відкритого і закритого хешування?.
- Поясніть принципи виконання основних операцій при відкритому хешуванні.
- Поясніть побудову хеш-функції при лінійному хешуванні.