SlideShare a Scribd company logo
1 of 33
Download to read offline
Лекция 6
Хеш-таблицы
Курносов Михаил Георгиевич
E-mail: mkurnosov@gmail.com
WWW: www.mkurnosov.net
Курс «Структуры и алгоритмы обработки данных»
Сибирский государственный университет телекоммуникаций и информатики (Новосибирск)
Весенний семестр, 2015
АТД «Словарь» (dictionary)
2
 Словарь (ассоциативный массив, associative array, map,
dictionary) – структура данных (контейнер) для хранения
пар вида «ключ – значение» (key – value)
 Реализации словарей отличаются вычислительной
сложностью операций добавления (Add), поиска (Lookup)
и удаления элементов (Delete)
 Наибольшее распространение получили следующие
реализации:
1. Деревья поиска (Search trees)
2. Хэш-таблицы (Hash tables)
3. Списки с пропусками
4. Связные списки
5. Массивы
Хеш-таблицы (Hash tables)
3
 Хеш-таблица (Hash table) – это структура данных
для хранения пар «ключ – значение»
 Доступ к элементам осуществляется по ключу (key)
 Ключи могут быть строками, числами, указателями, …
 Хеш-таблицы позволяют в среднем за время О(1)
выполнять добавление, поиски и удаление элементов
Основная идея
4
 Чем хороши статические массивы int v[100]?
 Очень быстрый доступ O(1) к элементу массива по его
ключу (индексу): v[17] = 45
 Ограничение – ключи (индексы) это целые числа
Основная идея
5
 Чем хороши статические массивы int v[100]?
 Очень быстрый доступ O(1) к элементу массива по его
ключу (индексу): v[17] = 45
 Ограничение – ключи (индексы) это целые числа
 Можно ли как-то использовать типы float, double,
строки (char []) в качестве индексов в массиве?
 Пример: массив анкет пользователей Twitter (словарь),
ключ – login, значение – анкета (профиль с данными
пользователя)
 Массив структур:
struct twitter_user users[MAX_USERS];
Хеш-таблицы (Hash tables)
6
Ключ
(Key)
Value:
160
“Антилопа Гну”
Хеш-таблица
(Hash table)
Хеш-функция
(Hash function)
hash(key) -> int
0
1
2
…
h – 1
 Хеш-функция – отображает (преобразует)
ключ (key) в номер элемента (index) массива
(в целое число от 0 до h – 1)
 Время вычисления хеш-функции зависит
от длины ключа и не зависит от количества
элементов в массиве
 Ячейки массива называются buckets, slots
index
Хеш-таблицы (Hash tables)
7
Хеш-таблица
(Hash table)
0
1
2
…
h – 1
 На практике, обычно известна информация
о диапазоне значений ключей
 На основе этого выбирается размер h хеш-таблицы
и выбирается хеш-функция
 Коэффициент  заполнения хеш-таблицы
(load factor, fill factor) – отношение числа n
хранимых элементов в хеш-таблицы к размеру h
массива (среднее число элементов на одну ячейку)
α =
𝑛
ℎ
 Пример: h = 128, в хеш-таблицу добавили 50
элементов,тогда  = 50 / 128  0.39
 От этого коэффициента зависит среднее время
выполнения операций добавления, поиска
и удаления элементов
8
Хеш-функции (Hash function)
 Хеш-функция (Hash function) – это функция преобразующая
значения ключа (например: строки, числа, файла) в целое число
 Значение возвращаемое хеш-функцией называется хеш-кодом
(hash code), контрольной суммой (hash sum) или хешем (hash)
#define HASH_MUL 31
#define HASH_SIZE 128
// Хеш-функция для строк [KP, “Practice of Programming”]
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;
} Thash = O(|s|)
Хеш-функции (Hash function)
 Хеш-функция (Hash function) – это функция преобразующая
