Оценка асимптотики алгоритмов
ССЫЛКА НА КНИГУ (книга очень интересная и отлично написана, так что при наличии свободного времени рекомендуется прочитать целиком, не пожалеете)
Каждый, кто хочет постигнуть максимально возможных результатов в изучении алгоритмов и их анализе, обязательно должен прочитать книгу Томаса Кормена. Для изучения математических основ асимптотики, подробного разбора определений и принципов анализа алгоритмов мы предлагаем вам прочитать несколько страниц.
- Асимптотические обозначения: страницы 87 - 97
Подробнейший анализ алгоритмов:
- Сортировка вставкой: страницы 57 - 63
- Анализ алгоритмов с примером оценки сортировки вставкой: страницы 64 - 71
- Разработка нескольких алгоритмов и их анализ: страницы 71 - 86
Применение в задачах
Оценка асимптотики алгоритма позволяет прикинуть, сколько секунд решение будет работать на каком-то тесте. Для этого, достаточно посмотреть на то, что внутри O()
, подставить туда нужные нам значения (скорее всего самые сложные по времени тесты для нашего алгоритма, это когда нам дают очень много элементов) и разделить на и получить примерное количество секунд на выполнение.
Например, решение работает за . По условию задачи . Получаем , следовательно программа в секунду уложится.
Это всё относительно, так как :
- Вы можете не верно оценивать саму асимптотику
- Написать код, который не совсем правильно реализует алгоритм.
- Разные операции процессор может делать с разной эффективностью. Например, операция
%
взятие по модулю работает не так быстро, как обычное деление. Так, как для процессора эквивалентно , а это уже три операции. Так-же компилятор может оптимизировать ваш код (и не только улучишь его асимптотику, но и ухудшить).
Таблица для обычных ограничений :
асимптотика | максимальное n для 1-ой секунды |
---|---|
5000 | |
10001 |
Для я написал 1000, так как скорее всего алгоритм использует три вложенных цикла, и компилятор векторизовал их.