Время работы программы и циклы for (18 сентября 2014)
- Соцопрос
- Математика (простые числа, комплексные числа, Гаусс, ортоганализация Грамма-Шмидта)
- Языки программирования (C++, Java, Python, Haskell или любой друг функ.язык, ASM)
- Упражения на 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 осмысленных действий
- Копирование памяти и другие операции с памятью (регистры по 256 и 512 бит)
- Арифметика: сложение/вычитание, умножение, деление, извлечение корня, тригонометрия.
- Доступ к памяти: последовательный и random access. Кеши и оперативная память: 4K, 4M, 4G.
- Вызов функции. inplace функции.
- Примеры:
- [память] Поиск подстроки в строке за квадрат.
- [кеш] Умножение матриц (кеширование, доступ к памяти).
- [арифметика] Вычисление n-го числа Фибоначчи по модулю 109+7.
- [арифметика] Произведение длинных чисел за квадрат.
- Сколько работают циклы for
- 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)
- Решето Эратосфена. Доказательство времени работы O(nlogn)
- Задачи
- Даны 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 ) и без извлечения корня (два указателя)
- Как еще оптимизировать: убрать все умножения (-20%), минимизировать количество сложений/вычитаний/сравнений (еще -10%)
- Дано 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)
- Оценка суммы интегралом снизу и сверху.
- За O(N1/2 + Neps) − нашли все делители числа N, перебираем x, y, z, как делители числа
- Количество делителей: 109 → 103; 1018 → 105
- Упражения на дом
- Доказать, ∀ε > 0 : D(n) = O(nε), где D(n) − количество делителей числа
- Доказать, что последний алгоритм решения задачи "холодильник" работает за O(N1/2).