значения ключа (например: строки, числа, файла) в целое число
 Значение возвращаемое хеш-функцией называется хеш-кодом
(hash code), контрольной суммой (hash sum) или хешем (hash)
#define HASH_MUL 31
#define HASH_SIZE 128
int main()
{
unsigned int h = hash(“ivanov”);
}
9
i v a n o v
105 118 97 110 111 118
Хеш-функции (Hash function)
#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;
}
10
h = 0 * HASH_MUL + 105
h = 105 * HASH_MUL + 118
h = 3373 * HASH_MUL + 97
h = 104660 * HASH_MUL + 110
h = 3244570 * HASH_MUL + 111
h = 100581781 * HASH_MUL + 118
return 3118035329 % HASH_SIZE // hash(“ivanov”) = 1
i v a n o v
105 118 97 110 111 118
Понятие коллизии (Collision)
11
 Коллизия (Collision) – это совпадение значений хеш-функции
для двух разных ключей
Keys HashesHash function
Жираф
Слон
Муха Цеце
Волк
127
...
05
04
03
02
01
00
Collision!
hash(“Волк”) = 2 hash(“Жираф”) = 2
Существуют хеш-функции без коллизий –
совершенные хеш-функции (perfect hash function)
Разрешение коллизий (Collision resolution)
12
Метод цепочек (Chaining) – закрытая адресация
Элементы с одинаковым значением хеш-функции объединяются в
связный список. Указатель на список хранится в советующей ячейке хеш-
таблицы.
 При коллизии элемент добавляется в начало списка.
 Поиск и удаление элемента требуют просмотра всего списка.
Keys HashesHash function
Жираф
Слон
Муха Цеце
Волк
127
...
05
04
03
02
01
00
Муха Цеце NULL
Слон NULL
Жираф Волк
NULL
Разрешение коллизий (Collision resolution)
13
Открытая адресация (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 – свободна
Требования к хеш-функциям
14
 Быстрое вычисление хэш-кода по значению ключа
 Сложность вычисления хэш-кода не должна зависеть
от количества n элементов в хеш-таблице
 Детерминированность – для заданного значения ключа
хэш-функция всегда должна возвращать одно и то же
значение
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;
}
Требования к хеш-функциям
15
 Равномерность (uniform distribution) –
хеш-функция должна равномерно заполнять
индексы массива возвращаемыми номерами
 Желательно, чтобы все хэш-коды формировались с
одинаковой равномерной распределенной вероятностью
Hash Элемент
0 C, F, G
1
2
3
4 B, E
5
6 A, D, H
7
A
B
C
D
E
F
G
H
Неравномерное
распределение
Требования к хеш-функциям
16
 Равномерность (uniform distribution) –
хеш-функция должна равномерно заполнять
индексы массива возвращаемыми номерами
 Желательно, чтобы все хэш-коды формировались с
одинаковой равномерной распределенной вероятностью
Hash Элемент
0 C
1 A
2 D
3 H
4 B
5 G
6 E
7 F
A
B
C
D
E
F
G
H
Равномерное
распределение
Эффективность хеш-таблиц
17
 Хеш-таблица требует предварительной инициализации
ячеек значениями 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)
Пример хэш-функции для строк
18
unsigned int ELFHash(char *key, unsigned int mod)
{
unsigned int h = 0, g;
while (*key) {
h = (h << 4) + *key++;
g = h & 0xf0000000L;
if (g)
h ^= g >> 24;
h &= ~g;
}
return h % mod;
}
 Используются только поразрядные операции
