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

![Вычисление полинома float poly(float coef[], int n, float x) • Одно Вычисление полинома float poly(float coef[], int n, float x) • Одно](https://present5.com/presentation/3/53756159_182680290.pdf-img/53756159_182680290.pdf-2.jpg)
![Пример оптимизации float poly(float coef[], int n, float x) { Пример оптимизации float poly(float coef[], int n, float x) {](https://present5.com/presentation/3/53756159_182680290.pdf-img/53756159_182680290.pdf-3.jpg)
![Пример оптимизации float poly(float coef[], int n, float x) { Пример оптимизации float poly(float coef[], int n, float x) {](https://present5.com/presentation/3/53756159_182680290.pdf-img/53756159_182680290.pdf-4.jpg)
![Пример пессимизации float poly(float coef[], int n, float x) { float Пример пессимизации float poly(float coef[], int n, float x) { float](https://present5.com/presentation/3/53756159_182680290.pdf-img/53756159_182680290.pdf-5.jpg)
![Пример пессимизации float poly(float coef[], int n, float x) • Два Пример пессимизации float poly(float coef[], int n, float x) • Два](https://present5.com/presentation/3/53756159_182680290.pdf-img/53756159_182680290.pdf-6.jpg)
![Пример оптимизации float poly(float coef[], int n, float x) • Пример оптимизации float poly(float coef[], int n, float x) •](https://present5.com/presentation/3/53756159_182680290.pdf-img/53756159_182680290.pdf-7.jpg)
![Пример оптимизации float poly(float coef[], int n, float x) • Пример оптимизации float poly(float coef[], int n, float x) •](https://present5.com/presentation/3/53756159_182680290.pdf-img/53756159_182680290.pdf-8.jpg)
![Пример оптимизации float poly(float coef[], int n, float x) { Пример оптимизации float poly(float coef[], int n, float x) {](https://present5.com/presentation/3/53756159_182680290.pdf-img/53756159_182680290.pdf-9.jpg)



Оценка сложности • Одну и ту же задачу можно решить разными способами • Эквивалентность? • Сложность – затрачиваемое время – временная сложность – необходимая память – ёмкостная сложность – в худшем случае – в среднем • Учёт самых «дорогих» операций • Необходим анализ алгоритмов
Вычисление полинома float poly(float coef[], int n, float x) • Одно умножение на { float sum = 0 f; каждой из n+1 for (int i=0; i<=n; i++) итерации цикл for sum += coef[i] * power(i. x); • Глубина рекурсии return sum; power равна n } float power(int n, float x) – i умножений на каждой { итерации цикла for return n==0 ? 1 : x*power(n-1, x); – i фреймов для } хранения локальных void main() объектов { float binom[] = {1, 2, 1}; printf(“%d”, poly(binom, 2, 10. 0)); }
Пример оптимизации float poly(float coef[], int n, float x) { float sum = 0 f; for (int i=0; i<=n; i++) вместо sum += coef[i] * power(i, x); return sum; } float power(int n, float x) { float y = 1; while (n) n&1 ? (y*=x, --n) : (x*=x, n/=2); использовать return y; } void main() { float binom[] = {1, 2, 1}; printf(“%d”, poly(binom, 2, 10. 0)); }
Пример оптимизации float poly(float coef[], int n, float x) { • Одно умножение float sum = 0 f; на каждой из n+1 for (int i=0; i<=n; i++) итерации цикл for sum += coef[i] * power(i, x); • Максимальное return sum; количество } итераций цикла float power(int n, float x) { while равно float y = 1; 2*log(n) while (n) n&1 ? (y*=x, --n) : (x*=x, n/=2); – 4 * log(i) операций return y; умножения на каждой итерации } for void main() { • Память - константа float binom[] = {1, 2, 1}; printf(“%d”, poly(binom, 2, 10. 0)); }
Пример пессимизации float poly(float coef[], int n, float x) { float sum = 0 f; int i; for (i=0; i<=n; i++) sum += coef[i] * exp(log(x)*i); return sum; } void main() { float binom[] = {1, 2, 1}; printf(“%d”, poly(binom, 2, 10)); }
Пример пессимизации float poly(float coef[], int n, float x) • Два умножения на { float sum = 0 f; каждой итерации int i; for (i=0; i<=n; i++) • Неизвестное sum += coef[i] * exp(log(x)*i); количество в exp и return sum; log } void main() • Память – { константа (скорее float binom[] = {1, 2, 1}; всего) printf(“%d”, poly(binom, 2, 10)); }
Пример оптимизации float poly(float coef[], int n, float x) • На каждой { float sum = 0 f; итерации float power; значение power int i; увеличивается в for (i=0, power=1 f; i<=n; power*=x, i++) sum += coef[i] * power; x раз return sum; } void main() { float binom[] = {1, 2, 1}; printf(“%d”, poly(binom, 2, 10)); }
Пример оптимизации float poly(float coef[], int n, float x) • Два умножения на { каждой итерации for float sum = 0 f; • Память – константа float power; int i; for (i=0, power=1 f; i<=n; power*=x, i++) sum += coef[i] * power; return sum; } void main() { float binom[] = {1, 2, 1}; printf(“%d”, poly(binom, 2, 10)); }
Пример оптимизации float poly(float coef[], int n, float x) { Cхема float sum = coef[n]; for (i=n; i>=1; i--) Горнера: sum = sum * x + coef[i]; …((an*10+ an-1)*10 + an-2)*10 + … a 0 return sum; } void main() { float binom[] = {1, 2, 1}; printf(“%d”, poly(binom, 2, 10. 0)); }
Сравнение реализаций Время (количество умножений) Память Рекурсивная power Итеративная константа power exp(log(x)*i) Накопление константа power схема константа Горнера
Коварство O • Функция g(n) имеет порядок O(f(n)), если существуют C 1, C 2 такие, что С 1 f(n) <= g(n) <= C 2 f(n) почти для всех n • Сортировка – «пузырёк» - O(n 2) – слиянием – O(n log(n)) Кто быстрее? • Что такое асимптотическое поведение при n<=232 ?
Мал оператор, да сложен! Пример: Увеличение Добавление символа к строке целого Pascal S : = S + 123 S : = S + “A”; Inc(S[0]); S[ord[S[0]] = “A”; Visual Basic S = S + 123 S = S + “A” C S += 123; S = realloc(S, strlen(S) + strlen(“A”) + 1); strcpy(S, ”A”);

