Содержание
- 2. АТД «Словарь» (dictionary) Словарь (ассоциативный массив, associative array, map, dictionary) – структура данных (контейнер) для хранения
- 3. Хеш-таблицы (Hash tables) Хеш-таблица (hash table) – структура данных для хранения пар «ключ – значение» Доступ
- 4. Основная идея Чем хороши статические массивы int v[100]? Быстрый доступ O(1) к элементу массива по его
- 5. Основная идея Чем хороши статические массивы int v[100]? Быстрый доступ O(1) к элементу массива по его
- 6. Хеш-таблицы (Hash tables) Ключ (Key) “Антилопа Гну” Хеш-таблица (Hash table) Хеш-функция (Hash function) hash(key) -> int
- 7. Хеш-таблицы (Hash tables) Хеш-таблица (Hash table) 0 1 2 … h – 1
- 8. Хеш-функции (Hash function) Хеш-функция (Hash function) – это функция преобразующая значения ключа (например: строки, числа, файла)
- 9. Хеш-функции (Hash function) Хеш-функция (Hash function) – это функция преобразующая значения ключа (например: строки, числа, файла)
- 10. Хеш-функции (Hash function) #define HASH_MUL 31 #define HASH_SIZE 128 unsigned int hash(char *s) { unsigned int
- 11. Понятие коллизии (Collision) Коллизия (Collision) – это совпадение значений хеш-функции для двух разных ключей Keys Hashes
- 12. Разрешение коллизий (Collision resolution) Метод цепочек (Chaining) – закрытая адресация Элементы с одинаковым значением хеш-функции объединяются
- 13. Разрешение коллизий (Collision resolution) Открытая адресация (Open addressing) В каждой ячейке хеш-таблицы хранится не указатель на
- 14. Требования к хеш-функциям Быстрое вычисление хэш-кода по значению ключа Сложность вычисления хэш-кода не должна зависеть от
- 15. Требования к хеш-функциям Равномерность (uniform distribution) – хеш-функция должна равномерно заполнять индексы массива возвращаемыми номерами Желательно,
- 16. Требования к хеш-функциям Равномерность (uniform distribution) – хеш-функция должна равномерно заполнять индексы массива возвращаемыми номерами Желательно,
- 17. Эффективность хеш-таблиц Хеш-таблица требует предварительной инициализации ячеек значениями NULL – трудоемкость O(h)
- 18. Пример хэш-функции для строк unsigned int ELFHash(char *key, unsigned int mod) { unsigned int h =
- 19. Jenkins hash functions uint32_t jenkins_hash(char *key, size_t len) { uint32_t hash, i; for (hash = i
- 20. Пример хэш-функции для чисел Ключи – размер файла (int) Значение, хранимое в словаре – название файла
- 21. Пример хэш-функции для строк
- 22. Хеш-таблицы (Hash table) Длину h хеш-таблицы выбирают как простое число Для такой таблицы модульная хеш-функция дает
- 23. Хеш-таблицы vs. Бинарное дерево поиска Эффективность реализации словаря хеш-таблицей (метод цепочек) и бинарным деревом поиска Ключ
- 24. Хеш-таблицы vs. Бинарное дерево поиска Эффективность реализации словаря хеш-таблицей (метод цепочек) и бинарным деревом поиска Ключ
- 25. Реализация хеш-таблицы #include #include #include #define HASHTAB_SIZE 71 #define HASHTAB_MUL 31 struct listnode { char *key;
- 26. Хеш-функция unsigned int hashtab_hash(char *key) { unsigned int h = 0; char *p; for (p =
- 27. Инициализация хеш-таблицы void hashtab_init(struct listnode **hashtab) { int i; for (i = 0; i hashtab[i] =
- 28. Добавление элемента в хеш-таблицу void hashtab_add(struct listnode **hashtab, char *key, int value) { struct listnode *node;
- 29. Поиск элемента struct listnode *hashtab_lookup( struct listnode **hashtab, char *key) { int index; struct listnode *node;
- 30. Поиск элемента int main() { struct listnode *node; hashtab_init(hashtab); hashtab_add(hashtab, "Tigr", 190); hashtab_add(hashtab, "Slon", 2300); hashtab_add(hashtab,
- 31. Удаление элемента void hashtab_delete(struct listnode **hashtab, char *key) { int index; struct listnode *p, *prev =
- 32. Удаление элемента int main() { struct listnode *node; /* ... */ hashtab_delete(hashtab, "Slon"); node = hashtab_lookup(hashtab,
- 34. Скачать презентацию