View on GitHub

ITMO-PE

My study notes about Program Engineering at University ITMO

MainPage/Algorithm&DataStructures/Lecture

Lecture 1

Представьте, что:

想象一下:

Рассмотрим задачу:

考虑问题:

Мало ядер? Закон Амдала

В каких единицах лучше измерять время работы алгоритма?

衡量算法运行时间的最佳单位是什么?

Какой из алгоритмов лучше?

哪种算法更好?

-对于小 N? 对于大 N? -常数乘数会有所不同,具体取决于 取决于编程语言、编译器、计算机体系结构…… -f (N) 是什么时间?

void insertion_sort(int *a, int n)
{
    int i, j, t;
    for (i=1; i < n; ++i) {
        t = a[i];
        j = i;
        while (j > 0 && a[j-1] > t) {
            a[j] = a[j-1];
            --j;
        }
        a[j]=t;
    }
}

Инвариант: в начале каждого цикла for подмассив а[0..i-1] состоит из отсортированных элементов изначального подмассива а[0..i-1]
不变性:在每个 for 循环的开始,子数组 a[0..i-1] 由原始子数组 a[0..i-1] 的排序元素组成

Среднее время работы

Наихудшее время работы

平均运行时间

Пренебрежем постоянными множителями, членами меньшего порядка и сфокусируемся на больших /

Время работы f() пропорционально:

我们忽略常数因子、低阶项并关注大 N

$f()$ 的运行时间正比于:

Лучший алгоритм ~ наихудшее время работы алгоритма? растет наиболее медленно с увеличением размера входной задачи (т.е. смотрим только на порядок роста) Цель - линейный рост Какой из алгоритмов лучше?

Что лучше: $N^{100}$ или $2^N$? $N = 1000$?

最佳算法~最差算法时间? 随着输入问题规模的增加,增长最慢(即只看增长顺序) 目标 - 线性增长 哪种算法更好?

哪个更好:$N^{100}$ 或 $2^N$? $N = 1000$?

А как нам описать время выполнения безотносительно ко входным данным, а не только в (наихудшем случае?
我们如何描述执行时间而不考虑输入数据,而不仅仅是(最坏的情况?

О-обозначения: асимптотическая верхняя граница
Говорим, что $f(N)= O(g(N))$, ecли $\exist c$ и $N_0 > 0$ такие, что $0 \le f(N) \le cg(N)$ для всех $N\ge N_0$

($\Omega$-обозначения: асимптотическая нижняя граница Говорим, что f(N) = Q(9 (N)), если 3 си N > 0 такие, что 0 5 cg (N) = f(N) для всех N ≥ No -0,3g(n)

Пусть есть функция f(N) = 239 × N2 + 30 × N + 566 Что верно?

设函数 f(N) = 239 × N2 + 30 × N + 566 什么是对的?

a f(N) = ax NK + ax-1 NK-1 + … + agNt ao

void insertion_sort(int *a, int n)
{
    int i, j, t;
    for (i=1; i < n; ++i) {
        t = a[i];
        j = i;
        while (j > 0 && a[j-1] > t) {
            a[j] = a[j-1];
            --j;
        }
        a[j]=t;
    }
}

T() = O(N2) - верхняя граница для наихудшего случая T() = Q (N) - нижняя граница для наилучшего случая Верно ли, что S2 (N2) - время работы в наихудшем случае?

Экспонента vs полином

Покажем, что $2^N$ растет быстрее $N^2\Leftrightarrow2N \ne O (N^2)$

$N^x$ растет быстрее, чем $(\log N)^y$ для $х, у > 0$ и достаточно больших $N \Leftrightarrow N^x \ne O((\log N)^y)$

Lecture 2

Принцип divide-and-conquer

Оценка сложности

Дерево рекурсии

Умножение чисел

Рекурсивное умножение

Алгоритм Карацубы