О чём лекция
Как сравнивать алгоритмы, если один и тот же код на разных компьютерах работает от сотых долей секунды до минут. Время измеряется в тактах, а важен не точный счёт, а то, как он растёт с длиной входа. Для этого вводятся оценки O, Ω и Θ — язык, на котором дальше в курсе будет описан любой алгоритм. В конце — три версии проверки числа на простоту и их оценки.
Маршрут
- Что измеряем → Время работы алгоритма
- Как описываем рост → Асимптотические оценки
- Сколько стоит цикл → Циклы
1. Алгоритмы и структуры данных
Структуры данных нужны, чтобы хранить информацию.
Что оптимизируем в алгоритме:
- время работы (time) — обозначается T;
- память (memory) — обозначается M.
На полях рядом перечислены ещё «улучшить визуал», «многопоточность», «безопасность» — без пояснений. По-видимому, это другие стороны оптимизации; на лекции дальше разбирались только время и память.
2. Время работы
Один и тот же алгоритм выполняет тактов. Запустим его на трёх компьютерах:
| Компьютер | Скорость | Время работы |
|---|---|---|
| мой | тактов/с | 10 с |
| бабушкин | тактов/с | 100 с |
| МФТИ | тактов/с | 0,01 с |
Секунды зависят от компьютера, а число тактов — нет. Поэтому время переводится в такты.
Модель, в которой так считают, — RAM-модель. Такт — простейшее действие:
- сравнение;
- присвоение;
- создание переменной.
Подробнее — Время работы алгоритма.
3. Память
N — длина входа ──вход──▶ [ Алгоритм ] ──выход──▶
компьютер
memory: доп. памятьN — длина входа. Кроме памяти под вход и выход алгоритму может понадобиться дополнительная память — её и оценивают.
4. Зависимость тактов от длины входа
На графике по горизонтали — длина входа N (отмечены 10 и 100), по вертикали — такты, то есть время.
- Экспериментальный график — ломаная по замерам: растёт, но с колебаниями, местами даже проседает.
- «Моё предположение — тенденция» — плавная кривая, проведённая сквозь замеры.
Интересна именно тенденция: как растёт число тактов при росте N. Её и описывают оценки.
5. Оценки: O, Ω, Θ
Пусть — число тактов (наши данные), — функция, с которой сравниваем.
O — «О-большое»
— «наши данные оценены сверху функцией ».
На графике: до точки N кривая может подниматься выше , а после N всегда остаётся под ней.
Ω — «омега»
Зеркально: после точки N кривая всегда выше — оценка снизу.
Θ — «тета»
После точки N кривая зажата между и — оценка с обеих сторон.
Подробнее — Асимптотические оценки.
6. Асимптотика
От медленного роста к быстрому:
| Оценка | Название |
|---|---|
| константа: | |
| логарифм | |
| корневая | |
| линейная | |
| … | |
На лекции сказали, что основание логарифма может быть любым.
Не из лекции: почему основание не важно
Логарифмы по разным основаниям отличаются только постоянным множителем:
Например, при любом N. А постоянный множитель в O-оценке поглощается константой из определения: если , то . Поэтому , и — одна и та же оценка, и основание не пишут.
Таблица сравнения
, компьютер делает тактов в секунду:
| Время работы | Тактов | Секунд |
|---|---|---|
| 1 | ||
секунд — больше трёх лет. Разница между линейным и квадратичным алгоритмом на таком входе — секунда против нескольких лет.
Не из лекции: откуда 18
18 — это натуральный логарифм: . Двоичный дал бы . На вывод таблицы это не влияет: в обоих случаях это десятки тактов против .
7. Упрощение оценок
Пример 1. .
Если , то . Обозначим — получили , то есть . Постоянный множитель уходит в константу.
Пример 2. .
Из получаем с .
Не из лекции: почему это верно
При выполнено , значит и . Достаточно было бы ; из лекции тоже подходит, просто с запасом. Младшее слагаемое поглощается старшим.
8. Проверка числа на простоту
простое, если у него 2 делителя — и 1.
Запись — « делится на ».
Вариант а — перебрать все делители
counter = 0
for i = 1 ... p
если p ⋮ i
counter += 1
если counter = 2
число простое
иначе
не простоеПодсчёт тактов:
counter = 0— 1 такт;- тело цикла — не больше 2 тактов, и выполняется оно N раз;
- проверка
counter = 2в конце — 2 такта.
Как считается стоимость цикла — Циклы.
Вариант б — до первого делителя
counter = 0
for i = 2 ... p-1
если p ⋮ i
counter += 1
break
если counter = 0
число простое
иначе
не простоеПроверяем только «лишние» делители — от 2 до — и останавливаемся на первом найденном. .
Не из лекции: почему
breakне улучшил оценкуЕсли простое, делителя в диапазоне нет,
breakне срабатывает, и цикл проходит все итерации. Оценка O описывает рост сверху, поэтому определяет её именно такой, самый долгий случай.
Вариант в — до корня
counter = 0
for i = 2 ... ⌈√N + 1⌉
если p ⋮ i
counter += 1
break
если counter = 0
число простое
иначе
не простое.
Не из лекции: почему хватает корня
Если и оба множителя больше , то — противоречие. Значит, у составного числа есть делитель не больше , и дальше искать незачем.
Обозначения в этом разделе
В разделе 3 N — длина входа. Здесь считается по самому числу : цикл варианта «а» делает итераций. В варианте «в» граница записана как — по смыслу это . Конспект повторяет запись лекции.
Не из лекции: число 1
Для в вариантах «б» и «в» цикл не выполняется ни разу,
counterостаётся 0, и ответ — «простое». По определению выше у 1 один делитель, и она не простая. Вариант «а» отвечает верно:counter = 1. Чтобы «б» и «в» были правильными, 1 нужно проверять отдельно.
Грабли
- Сравнивать алгоритмы в секундах. Тот же алгоритм на другом компьютере работает в 10 раз дольше или в 1000 раз быстрее. Сравнивают такты и их рост.
- Путать O, Ω и Θ. O — оценка сверху, Ω — снизу, Θ — с обеих сторон сразу.
- Выписывать константы и основания. , и пишутся как , и .
- Верить, что
breakвсегда ускоряет. В худшем случае он не срабатывает, и оценка остаётся прежней. - Забыть про в проверке на простоту.
После этой лекции должно получаться
- объяснить, почему время работы меряют в тактах, а не в секундах;
- записать определения O, Ω и Θ и нарисовать к каждому картинку;
- упорядочить , , , , , , по скорости роста;
- прикинуть по таблице, уложится ли алгоритм в секунду при ;
- посчитать такты простого цикла и свести результат к O-оценке;
- объяснить, почему проверка на простоту до правильна и почему она быстрее.