- •Структуры данных: ограничения
- •Motivation
- •Dictionaries
- •Таблицы поиска
- •Таблицы поиска
- •Простой объект
- •Таблицы прямой адресации
- •Student
- •Таблицы прямой адресации
- •Таблицы прямой адресации
- •Direct Addressing
- •Если ключей меньше, чем элементов массива, то в качестве хэш-функции можно использовать деление
- •Хэширование–это преобразование входного массива данных определенного типа и произвольной длины в выходную битовую
- •Хэширование полезно, когда широкий диапазон возможных значений должен быть сохранен в
- •Hash-функции
- •Hash Functions
- •Хеширование данных
- •Hash-таблицы
- •Hash-таблицы
- •Хеширование применяется для сравнения данных:
- •Hash-функции
- •С точки зрения практического применения, хорошей является такая хэш-функция,
- •Хеширование данных
- •Hash Functions
- •Оценка качества хеш-функции
- •Hash Tables
- •Хеширование данных
- •Обработка коллизий
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Подходы к апробированию
- •Linear Probing
- •Линейное апробование
- •Разрешение коллизий: линейное опробование
- •Поиск, Linear Probing
- •Квадратичное апробование
- •Разрешение коллизий: квадратичное опробование
- •Двойное хэширование
- •Разрешение коллизий: двойное хеширование
- •Обработка Коллизий
- •Метод цепочек
- •Метод цепочек
- •Метод цепочек
- •Метод цепочек
- •Метод цепочек
- •Метод цепочек
- •Метод цепочек
- •Chaining
- •Обработка коллизий
- •При любом методе разрешения коллизий необходимо ограничить длину поиска элемента!!!!!!!!.
- •//функция создания хеш-таблицы: //метод деления по модулю (самый
- •Метод функции середины квадрата
- •Преимущества и недостатки хеш-таблиц
Метод цепочек
Insert "Some Guy" with ID = 401 hash(401) = 1
Data
|
|
|
0 |
|
|
hash(401) = 1 |
1 |
|
|
|
|
|
Student |
|
2 |
|
hash() |
|
|
Name |
|
3 |
|
|
|
||
GPA |
Some Guy |
|
4 |
3.5 |
|
|
|
ID |
401 |
|
|
2.8
123
Jane Doe
John
3.4
202
Метод цепочек
Insert "Some Guy" with ID = 401 hash(401) = 1
data[1] is non-empty, collision!
Data
|
|
|
0 |
|
|
hash(401) = 1 |
1 |
|
|
|
|
|
Student |
|
2 |
|
hash() |
|
|
Name |
|
3 |
|
|
|
||
GPA |
Some Guy |
|
4 |
3.5 |
|
|
|
ID |
401 |
|
|
2.8
123 John Doe
Jane Doe
3.4
202
Метод цепочек
Insert "Some Guy" with ID = 401 hash(401) = 1
data[1] is non-empty, collision! Chaining says to add the new entry to the list at data[1]
Data
|
|
|
0 |
|
|
hash(401) = 1 |
1 |
|
|
|
|
|
Student |
|
2 |
|
hash() |
|
|
Name |
|
3 |
|
|
|
||
GPA |
Some Guy |
|
4 |
3.5 |
|
|
|
ID |
401 |
|
|
John Doe 2.8
123
Jane Doe
3.4
202
Метод цепочек
Insert "Some Guy" with ID = 401 hash(401) = 1
data[1] is non-empty, collision! Chaining says to add the new
|
Insert Some Guy in the list at data[1] |
|
entry to the list at data[1] |
Data |
|
|
|
|
|
|
0 |
|
|
1 |
|
Student |
2 |
|
|
|
|
hash() |
|
Name |
hash(401) = 1 |
3 |
GPA |
Some Guy |
4 |
3.5 |
|
|
ID |
401 |
|
John Doe 2.8 123
Jane Doe
3.4
202
Метод цепочек
Hash Table contains three items
Операции над таблицей зависят |
|
|
от средней длинны цепочки |
Data |
|
(за исключением добавления записей) |
||
0 |
||
|
1 |
|
|
2 |
|
|
3 |
|
|
4 |
Some Guy 3.5 401
2.8
123
John Doe
Jane Doe 3.4 202
Chaining
•Chaining puts elements that hash to the same slot in a linked list:
U
(universe of keys)
k1
Kk4 k5
(actual k keys) 7
k2 |
k3 |
k6 |
k8 |
|
——
k1 k4 ——
——
——
——
k5 k2 k7 ——
——
k3 ——
k8 k6 ——
——
Обработка коллизий
Multi-Level Hashing
Подобно методу цепочек, но каждый элемент в хэш-таблице связан с другой хеш-таблицей и с другой хэш-функцией
Хэшируя несколько раз, мы можем значительно уменьшить Шансы на коллизию
При любом методе разрешения коллизий необходимо ограничить длину поиска элемента!!!!!!!!.
Если для поиска элемента необходимо более 3–4 сравнений,
то эффективность использования такой хэш-таблицы
пропадает и ее следует реструктуризировать (т.е. найти другую хэш-функцию), чтобы минимизировать количество сравнений для поиска элемента.
//функция создания хеш-таблицы: //метод деления по модулю (самый
//распространённый)
int Hash(int Key,int HashTableSize)
{
return Key % HashTableSize;
}
Метод функции середины квадрата
Функция середины квадрата
преобразует значение ключа в число,возводит это число в квадрат,
из числа выбирает несколько средних
цифр,
интерпретирует эти цифры как адрес
записи.