Вычислительная сложность алгоритмов на примере поиска и сортировки
- Поиск по неструктурированному множеству пар ?ключ-объект?:
- Чтение ключа: ~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
?? тема повышенной сложности
? теоретическое задание
? тема для самостоятельного изучения