(для эффективности)
Jenkins hash functions
19
uint32_t jenkins_hash(char *key, size_t len)
{
uint32_t hash, i;
for (hash = i = 0; i < len; ++i) {
hash += key[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
return hash;
}
Пример хэш-функции для чисел
20
 Ключи – размер файла (int)
 Значение, хранимое в словаре – название файла
 Требуется разработать хеш-функцию
hash(filesize)  [0..1023]
function hash(int filesize)
return filesize % 1024
end function
Пример хэш-функции для строк
21
hash 𝑠 =
𝑖=0
𝐿−1
ℎ 𝐿−(𝑖+1) ∙ 𝑠 𝑖 =
= 𝑠[0]ℎ 𝐿−1 + 𝑠[1]ℎ 𝐿−2 + ⋯ + 𝑠 𝐿 − 2 ℎ + 𝑠 𝐿 − 1 ,
где s – ключ (строка), L – длина строки, s[i] – код символа i
Хеш-таблицы (Hash table)
22
 Длину h хеш-таблицы выбирают как простое число
 Для такой таблицы модульная хеш-функция дает
равномерное распределение значений ключей
hash(key) = key % h
Хеш-таблицы vs. Бинарное дерево поиска
23
Операция
Hash table
(unordered map)
Binary search tree
(ordered map)
Add(key, value) O(m) O(nm)
Lookup(key) O(m + nm) O(nm)
Delete(key) O(m + nm) O(nm)
Min() O(m(n + h)) O(n)
Max() O(m(n + h)) O(n)
 Эффективность реализации словаря хеш-таблицей
(метод цепочек) и бинарным деревом поиска
 Ключ – это строка из m символов
 Оценка сложности для худшего случая (worst case)
Хеш-таблицы vs. Бинарное дерево поиска
24
Операция
Hash table
(unordered map)
Binary search tree
(ordered map)
Add(key, value) O(m) O(mlogn)
Lookup(key) O(m + mn/h) O(mlogn)
Delete(key) O(m + mn/h) O(mlogn)
Min() O(m(n + h)) O(logn)
Max() O(m(n + h)) O(logn)
 Эффективность реализации словаря хеш-таблицей
(метод цепочек) и бинарным деревом поиска
 Ключ – это строка из m символов
 Оценка сложности для среднего случая (average case)
Реализация хеш-таблицы
25
#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];
Хеш-функция
26
unsigned int hashtab_hash(char *key)
{
unsigned int h = 0;
char *p;
for (p = key; *p != '0'; p++) {
h = h * HASHTAB_MUL + (unsigned int)*p;
}
return h % HASHTAB_SIZE;
} THash = O(|key|)
Инициализация хеш-таблицы
27
void hashtab_init(struct listnode **hashtab)
{
int i;
for (i = 0; i < HASHTAB_SIZE; i++) {
hashtab[i] = NULL;
}
}
TInit = O(h)
28
Добавление элемента в хеш-таблицу
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;
}
}
TAdd = THash + O(1) = O(1)
29
Поиск элемента
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;
}
TLookup = THash + O(n) = O(n)
Поиск элемента
30
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;
}
}
31
TDelete = THash + O(n) = O(n)
Удаление элемента
32
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;
}
Домашнее чтение
33
 Прочитать в [Sedgewick2001, С. 575] о хеш-функциях
для вещественных чисел
 Прочитать в “Практике программирования” [KP]
информацию о хеш-таблицах
 Прочитать “Глава 11. Хеш-таблицы” [CLRS, С. 282]

More Related Content

What's hot

PostgreSQL Advanced Queries
PostgreSQL Advanced QueriesPostgreSQL Advanced Queries
PostgreSQL Advanced QueriesNur Hidayat
 
Information Retrieval-05(wild card query_positional index_spell correction)
Information Retrieval-05(wild card query_positional index_spell correction)Information Retrieval-05(wild card query_positional index_spell correction)
Information Retrieval-05(wild card query_positional index_spell correction)Jeet Das
 
Declarative programming language
Declarative programming languageDeclarative programming language
Declarative programming languageVinisha Pathak
 
3.2 partitioning methods
3.2 partitioning methods3.2 partitioning methods
3.2 partitioning methodsKrish_ver2
 
