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

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

9.2.6 Коэффициенты нагрузки и перефразирование

Во всех схемах хеш-таблицы, описанных выше, коэффициент нагрузки,l = n/N, должен быть сохранен ниже 1. Эксперименты и исследования среднего случая предлагают, чтобы мы поддержалиl <0.5 для открыто обращающихся схем, и мы должны поддержатьl <0.9 для отдельного формирования цепочки.

Поскольку мы исследуем в Упражнении C-9.9, некоторые открыто обращающиеся схемы могут начать

терпят неудачу когдаl³ 0.5. Хотя детали анализа среднего случая хеширования

выходят за рамки этой книги, ее вероятностная основа довольно интуитивна. Если наш

функция мешанины хороша, тогда мы ожидаем, что ценности функции мешанины будут однородно

распределенный в диапазоне [0, N- 1]. Таким образом, чтобы сохранить n пункты в нашей карте, ожидаемом

число ключей в ведре было быn/N ⌉ самое большее, который является O (1), если n - O (N).

С открытым обращением, как коэффициент нагрузкиl растет вне 0,5 и начинает AP -

прожелая 1, группы пунктов во множестве ведра начинают расти также. Эти группы вызывают стратегии исследования «подпрыгнуть вокруг» множества ведра для довода «против» - siderable количество времени, прежде чем они смогут закончить. В пределе, когдаl близко к 1, у всех операций по карте есть линейная ожидаемая продолжительность, с тех пор, в этом случае, мы ожидаем сталкиваться с линейным числом занятых ведер прежде, чем найти одну из нескольких остающихся пустых клеток.

Перефразирование в новый стол

Хранение коэффициента нагрузки ниже определенного порога жизненно важно для открыто обращающихся схем и также беспокойства к отдельно приковывающему цепью методу. Если коэффициент нагрузки хеш-таблицы идет значительно выше указанного порога, то распространено потребовать, чтобы стол был изменен (чтобы возвратить указанный коэффициент нагрузки) и все объекты в - serted в этот новый измененный стол. Действительно, если мы позволяем нашей хеш-таблице стать полной, некоторые внедрения могут потерпеть крах. Перефразируя к новому столу, у хорошего требования есть размер нового множества, по крайней мере, удвоить предыдущий размер. Как только мы ассигновали это новое множество ведра, мы должны определить новую функцию мешанины, чтобы пойти с ним (возможно вычисление новых параметров, как в БЕЗУМНОМ методе). Учитывая эту новую функцию мешанины, мы тогда повторно вставляем каждый пункт от старого множества в новое множество, используя эту новую функцию мешанины. Этот процесс известен как перефразирование.

Даже с периодическим перефразированием, хеш-таблица - действенные средства орудия - луг незаказанная карта. Действительно, если мы всегда удваиваем размер стола с каждой операцией по перефразированию, тогда мы можем амортизировать затраты на перефразирование всех элементов в столе против времени, используемого, чтобы вставить их во-первых. Анализ этого процесса перефразирования подобен этому, раньше анализировал векторный рост. (См. Раздел 6.1.3.) Каждое перефразирование обычно рассеивает элементы всюду по новому множеству ведра. Таким образом хеш-таблица - практическое и эффективное осуществление для незаказанной карты.

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

9.2.7 C ++ внедрение хеш-таблицы

В Кодовых Фрагментах 9.6 до 9,13, мы представляем C ++ внедрение карты

ADT, названный HashMap, который основан на хешировании с отдельным формированием цепочки. Класс - templated с ключевым типом K, типом V стоимости и типом H компаратора мешанины. Компаратор мешанины определяет функцию, мешанина (k), который наносит на карту ключ в индекс целого числа. Как с меньше компараторами (см. Раздел 8.1.2), класс компаратора мешанины делает это, отвергая» ()» оператор.

Мы представляем общую структуру класса в Кодовом Фрагменте 9.6. Определение начинается с общественных типов, требуемых интерфейсом карты, Входом типа входа, и iterator печатают Iterator. Это сопровождается декларациями общественных членских функций. Мы тогда даем данные члена парламента, не занимающего официального поста, которые состоят из числа записей n, мешанины функции компаратора мешанины, и ведро выстраивает B. Мы опустили две секции, которые заполнены в позже. Первой является декларация некоторых сервисных типов и функций, и второй является декларация iterator класса карты.

шаблон <typename K, typename V, typename H>

класс HashMap

общественность:

//

общественные типы

Вход typedef <константа K, V> Вход;

//

(ключ, стоимость) пара

класс Iterator;

//

iterator/position

общественность:

//

государственные функции

HashMap (международная способность = 100);

//

конструктор

международный размер () константа;

//

число записей

пустой bool () константа;

//

действительно ли карта пуста?

Iterator находят (константа K& k);

//

найдите вход с ключом k

Итерэтор поместил (константа K& k, константа V& v);

//

вставьте/замените (k, v)

пустота стирает (константа K& k);

//

удалите вход с ключом k

пустота стирает (константа Iterator& p);

//

сотрите вход в p

Iterator начинаются ();

//

iterator к первому входу

Конец Iterator ();

//

iterator, чтобы закончить вход

защищенный:

//

защищенные типы

станд. typedef:: список <Вход> Ведро;

//

ведро записей

станд. typedef:: вектор <Ведро> BktArray;

//

множество ведра

//.. утилиты .insert HashMap здесь

частный:

интервал n;

//

число записей

У H есть h;

//

компаратор мешанины

BktArray B;

//

множество ведра

общественность:

//

общественные типы

//.. .insert декларация класса Iterator здесь

;

Кодовый Фрагмент 9.6: HashMap класса, который осуществляет карту ADT.

388