5. Оценка и сложност на алгоритми [1.4.8] - 4.11.2003

* Логаритмична сложност.
Да разгледаме цикъла:
for (sum=0, i=0; i<n; i++) sum++;
Променливата i приема стойности 1, 2, 4, ..., 2k, ...  докато надмине n. Цикълът се изпълнява [log n] пъти. Сложността е O(log n).

Пример: Двоично търсене - рекурсивен алгоритъм.
Броим обръщенията към елементите на масива. В рекурсивната функция се разглежда средния елемент и се прави едно рекурсивно извикване с два пъти по-малък масив. Следователно, ако T(n) е функцията, която задава броя на обръщенията, то T(n) = T(n/2) + 1. От равенствата
                T(n) = T(n/2) + 1 = T(n/4) + 2 = T(n/8) + 3 = ... = T(n/2k) + k
получаваме за n=2k, че  T(n) = T(1) + log n, т.е. сложността на алгоритъма е O(log n).

* Изчисляване на сложност при рекурсия.

** Характеристични уравнения [1.4.9]
Числа на Фибоначи
      T(n) = T(n - 2) + T(n - 1)

** Специални техники за анализ на алгоритми [1.4.10]
- Измерване на времето за работа
- Използване на барометър
- Амортизационен анализ - зависимост от входните данни
Най-добър случай, най-лош случай, обща сложност

** Проблеми при асимптотичната нотация [1.4.11]