The Php Life Cycle
The Php Life CycleThe Php Life Cycle
The Php Life CycleXinchen Hui
 
Data Mining: Concepts and Techniques (3rd ed.) - Chapter 3 preprocessing
Data Mining:  Concepts and Techniques (3rd ed.)- Chapter 3 preprocessingData Mining:  Concepts and Techniques (3rd ed.)- Chapter 3 preprocessing
Data Mining: Concepts and Techniques (3rd ed.) - Chapter 3 preprocessingSalah Amean
 
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesModern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesLorenzo Alberton
 
DESIGN AND ANALYSIS OF ALGORITHMS
DESIGN AND ANALYSIS OF ALGORITHMSDESIGN AND ANALYSIS OF ALGORITHMS
DESIGN AND ANALYSIS OF ALGORITHMSGayathri Gaayu
 
1.7 data reduction
1.7 data reduction1.7 data reduction
1.7 data reductionKrish_ver2
 
3.3 hierarchical methods
3.3 hierarchical methods3.3 hierarchical methods
3.3 hierarchical methodsKrish_ver2
 
Informed and Uninformed search Strategies
Informed and Uninformed search StrategiesInformed and Uninformed search Strategies
Informed and Uninformed search StrategiesAmey Kerkar
 
Birch Algorithm With Solved Example
Birch Algorithm With Solved ExampleBirch Algorithm With Solved Example
Birch Algorithm With Solved Examplekailash shaw
 
Data visualization using R
Data visualization using RData visualization using R
Data visualization using RUmmiya Mohammedi
 
R data-import, data-export
R data-import, data-exportR data-import, data-export
R data-import, data-exportFAO
 

What's hot (20)

First order logic
First order logicFirst order logic
First order logic
 
Data Management in R
Data Management in RData Management in R
Data Management in R
 
PostgreSQL Advanced Queries
PostgreSQL Advanced QueriesPostgreSQL Advanced Queries
PostgreSQL Advanced Queries
 
Information Retrieval-05(wild card query_positional index_spell correction)
Information Retrieval-05(wild card query_positional index_spell correction)Information Retrieval-05(wild card query_positional index_spell correction)
Information Retrieval-05(wild card query_positional index_spell correction)
 
Declarative programming language
Declarative programming languageDeclarative programming language
Declarative programming language
 
Presentation on K-Means Clustering
Presentation on K-Means ClusteringPresentation on K-Means Clustering
Presentation on K-Means Clustering
 
BFS
BFSBFS
BFS
 
3.2 partitioning methods
3.2 partitioning methods3.2 partitioning methods
3.2 partitioning methods
 
Python for Data Science
Python for Data SciencePython for Data Science
Python for Data Science
 
The Php Life Cycle
The Php Life CycleThe Php Life Cycle
The Php Life Cycle
 
Data Mining: Concepts and Techniques (3rd ed.) - Chapter 3 preprocessing
Data Mining:  Concepts and Techniques (3rd ed.)- Chapter 3 preprocessingData Mining:  Concepts and Techniques (3rd ed.)- Chapter 3 preprocessing
Data Mining: Concepts and Techniques (3rd ed.) - Chapter 3 preprocessing
 
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesModern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
 
DESIGN AND ANALYSIS OF ALGORITHMS
DESIGN AND ANALYSIS OF ALGORITHMSDESIGN AND ANALYSIS OF ALGORITHMS
DESIGN AND ANALYSIS OF ALGORITHMS
 
1.7 data reduction
1.7 data reduction1.7 data reduction
1.7 data reduction
 
3.3 hierarchical methods
3.3 hierarchical methods3.3 hierarchical methods
3.3 hierarchical methods
 
Informed and Uninformed search Strategies
Informed and Uninformed search StrategiesInformed and Uninformed search Strategies
Informed and Uninformed search Strategies
 
Network flow problems
Network flow problemsNetwork flow problems
Network flow problems
 
