Время работы программы и циклы for (9 сентября 2016)
- Упражнения на O-шки и асимптотику.
- O(Θ(O(g)) = ?, O(Θ(Ω(g)) = ?, Θ(Ω(Θ(g)) = ?
- 1 < loglogN < logN ≈ log2N ≈ log(N2) < log2N = 22loglogN < 2(loglogN)2 < Nε <
- √ N = 2logN/2 < N < NlogN < Nlog2N < N2 = 22logN < NlogN = 2log2N < 2εN < 2N < N! < NN
- 2n ≠ Θ(22n)
- (n(2+sin(n)) + arctg(n)) / (√ n + logn + loglogn) = Θ(√ n )
- Сколько работает программа
- 1 секунда = 109 операций = примерно 108 осмысленных действий
- Сортировка работает за NlogN, массив какой длины можно отсортировать? Все log-и примерно одинаковы.
for a=1..n do for b=1..n do
→ Θ(n2)
for a=1..n do for b=a..n do
→ Θ(n2)
for a=1..n do for b=1..ab≤n do
→ Θ(nlogn)
- Пять циклов, n5/5!
- Долгие операции
- cmath: sqrt, sin, cos, atan, ...
- Вызов функции (если оптимизатор не уберёт его). Пример с рекурсией.
- Ввод, вывод (scanf/printf, cin/cout)
- Операции с памятью: new, delete. Работают не за O(1).
- Доступ к памяти: последовательный и random access. Кеши и оперативная память: 4K, 4M, 4G.
- Арифметика: сложение/вычитание, умножение, деление
- Копирование памяти и другие быстрые операции с памятью (регистры AVX по 256 и 512 бит).
- Примеры
- Поиск подстроки в строке за квадрат работает быстро.
- Умножение матриц за n3, for i, for k, for j
- Задачи
- Даны N натуральных чисел, найти кол-во различных
- За O(NlogN) с использованием сортировки
- За O(N + M), если исходные числа от 1 до M (
used[a[i]] = 1
)
- За O(N), если исходные числа произвольные (хеш-таблица)
- Самая простая реализация хеш-таблицы (
List L[M]; a[i] → L[a[i]%M]
)
- Решить в натуральных числах уравнение N = x2 + y2
- За O(N)
- За O(√ N )
- За O(√ N ) и без извлечения корня (два указателя)
- Дано N, найти натуральные x, y, z: N = xyz, и величина 2(xy + yz + zx) минимальна
- За O(N3), O(N2)
- За O(N1/3N1/2) − x ≤ y ≤ z поэтому x ≤ N1/3, y ≤ N1/2
- Более точный анализ: O(N1/6+1/2) = O(N2/3)
- Количество делителей: 109 → 103; 1018 → 105