* Логаритмична сложност.
Да разгледаме цикъла:
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]