Birch Algorithm With Solved Example
Birch Algorithm With Solved ExampleBirch Algorithm With Solved Example
Birch Algorithm With Solved Example
 
Data visualization using R
Data visualization using RData visualization using R
Data visualization using R
 
R data-import, data-export
R data-import, data-exportR data-import, data-export
R data-import, data-export
 

Viewers also liked

Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаMikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 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)Mikhail Kurnosov
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очередиMikhail Kurnosov
 
Лекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицыЛекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицыMikhail Kurnosov
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Mikhail Kurnosov
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очередиMikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Лекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачиЛекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачиMikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Mikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеMikhail Kurnosov
 

Viewers also liked (20)

Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Лекция 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: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очереди
 
Лекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицыЛекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицы
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимости
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Лекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачиЛекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачи
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
 
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 

More from Mikhail Kurnosov

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)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)
 
Лекция 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...
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 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. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 

Лекция 6. Хеш-таблицы

  • 1. Лекция 6 Хеш-таблицы Курносов Михаил Георгиевич E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Курс «Структуры и алгоритмы обработки данных» Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Весенний семестр, 2015
  • 2. АТД «Словарь» (dictionary) 2  Словарь (ассоциативный массив, associative array, map, dictionary) – структура данных (контейнер) для хранения пар вида «ключ – значение» (key – value)  Реализации словарей отличаются вычислительной сложностью операций добавления (Add), поиска (Lookup) и удаления элементов (Delete)  Наибольшее распространение получили следующие реализации: 1. Деревья поиска (Search trees) 2. Хэш-таблицы (Hash tables) 3. Списки с пропусками 4. Связные списки 5. Массивы
  • 3. Хеш-таблицы (Hash tables) 3  Хеш-таблица (Hash table) – это структура данных для хранения пар «ключ – значение»  Доступ к элементам осуществляется по ключу (key)  Ключи могут быть строками, числами, указателями, …  Хеш-таблицы позволяют в среднем за время О(1) выполнять добавление, поиски и удаление элементов
  • 4. Основная идея 4  Чем хороши статические массивы int v[100]?  Очень быстрый доступ O(1) к элементу массива по его ключу (индексу): v[17] = 45  Ограничение – ключи (индексы) это целые числа
  • 5. Основная идея 5  Чем хороши статические массивы int v[100]?  Очень быстрый доступ O(1) к элементу массива по его ключу (индексу): v[17] = 45  Ограничение – ключи (индексы) это целые числа  Можно ли как-то использовать типы float, double, строки (char []) в качестве индексов в массиве?  Пример: массив анкет пользователей Twitter (словарь), ключ – login, значение – анкета (профиль с данными пользователя)  Массив структур: struct twitter_user users[MAX_USERS];
  • 6. Хеш-таблицы (Hash tables) 6 Ключ (Key) Value: 160 “Антилопа Гну” Хеш-таблица (Hash table) Хеш-функция (Hash function) hash(key) -> int 0 1 2 … h – 1  Хеш-функция – отображает (преобразует) ключ (key) в номер элемента (index) массива (в целое число от 0 до h – 1)  Время вычисления хеш-функции зависит от длины ключа и не зависит от количества элементов в массиве  Ячейки массива называются buckets, slots index
  • 7. Хеш-таблицы (Hash tables) 7 Хеш-таблица (Hash table) 0 1 2 … h – 1  На практике, обычно известна информация о диапазоне значений ключей  На основе этого выбирается размер h хеш-таблицы и выбирается хеш-функция  Коэффициент  заполнения хеш-таблицы (load factor, fill factor) – отношение числа n хранимых элементов в хеш-таблицы к размеру h массива (среднее число элементов на одну ячейку) α = 𝑛 ℎ  Пример: h = 128, в хеш-таблицу добавили 50 элементов,тогда  = 50 / 128  0.39  От этого коэффициента зависит среднее время выполнения операций добавления, поиска и удаления элементов
  • 8. 8 Хеш-функции (Hash function)  Хеш-функция (Hash function) – это функция преобразующая значения ключа (например: строки, числа, файла) в целое число  Значение возвращаемое хеш-функцией называется хеш-кодом (hash code), контрольной суммой (hash sum) или хешем (hash) #define HASH_MUL 31 #define HASH_SIZE 128 // Хеш-функция для строк [KP, “Practice of Programming”] 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; } Thash = O(|s|)
  • 9. Хеш-функции (Hash function)  Хеш-функция (Hash function) – это функция преобразующая значения ключа (например: строки, числа, файла) в целое число  Значение возвращаемое хеш-функцией называется хеш-кодом (hash code), контрольной суммой (hash sum) или хешем (hash) #define HASH_MUL 31 #define HASH_SIZE 128 int main() { unsigned int h = hash(“ivanov”); } 9 i v a n o v 105 118 97 110 111 118
  • 10. Хеш-функции (Hash function) #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; } 10 h = 0 * HASH_MUL + 105 h = 105 * HASH_MUL + 118 h = 3373 * HASH_MUL + 97 h = 104660 * HASH_MUL + 110 h = 3244570 * HASH_MUL + 111 h = 100581781 * HASH_MUL + 118 return 3118035329 % HASH_SIZE // hash(“ivanov”) = 1 i v a n o v 105 118 97 110 111 118
  • 11. Понятие коллизии (Collision) 11  Коллизия (Collision) – это совпадение значений хеш-функции для двух разных ключей Keys HashesHash function Жираф Слон Муха Цеце Волк 127 ... 05 04 03 02 01 00 Collision! hash(“Волк”) = 2 hash(“Жираф”) = 2 Существуют хеш-функции без коллизий – совершенные хеш-функции (perfect hash function)
  • 12. Разрешение коллизий (Collision resolution) 12 Метод цепочек (Chaining) – закрытая адресация Элементы с одинаковым значением хеш-функции объединяются в связный список. Указатель на список хранится в советующей ячейке хеш- таблицы.  При коллизии элемент добавляется в начало списка.  Поиск и удаление элемента требуют просмотра всего списка. Keys HashesHash function Жираф Слон Муха Цеце Волк 127 ... 05 04 03 02 01 00 Муха Цеце NULL Слон NULL Жираф Волк NULL
  • 13. Разрешение коллизий (Collision resolution) 13 Открытая адресация (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 – свободна
  • 14. Требования к хеш-функциям 14  Быстрое вычисление хэш-кода по значению ключа  Сложность вычисления хэш-кода не должна зависеть от количества n элементов в хеш-таблице  Детерминированность – для заданного значения ключа хэш-функция всегда должна возвращать одно и то же значение 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; }
  • 15. Требования к хеш-функциям 15  Равномерность (uniform distribution) – хеш-функция должна равномерно заполнять индексы массива возвращаемыми номерами  Желательно, чтобы все хэш-коды формировались с одинаковой равномерной распределенной вероятностью Hash Элемент 0 C, F, G 1 2 3 4 B, E 5 6 A, D, H 7 A B C D E F G H Неравномерное распределение
  • 16. Требования к хеш-функциям 16  Равномерность (uniform distribution) – хеш-функция должна равномерно заполнять индексы массива возвращаемыми номерами  Желательно, чтобы все хэш-коды формировались с одинаковой равномерной распределенной вероятностью Hash Элемент 0 C 1 A 2 D 3 H 4 B 5 G 6 E 7 F A B C D E F G H Равномерное распределение
  • 17. Эффективность хеш-таблиц 17  Хеш-таблица требует предварительной инициализации ячеек значениями 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)
  • 18. Пример хэш-функции для строк 18 unsigned int ELFHash(char *key, unsigned int mod) { unsigned int h = 0, g; while (*key) { h = (h << 4) + *key++; g = h & 0xf0000000L; if (g) h ^= g >> 24; h &= ~g; } return h % mod; }  Используются только поразрядные операции (для эффективности)
  • 19. Jenkins hash functions 19 uint32_t jenkins_hash(char *key, size_t len) { uint32_t hash, i; for (hash = i = 0; i < len; ++i) { hash += key[i]; hash += (hash << 10); hash ^= (hash >> 6); } hash += (hash << 3); hash ^= (hash >> 11); hash += (hash << 15); return hash; }
  • 20. Пример хэш-функции для чисел 20  Ключи – размер файла (int)  Значение, хранимое в словаре – название файла  Требуется разработать хеш-функцию hash(filesize)  [0..1023] function hash(int filesize) return filesize % 1024 end function
  • 21. Пример хэш-функции для строк 21 hash 𝑠 = 𝑖=0 𝐿−1 ℎ 𝐿−(𝑖+1) ∙ 𝑠 𝑖 = = 𝑠[0]ℎ 𝐿−1 + 𝑠[1]ℎ 𝐿−2 + ⋯ + 𝑠 𝐿 − 2 ℎ + 𝑠 𝐿 − 1 , где s – ключ (строка), L – длина строки, s[i] – код символа i
  • 22. Хеш-таблицы (Hash table) 22  Длину h хеш-таблицы выбирают как простое число  Для такой таблицы модульная хеш-функция дает равномерное распределение значений ключей hash(key) = key % h
  • 23. Хеш-таблицы vs. Бинарное дерево поиска 23 Операция Hash table (unordered map) Binary search tree (ordered map) Add(key, value) O(m) O(nm) Lookup(key) O(m + nm) O(nm) Delete(key) O(m + nm) O(nm) Min() O(m(n + h)) O(n) Max() O(m(n + h)) O(n)  Эффективность реализации словаря хеш-таблицей (метод цепочек) и бинарным деревом поиска  Ключ – это строка из m символов  Оценка сложности для худшего случая (worst case)
  • 24. Хеш-таблицы vs. Бинарное дерево поиска 24 Операция Hash table (unordered map) Binary search tree (ordered map) Add(key, value) O(m) O(mlogn) Lookup(key) O(m + mn/h) O(mlogn) Delete(key) O(m + mn/h) O(mlogn) Min() O(m(n + h)) O(logn) Max() O(m(n + h)) O(logn)  Эффективность реализации словаря хеш-таблицей (метод цепочек) и бинарным деревом поиска  Ключ – это строка из m символов  Оценка сложности для среднего случая (average case)
  • 25. Реализация хеш-таблицы 25 #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];
  • 26. Хеш-функция 26 unsigned int hashtab_hash(char *key) { unsigned int h = 0; char *p; for (p = key; *p != '0'; p++) { h = h * HASHTAB_MUL + (unsigned int)*p; } return h % HASHTAB_SIZE; } THash = O(|key|)
  • 27. Инициализация хеш-таблицы 27 void hashtab_init(struct listnode **hashtab) { int i; for (i = 0; i < HASHTAB_SIZE; i++) { hashtab[i] = NULL; } } TInit = O(h)
  • 28. 28 Добавление элемента в хеш-таблицу 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; } } TAdd = THash + O(1) = O(1)
  • 29. 29 Поиск элемента 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; } TLookup = THash + O(n) = O(n)
  • 30. Поиск элемента 30 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; }
  • 31. Удаление элемента 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; } } 31 TDelete = THash + O(n) = O(n)
  • 32. Удаление элемента 32 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; }
  • 33. Домашнее чтение 33  Прочитать в [Sedgewick2001, С. 575] о хеш-функциях для вещественных чисел  Прочитать в “Практике программирования” [KP] информацию о хеш-таблицах  Прочитать “Глава 11. Хеш-таблицы” [CLRS, С. 282]