В программировании первичная кластеризация — это явление, которое вызывает снижение производительности в хэш -таблицах с линейным зондированием . Это явление заключается в том, что по мере добавления элементов в хэш-таблицу с линейным зондированием они имеют тенденцию группироваться в длинные прогоны (т. е. длинные смежные области хэш-таблицы, не содержащие свободных слотов). Если хэш-таблица имеет коэффициент загрузки для некоторого параметра , то ожидаемая длина прогона, содержащего заданный элемент, составляет . Это приводит к тому, что вставки и отрицательные запросы занимают ожидаемое время в хэш-таблице с линейным зондированием.
Первичная кластеризация имеет две причины:
Другой способ понять первичную кластеризацию — изучить стандартное отклонение количества элементов, которые хэшируются в заданную область в хэш-таблице. [2] Рассмотрим подобласть хэш-таблицы размером . Ожидаемое количество элементов, которые хэшируются в область, равно . С другой стороны, стандартное отклонение количества таких элементов равно . Из этого следует, что с вероятностью количество элементов, которые хэшируются в область, превысит размер области. Интуитивно это означает, что области размером часто будут переполняться, в то время как более крупные области, как правило, этого не делают. Эта интуиция часто используется в качестве отправной точки для формального анализа первичной кластеризации. [2] [3] [4]
Первичная кластеризация приводит к снижению производительности как для вставок, так и для запросов в линейной хэш-таблице зондирования. Вставки должны перемещаться в конец прогона и, следовательно, занимать ожидаемое время . [1] Отрицательные запросы (т. е. запросы, которые ищут элемент, который оказывается отсутствующим) также должны перемещаться в конец прогона и, следовательно, также занимать ожидаемое время . [1] Положительные запросы могут быть завершены, как только они найдут элемент, который они ищут. В результате ожидаемое время запроса случайного элемента в хэш-таблице составляет . [1] Однако положительные запросы к недавно вставленным элементам (например, элементу, который был только что вставлен) занимают ожидаемое время . [1]
Эти границы также справедливы для линейного зондирования с ленивыми удалениями (т.е. с использованием надгробий для удалений), пока хэш-таблица перестраивается (и надгробия очищаются) получасто. Достаточно выполнять такую перестройку по крайней мере один раз за каждую вставку. [2]
Во многих учебниках эффект «победитель сохраняет победу» (при котором чем длиннее становится серия, тем больше вероятность накопления дополнительных элементов) описывается как единственная причина первичной кластеризации. [5] [6] [7] [8] [9] [10] [11] Однако, как отметил Кнут, [1] это не главная причина первичной кластеризации.
В некоторых учебниках указано, что ожидаемое время для положительного запроса составляет , [11] [12] обычно ссылаясь на Кнута. [1] Это справедливо для запроса к случайному элементу. Однако некоторые положительные запросы могут иметь гораздо большее ожидаемое время выполнения. Например, если вставить элемент, а затем немедленно запросить этот элемент, запрос займет столько же времени, сколько и вставка, что и ожидается.
Упорядоченное линейное зондирование [13] (часто называемое хэшированием Робин Гуда [14] ) — это метод снижения влияния первичной кластеризации на запросы. Упорядоченное линейное зондирование сортирует элементы в каждом запуске по их хэшу. Таким образом, запрос может быть завершен, как только он встретит любой элемент, хэш которого больше, чем у запрашиваемого элемента. Это приводит к тому, что как положительные, так и отрицательные запросы занимают ожидаемое время .
Хеширование кладбища — это вариант упорядоченного линейного зондирования, который устраняет асимптотические эффекты первичной кластеризации для всех операций. [2] Хеширование кладбища стратегически оставляет пробелы в запусках, которые могут быть использованы будущими вставками. Эти пробелы, которые можно рассматривать как надгробия (подобно тем, которые создаются ленивыми удалениями ), вставляются в таблицу во время полурегулярных перестроек. Затем пробелы ускоряют вставки, которые происходят до тех пор, пока не произойдет следующая полурегулярная перестройка. Каждая операция в хеш-таблице кладбища занимает ожидаемое время .
Многие источники рекомендуют использовать квадратичное зондирование в качестве альтернативы линейному зондированию, которое эмпирически позволяет избежать эффектов первичной кластеризации.
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ){{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка ) CS1 maint: числовые имена: список авторов ( ссылка ){{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )