Вычислительная сложность алгоритмов на примере поиска и сортировки
- Поиск по неструктурированному множеству пар «ключ-объект»:
- Чтение ключа: ~N операций
- Сравнение ключей: ~N операций
- Поиск по упорядоченному множеству
- Дополнительные условия: отношение порядка и прямой доступ к элементам
- Алгоритм: половинное деление (бинарный поиск)
- Чтение ключа: ~log₂N операций
- Сравнение ключа: ~log₂N операций
- Сортировка
- Операции чтения и записи объекта
- Сортировка выбором
- Оценка сложности: (N-1)*(N-2)/2 ⇒ ~N²
Замечание: много паразитных сравнений
- Сортировка вставками: нужны «дешёвые» вставка и удаление (как в списке, а не как в массиве):
- Идея: вставляем очередной элемент в упорядоченный список (N-1 шаг), при этом место вставки определяем бинарным поиском (log₂N сравнений)
- ⇒ сложность ~N*log₂N
Сортировка слиянием: нужна дополнительная память (возвращается новый список), зато достаточно последовательного доступа к элементам
- Половинное деление снова обеспечивает сложность ~N*log₂N
Домашнее задание
Первое
Определить функции Compare(), Read() и Write(), которые сравнивают два элемента последовательности, читают и пишут элемент соответственно, ведя при этом подсчёт совершённых операций. Запрограммировать алгоритмы сортировки так, чтобы использовались только эти функции. Сравнить количество сравнений, чтений и записей в разных алгоритмах.
Условные обозначения
— тема по Linux
— тема повышенной сложности
— теоретическое задание
— тема для самостоятельного изучения