Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

Глава 9. Хеш-таблицы, карты и списки пропуска

9.1.4 Простое основанное на списке внедрение карты

Простой способ осуществить карту состоит в том, чтобы сохранить свои n записи в списке L, imple-

чеканивший как вдвойне связанный список. Выполняя фундаментальные функции, найдите (k), поместите (k, v), и сотрите (k), включает простые просмотры вниз L поиск входа с ключом k. Псевдокодекс представлен в Кодовых Фрагментах 9.4. Мы используем примечание [L.begin (), L.end ()) обозначить все положения списка L, от L.begin () и до, но не включая, L.end ().

Алгоритм находит (k):

Вход: ключ k Продукция: положение соответствующего входа L или конец, если нет никакого ключа k в L

для каждого положения p +[L.begin (), L.end ()), делают

если p.key () = k тогда

возвратите p

возвратите конец Нет никакого входа с ключом, равным kпомещенный Алгоритм (k, v):

Вход: пара значения ключа (k, v) Продукция: положение вставило/изменило вход

для каждого положения p +[L.begin (), L.end ()), делают

если p.key () = k тогда

*p¬ (k, v)

возвратите p

возвращают положение из измененного входа

p ¬ L.insertBack((k, v)) n¬ n+1 Увеличивают переменное число хранения записей

возвратите p

Алгоритм стирает (k):

Вход: ключ k Продукция: Ни один

возвращают положение из вставленного входа

для каждого положения p +[L.begin (), L.end ()), делают

если p.key () = k тогда

L.erase (p)

n¬ n-1 Переменная декремента хранение числа записей

Кодовый Фрагмент 9.4: Алгоритмы для находки, помещенной, и, стирают для карты, сохраненной в списке L.

Это основанное на списке внедрение карты просто, но это только эффективно для очень маленьких карт. Каждые из фундаментальных функций берут O (n) время на карте с n записями, потому что каждая функция вовлекает поиск всего списка в худший случай. Таким образом мы хотели бы что-то намного быстрее.

9.2. Хеш-таблицы 375

9.2 Хеш-таблицы

Ключи, связанные с ценностями в карте, как правило, считаются «адресами» для тех ценностей. Примеры таких заявлений включают таблицу символов компилятора и регистрацию переменных окружения. Обе из этих структур состоят из коллекции символических имен, где каждое имя служит «адресом» для свойств о типе и стоимости переменной. Один из самых эффективных способов осуществить карту при таких обстоятельствах состоит в том, чтобы использовать хеш-таблицу. Хотя, как мы будем видеть, продолжительность худшего случая операций по карте в хеш-таблице n-входа - O (n). Хеш-таблица может обычно выполнять эти операции в O (1) ожидаемое время. В целом хеш-таблица состоит из двух главных компонентов, множества ведра и функции мешанины.

9.2.1 Множества ведра

Множество ведра для хеш-таблицы - множество размера N, где каждая клетка A считается «ведром» (то есть, собрание пар значения ключа), и целое число N определяет способность множества. Если ключи - целые числа, хорошо распределенные в

диапазон [0, N- 1], это множество ведра - все, что необходимо. Вход e с ключом k

просто вставленный в ведро [k]. (См. рисунок 9.2.)

Рисунок 9.2: множество ведра размера 11 для записей (1, D), (3, C), (3, F), (3, Z), (6, A), (6, C), и (7, Q).

Если наши ключи - уникальные целые числа в диапазоне [0, N- 1], то каждое ведро держится

самое большее один вход. Таким образом поиски, вставки и удаления во множестве ведра берут

O (1) время. Это походит на большой успех, но у него есть два недостатка. Во-первых, использованное пространство пропорционально N. Таким образом, если N намного больше, чем число записей n фактически существующий в карте, у нас есть трата пространства. Вторая ничья -

назад то, что ключи требуются, чтобы быть целыми числами в диапазоне [0, N-1], который часто является нет

случай. Из-за этих двух недостатков мы используем множество ведра в соединении

с «хорошим» отображением от ключей до целых чисел в диапазоне [0, N- 1].