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

Скачать презентацию Оценка сложности • Одну и ту Скачать презентацию Оценка сложности • Одну и ту

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

  • Количество слайдов: 12

>  Оценка сложности • Одну и ту же задачу можно решить разными Оценка сложности • Одну и ту же задачу можно решить разными способами • Эквивалентность? • Сложность – затрачиваемое время – временная сложность – необходимая память – ёмкостная сложность – в худшем случае – в среднем • Учёт самых «дорогих» операций • Необходим анализ алгоритмов

>  Вычисление полинома float poly(float coef[], int n, float x)  • Одно Вычисление полинома 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 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 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 Пример пессимизации 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 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 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)  • Пример оптимизации 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) { Пример оптимизации 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 Итеративная константа power exp(log(x)*i) Накопление константа power схема константа Горнера

>    Коварство O • Функция g(n) имеет порядок O(f(n)), если Коварство 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”);