SlideShare a Scribd company logo
Лекция 6: Словари.
Хеш-таблицы.
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net
Контроль
2
1. Что такое AVL-дерево?
2. Вычислительная сложность в худшем случае
операции добавления элемента в AVL-дерево.
3. Вычислительная сложность в худшем случае
операции поиска элемента в AVL-дереве.
4. Вычислительная сложность в худшем случае
операции удаления элемента из AVL-дерева.
Словарь (Map)
3
Словарь (ассоциативный массив, associative array,
map, dictionary) – структура данных для хранения
пар вида “ключ (key) – значение (value)”
В словаре не могут присутствовать пары
с одинаковыми ключами
Ключ (Key) Значение (Value)
Слон 890
Кит 1200
Лев 260
Жираф 530
Хеш-таблицы (Hash Table)
4
Хеш-таблица (Hash table) – это структура данных
для хранения пар (ключ, значение). Доступ к элементам
осуществляется по ключу
Ключи могут быть строками, числами, указателями
Хеш-таблицы позволяют в среднем за
время О(1) выполнять добавление, поиски и удаление
элементов
Хеш-таблицы (Hash Table)
5
Ключ
(Key)
Value:
160
“Антилопа Гну”
Хеш-таблица
(Hash table)
Хеш-функция
(Hash function)
hash(key)
0
1
2
…
h – 1
Хеш-функция – отображает (преобразует)
ключ (key) в номер элемента (index) массива
(в целое число от 0 до h – 1).
Ячейки массива называются buckets, slots.
index
Хеш-таблицы (Hash Table)
6
Хеш-таблица
(Hash table)
0
1
2
…
h – 1
На практике, обычно известна информация о
диапазоне значений ключей
На основе этого выбирается размер h хеш-таблицы
и выбирается хеш-функция
Коэффициент αααα заполнения хеш-таблицы
(load factor, fill factor) – отношение числа n
хранимых элементовв хеш-таблицы к размеру h
массива (среднее число элементов на одну ячейку)
ߙ =
݊
ℎ
Пример: h = 128, в хеш-таблицу добавили 50
элементов,тогда α = 50 / 128 ≈ 0.39
От этого коэффициента зависит среднее время
выполнения операций добавления, поиска и
удаления элементов
Хеш-функции (Hash function)
Хеш-функция (Hash function) – это функция преобразующая
значения ключа (например: строки, числа, файла) в целое число
Значение возвращаемое хеш-функцией называется хеш-кодом
(hash code), контрольной суммой (hash sum) или хешем (hash)
#define HASH_MUL 31
#define HASH_SIZE 128
unsigned int hash(char *s)
{
unsigned int h = 0;
char *p;
for (p = s; *p != '0'; p++) {
h = h * HASH_MUL + (unsigned int)*p;
}
return h % HASH_SIZE;
} 7
Хеш-функции (Hash function)
8
Требования к хэш-функциям:
Быстрое вычисление хэш-кода по значению ключа. Сложность
вычисления хэш-кода не должна зависеть от n – количества
элементов в хеш-таблице.
Детерминированность. Для заданного значения ключа хэш-
функция всегда должна возвращать одно и то же значение.
Равномерность. Хеш-функция должна равномерно заполнять
массив. Желательно, чтобы все хэш-коды формировались с
одинаковой вероятностью.
Понятие коллизии (Collision)
9
Коллизия (Collision) – это совпадение значений хеш-функции
для двух разных ключей
Keys HashesHash function
Жираф
Слон
Муха Цеце
Волк
127
...
05
04
03
02
01
00
Collision!
hash(“Волк”) = 2 hash(“Жираф”) = 2
Существуют хеш-функции без коллизий – идеальные хеш-функции (perfect hash function)
Разрешение коллизий (Collision Resolution)
10
Метод цепочек (Chaining) – закрытая адресация.
Элементы с одинаковым значением хеш-функции объединяются в
связный список. Указатель на список хранится в советующей ячейке
хеш-таблицы.
При коллизии элемент добавляется в начало списка.
Поиск и удаление элемента требуют просмотра всего списка.
Keys HashesHash function
Жираф
Слон
Муха Цеце
Волк
127
...
05
04
03
02
01
00
Муха Цеце NULL
Слон NULL
Жираф Волк
NULL
Разрешение коллизий (Collision Resolution)
11
Открытая адресация (Open addressing)
В каждой ячейке хеш-таблицы хранится не указатель на связный
список, а один элемент (ключ, значение).
Если ячейка с индексом hash(key) занята, то осуществляется поиск
свободной ячейки в следующих позициях таблицы. Hash Элемент
0 B
1
2
3 A
4 C
5 D
6
7
Линейное хеширование (linear probing) – проверяются
позиции:
hash(key) + 1, hash(key) + 2, …, (hash(key) + i) mod h, …
Если свободных ячеек нет, то таблица заполнена.
Пример:
hash(D) = 3, но ячейка с иднексом 3 занята.
Присматриваем ячейки: 4 – занята, 5 – свободна.
Эффективность хеш-таблиц
12
Хеш-таблица требует предварительной инициализации ячеек
значениями NULL – трудоемкость O(h)
Операция Вычислительная
сложность
в среднем случае
Вычислительная
сложность
в худшем случае
Add(key, value) O(1) O(1)
Lookup(key) O(1 + n/h) O(n)
Delete(key) O(1 + n/h) O(n)
Min() O(n + h) O(n + h)
Max() O(n + h) O(n + h)
Пример хэш-функции для чисел
13
Ключи: размер файла – число.
Значение, хранимое в словаре: название файла.
Требуется разработать хеш-функцию
hash(filesize) → [0..1023]
function hash(filesize)
return filesize mod 1024
end function
Пример хэш-функции для строк
14
hash ‫ݏ‬ = ෍ ℎ௅ି(௜ାଵ)
∙ ‫ݏ‬ ݅
௅ିଵ
௜ୀ଴
=
= ‫]0[ݏ‬ℎ௅ିଵ
+ ‫]1[ݏ‬ℎ௅ିଶ
+ ⋯ + ‫ݏ‬ ‫ܮ‬ − 2 ℎ + ‫ݏ‬ ‫ܮ‬ − 1 ,
где s – ключ (строка), L – длина строки, s[i] – код символа i.
Хеш-таблицы (Hash Table)
15
Длину h хеш-таблицы выбирают как простое число.
Для такой таблицы модульная хеш-функция дает
равномерное распределение значений ключей
hash(key) = key mod h
Реализация хеш-таблицы
16
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HASHTAB_SIZE 71
#define HASHTAB_MUL 31
struct listnode {
char *key;
int value;
struct listnode *next;
};
struct listnode *hashtab[HASHTAB_SIZE];
Реализация хеш-таблицы
17
int hashtab_hash(char *key)
{
int h = 0;
char *p;
for (p = key; *p != '0'; p++) {
h = h * HASHTAB_MUL + (int)*p;
}
return h % HASHTAB_SIZE;
}
Реализация хеш-таблицы
18
void hashtab_init(struct listnode **hashtab)
{
int i;
for (i = 0; i < HASHTAB_SIZE; i++) {
hashtab[i] = NULL;
}
}
Реализация хеш-таблицы
19
void hashtab_add(struct listnode **hashtab,
char *key, int value)
{
struct listnode *node;
int index = hashtab_hash(key);
node = malloc(sizeof(*node));
if (node != NULL) {
node->key = key;
node->value = value;
node->next = hashtab[index];
hashtab[index] = node;
}
}
Реализация хеш-таблицы
struct listnode *hashtab_lookup(
struct listnode **hashtab,
char *key)
{
int index;
struct listnode *node;
index = hashtab_hash(key);
for (node = hashtab[index];
node != NULL; node = node->next)
{
if (strcmp(node->key, key) == 0) {
return node;
}
}
return NULL;
} 20
Реализация хеш-таблицы
21
int main()
{
struct listnode *node;
hashtab_init(hashtab);
hashtab_add(hashtab, "Tigr", 190);
hashtab_add(hashtab, "Slon", 2300);
hashtab_add(hashtab, "Volk", 60);
node = hashtab_lookup(hashtab, "Slon");
printf("Node: %s, %dn",
node->key, node->value);
return 0;
}
Реализация хеш-таблицы
void hashtab_delete(struct listnode **hashtab,
char *key)
{
int index;
struct listnode *p, *prev = NULL;
index = hashtab_hash(key);
for (p = hashtab[index]; p != NULL; p = p->next) {
if (strcmp(p->key, key) == 0) {
if (prev == NULL
hashtab[index] = p->next;
else
prev->next = p->next;
free(p);
return;
}
prev = p;
}
} 22
Реализация хеш-таблицы
23
int main()
{
struct listnode *node;
/* ... */
hashtab_delete(hashtab, "Slon");
node = hashtab_lookup(hashtab, "Slon");
if (node != NULL) {
printf("Node: %s, %dn",
node->key, node->value);
} else {
printf("Key 'Slon' not foundn");
}
return 0;
}
Задание
24
Прочитать в Sedgewick2001 про хеш-функции для
вещественных чисел (с. 575).

More Related Content

What's hot

Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 

What's hot (20)

Preventing Abuse Using Unsupervised Learning
Preventing Abuse Using Unsupervised LearningPreventing Abuse Using Unsupervised Learning
Preventing Abuse Using Unsupervised Learning
 
Clang tidy
Clang tidyClang tidy
Clang tidy
 
Clean code
Clean codeClean code
Clean code
 
Git and git workflow best practice
Git and git workflow best practiceGit and git workflow best practice
Git and git workflow best practice
 
Idiomatic Kotlin
Idiomatic KotlinIdiomatic Kotlin
Idiomatic Kotlin
 
JavaScript Control Statements II
JavaScript Control Statements IIJavaScript Control Statements II
JavaScript Control Statements II
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Core Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug HuntCore Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug Hunt
 
Shell sort
Shell sortShell sort
Shell sort
 
Java 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaJava 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambda
 
Quick Sort , Merge Sort , Heap Sort
Quick Sort , Merge Sort ,  Heap SortQuick Sort , Merge Sort ,  Heap Sort
Quick Sort , Merge Sort , Heap Sort
 
Quick sort
Quick sortQuick sort
Quick sort
 
Введение в программирование (1 часть)
Введение в программирование (1 часть)Введение в программирование (1 часть)
Введение в программирование (1 часть)
 
구문과 의미론(정적 의미론까지)
구문과 의미론(정적 의미론까지)구문과 의미론(정적 의미론까지)
구문과 의미론(정적 의미론까지)
 
git - eine praktische Einführung
git - eine praktische Einführunggit - eine praktische Einführung
git - eine praktische Einführung
 
Clean code
Clean codeClean code
Clean code
 
Google test training
Google test trainingGoogle test training
Google test training
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
 
Regular Expression
Regular ExpressionRegular Expression
Regular Expression
 
07 java collection
07 java collection07 java collection
07 java collection
 

Similar to Лекция 6: Словари. Хеш-таблицы

Лекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицыЛекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицы
Mikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 7
Алгоритмы и структуры данных осень 2013 лекция 7Алгоритмы и структуры данных осень 2013 лекция 7
Алгоритмы и структуры данных осень 2013 лекция 7
Technopark
 
Асимметричные криптоалгоритмя и хэширование
Асимметричные криптоалгоритмя и хэшированиеАсимметричные криптоалгоритмя и хэширование
Асимметричные криптоалгоритмя и хэширование
Andrey Lebedev
 
Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»
Yandex
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
MERA_school
 
5 хэш функции
5 хэш функции5 хэш функции
5 хэш функции
Delaveur
 

Similar to Лекция 6: Словари. Хеш-таблицы (18)

Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 
Лекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицыЛекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицы
 
Хэши в ruby
Хэши в rubyХэши в ruby
Хэши в ruby
 
Лекция 4 Элементарные структуры данных часть 2
Лекция 4 Элементарные структуры данных часть 2Лекция 4 Элементарные структуры данных часть 2
Лекция 4 Элементарные структуры данных часть 2
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.
 
Алгоритмы и структуры данных осень 2013 лекция 7
Алгоритмы и структуры данных осень 2013 лекция 7Алгоритмы и структуры данных осень 2013 лекция 7
Алгоритмы и структуры данных осень 2013 лекция 7
 
Асимметричные криптоалгоритмя и хэширование
Асимметричные криптоалгоритмя и хэшированиеАсимметричные криптоалгоритмя и хэширование
Асимметричные криптоалгоритмя и хэширование
 
Базы данных. Hash & Cache
Базы данных. Hash & CacheБазы данных. Hash & Cache
Базы данных. Hash & Cache
 
C:\fakepath\кмсзи экз
C:\fakepath\кмсзи   экзC:\fakepath\кмсзи   экз
C:\fakepath\кмсзи экз
 
Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
 
Haskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageHaskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell language
 
Haskell
HaskellHaskell
Haskell
 
5 хэш функции
5 хэш функции5 хэш функции
5 хэш функции
 
Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 

More from Mikhail Kurnosov

More from Mikhail Kurnosov (20)

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 

Лекция 6: Словари. Хеш-таблицы

  • 1. Лекция 6: Словари. Хеш-таблицы. Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net
  • 2. Контроль 2 1. Что такое AVL-дерево? 2. Вычислительная сложность в худшем случае операции добавления элемента в AVL-дерево. 3. Вычислительная сложность в худшем случае операции поиска элемента в AVL-дереве. 4. Вычислительная сложность в худшем случае операции удаления элемента из AVL-дерева.
  • 3. Словарь (Map) 3 Словарь (ассоциативный массив, associative array, map, dictionary) – структура данных для хранения пар вида “ключ (key) – значение (value)” В словаре не могут присутствовать пары с одинаковыми ключами Ключ (Key) Значение (Value) Слон 890 Кит 1200 Лев 260 Жираф 530
  • 4. Хеш-таблицы (Hash Table) 4 Хеш-таблица (Hash table) – это структура данных для хранения пар (ключ, значение). Доступ к элементам осуществляется по ключу Ключи могут быть строками, числами, указателями Хеш-таблицы позволяют в среднем за время О(1) выполнять добавление, поиски и удаление элементов
  • 5. Хеш-таблицы (Hash Table) 5 Ключ (Key) Value: 160 “Антилопа Гну” Хеш-таблица (Hash table) Хеш-функция (Hash function) hash(key) 0 1 2 … h – 1 Хеш-функция – отображает (преобразует) ключ (key) в номер элемента (index) массива (в целое число от 0 до h – 1). Ячейки массива называются buckets, slots. index
  • 6. Хеш-таблицы (Hash Table) 6 Хеш-таблица (Hash table) 0 1 2 … h – 1 На практике, обычно известна информация о диапазоне значений ключей На основе этого выбирается размер h хеш-таблицы и выбирается хеш-функция Коэффициент αααα заполнения хеш-таблицы (load factor, fill factor) – отношение числа n хранимых элементовв хеш-таблицы к размеру h массива (среднее число элементов на одну ячейку) ߙ = ݊ ℎ Пример: h = 128, в хеш-таблицу добавили 50 элементов,тогда α = 50 / 128 ≈ 0.39 От этого коэффициента зависит среднее время выполнения операций добавления, поиска и удаления элементов
  • 7. Хеш-функции (Hash function) Хеш-функция (Hash function) – это функция преобразующая значения ключа (например: строки, числа, файла) в целое число Значение возвращаемое хеш-функцией называется хеш-кодом (hash code), контрольной суммой (hash sum) или хешем (hash) #define HASH_MUL 31 #define HASH_SIZE 128 unsigned int hash(char *s) { unsigned int h = 0; char *p; for (p = s; *p != '0'; p++) { h = h * HASH_MUL + (unsigned int)*p; } return h % HASH_SIZE; } 7
  • 8. Хеш-функции (Hash function) 8 Требования к хэш-функциям: Быстрое вычисление хэш-кода по значению ключа. Сложность вычисления хэш-кода не должна зависеть от n – количества элементов в хеш-таблице. Детерминированность. Для заданного значения ключа хэш- функция всегда должна возвращать одно и то же значение. Равномерность. Хеш-функция должна равномерно заполнять массив. Желательно, чтобы все хэш-коды формировались с одинаковой вероятностью.
  • 9. Понятие коллизии (Collision) 9 Коллизия (Collision) – это совпадение значений хеш-функции для двух разных ключей Keys HashesHash function Жираф Слон Муха Цеце Волк 127 ... 05 04 03 02 01 00 Collision! hash(“Волк”) = 2 hash(“Жираф”) = 2 Существуют хеш-функции без коллизий – идеальные хеш-функции (perfect hash function)
  • 10. Разрешение коллизий (Collision Resolution) 10 Метод цепочек (Chaining) – закрытая адресация. Элементы с одинаковым значением хеш-функции объединяются в связный список. Указатель на список хранится в советующей ячейке хеш-таблицы. При коллизии элемент добавляется в начало списка. Поиск и удаление элемента требуют просмотра всего списка. Keys HashesHash function Жираф Слон Муха Цеце Волк 127 ... 05 04 03 02 01 00 Муха Цеце NULL Слон NULL Жираф Волк NULL
  • 11. Разрешение коллизий (Collision Resolution) 11 Открытая адресация (Open addressing) В каждой ячейке хеш-таблицы хранится не указатель на связный список, а один элемент (ключ, значение). Если ячейка с индексом hash(key) занята, то осуществляется поиск свободной ячейки в следующих позициях таблицы. Hash Элемент 0 B 1 2 3 A 4 C 5 D 6 7 Линейное хеширование (linear probing) – проверяются позиции: hash(key) + 1, hash(key) + 2, …, (hash(key) + i) mod h, … Если свободных ячеек нет, то таблица заполнена. Пример: hash(D) = 3, но ячейка с иднексом 3 занята. Присматриваем ячейки: 4 – занята, 5 – свободна.
  • 12. Эффективность хеш-таблиц 12 Хеш-таблица требует предварительной инициализации ячеек значениями NULL – трудоемкость O(h) Операция Вычислительная сложность в среднем случае Вычислительная сложность в худшем случае Add(key, value) O(1) O(1) Lookup(key) O(1 + n/h) O(n) Delete(key) O(1 + n/h) O(n) Min() O(n + h) O(n + h) Max() O(n + h) O(n + h)
  • 13. Пример хэш-функции для чисел 13 Ключи: размер файла – число. Значение, хранимое в словаре: название файла. Требуется разработать хеш-функцию hash(filesize) → [0..1023] function hash(filesize) return filesize mod 1024 end function
  • 14. Пример хэш-функции для строк 14 hash ‫ݏ‬ = ෍ ℎ௅ି(௜ାଵ) ∙ ‫ݏ‬ ݅ ௅ିଵ ௜ୀ଴ = = ‫]0[ݏ‬ℎ௅ିଵ + ‫]1[ݏ‬ℎ௅ିଶ + ⋯ + ‫ݏ‬ ‫ܮ‬ − 2 ℎ + ‫ݏ‬ ‫ܮ‬ − 1 , где s – ключ (строка), L – длина строки, s[i] – код символа i.
  • 15. Хеш-таблицы (Hash Table) 15 Длину h хеш-таблицы выбирают как простое число. Для такой таблицы модульная хеш-функция дает равномерное распределение значений ключей hash(key) = key mod h
  • 16. Реализация хеш-таблицы 16 #include <stdio.h> #include <stdlib.h> #include <string.h> #define HASHTAB_SIZE 71 #define HASHTAB_MUL 31 struct listnode { char *key; int value; struct listnode *next; }; struct listnode *hashtab[HASHTAB_SIZE];
  • 17. Реализация хеш-таблицы 17 int hashtab_hash(char *key) { int h = 0; char *p; for (p = key; *p != '0'; p++) { h = h * HASHTAB_MUL + (int)*p; } return h % HASHTAB_SIZE; }
  • 18. Реализация хеш-таблицы 18 void hashtab_init(struct listnode **hashtab) { int i; for (i = 0; i < HASHTAB_SIZE; i++) { hashtab[i] = NULL; } }
  • 19. Реализация хеш-таблицы 19 void hashtab_add(struct listnode **hashtab, char *key, int value) { struct listnode *node; int index = hashtab_hash(key); node = malloc(sizeof(*node)); if (node != NULL) { node->key = key; node->value = value; node->next = hashtab[index]; hashtab[index] = node; } }
  • 20. Реализация хеш-таблицы struct listnode *hashtab_lookup( struct listnode **hashtab, char *key) { int index; struct listnode *node; index = hashtab_hash(key); for (node = hashtab[index]; node != NULL; node = node->next) { if (strcmp(node->key, key) == 0) { return node; } } return NULL; } 20
  • 21. Реализация хеш-таблицы 21 int main() { struct listnode *node; hashtab_init(hashtab); hashtab_add(hashtab, "Tigr", 190); hashtab_add(hashtab, "Slon", 2300); hashtab_add(hashtab, "Volk", 60); node = hashtab_lookup(hashtab, "Slon"); printf("Node: %s, %dn", node->key, node->value); return 0; }
  • 22. Реализация хеш-таблицы void hashtab_delete(struct listnode **hashtab, char *key) { int index; struct listnode *p, *prev = NULL; index = hashtab_hash(key); for (p = hashtab[index]; p != NULL; p = p->next) { if (strcmp(p->key, key) == 0) { if (prev == NULL hashtab[index] = p->next; else prev->next = p->next; free(p); return; } prev = p; } } 22
  • 23. Реализация хеш-таблицы 23 int main() { struct listnode *node; /* ... */ hashtab_delete(hashtab, "Slon"); node = hashtab_lookup(hashtab, "Slon"); if (node != NULL) { printf("Node: %s, %dn", node->key, node->value); } else { printf("Key 'Slon' not foundn"); } return 0; }
  • 24. Задание 24 Прочитать в Sedgewick2001 про хеш-функции для вещественных чисел (с. 575).