Алгоритм A: худший случай случается, когда X уменьшается настолько медленно, насколько это возможно. Максимально возможное значение X после одной итерации тела l oop равно X - 1 (поскольку это максимальное значение, которое может вернуть rand, а поскольку Y положительно, то X - Y должно быть меньше X). Следовательно, в наихудшем случае, когда rand всегда выбирает X - 1, время выполнения функции асимптотически ограничено линейной функцией - O (n).
Алгоритм B: наихудший случай происходит, когда X уменьшается так же медленно насколько это возможно. Максимально возможное значение X после одной итерации тела l oop равно floor (X / 2). Причина этого заключается в следующем: предположим, что Y меньше, чем пол (X / 2). Тогда min выберет Y, а не X - Y. Предположим, что вместо этого Y больше пола (X / 2). Тогда min выберет X - Y, а не Y. Следовательно, наихудший случай достигается, когда Y = floor (X / 2). Если мы допустим N = 2 ^ M, то X уменьшится вдвое около M раз. Это означает, что время выполнения асимптотически логарифмически c - O (log n).
Алгоритм C: мы можем записать отношение повторения для времени выполнения следующим образом:
T(0) = a
T(1) = b
T(n) = T(f(n)) + T(n-f(n)) + c
Нам нужно найти функцию f (n), которая делает повторение настолько плохим, насколько это возможно. Давайте начнем исследовать n = 2, 3,…, k,… и посмотрим, появятся ли какие-либо шаблоны, которые могут сообщить нам о правильном выборе первых нескольких значений f (n):
T(2) has only one split: Y=1, X-Y=1; so T(2) = 2a + c
T(3) has two equivalent splits: Y=1, X-Y=2; so T(3) = 3a + 2c
T(4) has two different splits:
Y=1, X-Y=3: 4a + 3c
Y=2, X-Y=2: 4a + 3c
these end up being the same
T(5) has two different splits:
Y=1, X-Y=4: 5a + 4c
Y=2, X-Y=3: 5a + 4c
these end up being the same
T(6) has three different splits:
Y=1, X-Y=5: 6a + 5c
Y=2, X-Y=4: 6a + 5c
Y=3, X-Y=3: 6a + 5c
these end up being the same
Все они оказываются абсолютно одинаковыми; выбор среди них, кажется, не имеет значения вообще. Это может быть связано с тем, что дополнительная работа на каждом этапе является постоянной; если бы это зависело от n, тогда анализ вполне мог бы получиться иначе. Выражение для каждого из рассмотренных нами значений n имело вид + c (n-1). Это линейная функция, поэтому мы ожидаем, что время выполнения этого алгоритма будет асимптотически линейным: O (n).