
- •Код процедуры быстрой сортировки
- •Способ выбора опорного элемента
- •Эффективность алгоритма
- •Задача сортировки данных. Определения:
- •Примеры:
- •Задача сортировки данных. Определения:
- •Примеры:
- •Задача сортировки данных. Определения:
- •Примеры:
- •Алгоритм сортировки обменом.
- •Код процедуры сортировки по методу Шелла
- •Задача сортировки данных. Определения:
- •Примеры:
- •Идея метода
- •Рекурсивный характер алгоритма
- •Алгоритм:
- •Пирамидальная сортировка:
- •Две формы хеширования
- •Выбор хеш-функции
- •Выбор хеш-функции в методе деления
- •Выбор хеш-функции в методе умножения
Две формы хеширования
Открытое (внешнее) хеширование, не предполагающее ограничения размеров обрабатываемого множество. Этот вид хеширования называют также расширенным.
Закрытое (внутреннее) хеширование, при котором используется ограниченное пространство для хранения данных. Его называют также прямым хешированием.
Хорошая хеш-функция должна удовлетворять двум требованиям:
ее вычисление должно быть очень быстрым;
она должна примерно поровну распределять элементы по классам с тем, чтобы в каждом классе находилось примерно N/B элементов
Возможность выполнения первого требования отчасти зависит от особенностей машины, а второго - от того, в какой степени хеш-функция имитирует закон случайного распределения целых чисел из интервала [0, B-1]
Выбор хеш-функции
Многочисленные проверки на реальных данных выявили очень хорошую работу двух основных типов хеш-функций.
Один из них основан на делении, а другой на умножении.
В обоих случаях предполагается, что либо ключ x является неотрицательным целым числом, либо существует некоторая функция K(x), соотносящая ключ с таким числом.
Выбор хеш-функции в методе деления
В методе деления в качестве хеш-значения используется остаток от деления K(x) на B:
h(x) = K (x) % B
Очевидно, что в этом случае не все значения B оказываются одинаково пригодными. Например, если B - четное число, то значение h(x) будет четным при четном K(x) и нечетным в противном случае. Это может приводить к значительным смещениям данных.
Совсем плохо брать B равным степени двойки, так как тогда h(x) будет давать правые значащие цифры K (K % B не зависит от других цифр).
Лучше всего взять в качестве B простое число. Это позволяет получить достаточно равномерное распределение элементов по классам.
Выбор хеш-функции в методе умножения
Для мультипликативного хеширования используется следующая формула:
h(x) = [M* {C* K(x)}]
Здесь производится умножение ключа на некую константу С, лежащую в интервале [0..1].
Оператор { } возвращает дробную часть этого произведения. Затем дробная умножается на некоторую константу M.
Оператор [ ] возвращает целую часть результата. Константа M подбирается таким образом, чтобы результат не вышел за границы интервала [0,B-1]
В частности, хороший результат получается при выборе в качестве константы C значения золотого сечения φ=(√5 - 1)/2 ≈ 0,6180339887. Последовательность {φ}, {2φ}, {3φ},... на отрезке [0..1] распределена достаточно равномерно
15.Коллизии и способы их разрешения при открытом и закрытом хешировании.
Отличительные особенности открытого хеширования
Элементы одного класса представлены в виде линейной последовательности произвольной длины, например, в виде списка. Классы называются сегментами.
В хеш-таблице хранятся ссылки на сегменты.
Алгоритм поиска при открытом хешировании
По заданному значению ключа вычисляется хеш-значение, которое рассматривается как индекс в таблице сегментов.
Производится линейный поиск в списке (сегменте), адрес начала которого хранится в элементе таблицы с полученным значением индекса.
Использование списков для представления сегментов позволяет не ограничивать размеров обрабатываемого множества элементов.
Отличительные особенности закрытого хеширования
В хеш-таблице хранятся непосредственно элементы множества.
Классы элементов множества строятся с помощью последовательности хеш-функций h(x), h1(x), h2(x), …и могут пересекаться.
Такой способ формирования классов называется повторным хешированием.
Наиболее простым является линейное хеширование, при котором
hi(x) = (h(x)+i) % B.
Применение методов хеширования
Методы хеширования широко используются в алгоритмах поиска и сравнения в больших массивах данных на основе строк, в том числе:
алгоритмах применяемых в криптографических методах обработки и защиты информации (пароли, электронные подписи, шифрованные сообщения);
алгоритмах поиска в базах данных;
алгоритмах обслуживания таблиц идентификаторов в языковых процессорах типа компиляторов и ассемблеров;
алгоритмах анализа текстов и т.д.