Квадратичное зондирование
Эта статья нуждается в дополнительных цитатах для проверки . ( сентябрь 2019 г. ) |
Квадратичное зондирование — это открытая схема адресации в компьютерном программировании для разрешения хеш-коллизий в хеш-таблицах . Квадратичное зондирование основано на использовании исходного хэш-индекса и добавлении последовательных значений произвольного квадратичного полинома до тех пор, пока не будет найден открытый слот.
Пример последовательности с использованием квадратичного зондирования:
Квадратичное зондирование часто рекомендуется в качестве альтернативы линейному зондированию, поскольку оно требует меньшего количества кластеров . [1] Квадратичное зондирование демонстрирует лучшую локальность ссылки, чем многие другие хеш-таблицы, такие как цепочка ; однако для запросов квадратичное зондирование не обеспечивает такой же хорошей локальности , как линейное зондирование , из-за чего последнее в некоторых настройках оказывается быстрее. [2]
Квадратичное зондирование было впервые предложено Уордом Дугласом Маурером в 1968 году. [3]
Квадратичная функция [ править ]
Пусть h ( k ) — хэш-функция , которая отображает элемент k в целое число из [0, m − 1], где m — размер таблицы. Пусть я й положение датчика для значения k задается функцией
где c 2 ≠ 0 (Если c 2 = 0, то h ( k , i ) деградирует до линейного зонда ). Для данной хеш-таблицы значения c 1 и c 2 остаются постоянными.
Примеры:
- Если , то последовательность зондирования будет
- Для м = 2 н хорошим выбором констант являются c 1 = c 2 = 1/2, поскольку все значения h ( k , i ) для i в [0, m −1] различны (фактически это перестановка на [0, м −1] [4] ). Это приводит к зондовой последовательности ( треугольные числа ), где значения увеличиваются на 1, 2, 3,...
- Для простого числа m > 2 большинство вариантов выбора c 1 и c 2 сделают h ( k , i ) отличным для i в [0, ( m −1)/2]. Такие варианты включают c 1 = c 2 = 1/2, c 1 = c 2 = 1 и c 1 = 0, c 2 существует только m = 1. Однако для данного элемента /2 различных зондов, что требует других методов. чтобы гарантировать успешность вставки, когда коэффициент загрузки превышает 1/2.
- Для , где m , n и p — целые числа, большие или равные 2 (переход в линейный зонд при p = 1), тогда дает цикл всех различных зондов. Его можно вычислить в цикле как: , и
- Для любого m полный цикл с квадратичным зондированием может быть достигнут путем округления m до ближайшей степени 2 и вычисления индекса зондирования: и пропустить итерацию, когда . есть максимум пропущенные итерации, и эти итерации не обращаются к памяти, поэтому на большинстве современных процессоров это быстрая работа. Округление m можно вычислить следующим образом:
uint64_t roundUp2(uint64_t v){
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v |= v >> 32;
v++;
return v;
}
Ограничения [ править ]
Чередование знаков [ править ]
Если знак смещения чередуется (например, +1, -4, +9, -16 и т. д.) и если количество сегментов является простым числом соответствует 3 по модулю 4 (например, 3, 7, 11, 19, 23, 31 и т. д.), то первый смещения будут уникальными (по модулю ). [ нужны дальнейшие объяснения ] Другими словами, перестановка от 0 до получается, и, следовательно, свободное ведро всегда будет найдено, пока существует хотя бы одно.
Ссылки [ править ]
- ^ Кормен, Томас Х.; Лейзерсон, Чарльз Эрик; Ривест, Рональд Линн; Стоун, Клиффорд (2009). Введение в алгоритмы (3-е изд.). Кембридж, Массачусетс, Лондон, Англия: MIT Press. ISBN 978-0-262-53305-8 .
- ^ Рихтер, Стефан; Альварес, Виктор; Диттрих, Йенс (2015). «Семимерный анализ методов хеширования и его влияние на обработку запросов» . Труды Фонда VLDB . 9 (3): 96–107. дои : 10.14778/2850583.2850585 . ISSN 2150-8097 .
- ^ Маурер, WD (1968). «Техника программирования: улучшенный хэш-код для разбросанного хранилища» . Коммуникации АКМ . 11 (1): 35–38. дои : 10.1145/362851.362880 . ISSN 0001-0782 .
- ^ Искусство информатики, том 3, сортировка и поиск, глава 6.4, упражнение 20, Дональд Кнут