Уравнение простой повторяемости разрешения

Мне нужно найти рекуррентное уравнение следующей функции.

public static boolean f(int[] a) {
    return fr(a, 0);
}

private static boolean fr(int[] a, int i) {
    int n = a.length;
    if(i >= n-1) 
        return true;
    else if(a[i] > a[i+1]) 
        return false;
    else 
        return fr(a, i+1);
}

Я думаю, что это:

Т(1) = 1

T(n) = T(n - 1)

Разрешая, я получаю результат T(n) = n. Это правильно? Странным кажется решение этого уравнения. Глядя на код, легко увидеть, что сложность равна Θ(n) (проходит через весь массив).

Это глупый вопрос, но он приводит меня в замешательство. Спасибо всем, кто хочет мне помочь


person Community    schedule 05.06.2015    source источник
comment
Что заставляет вас думать, что T(n) = T(n - 1)? Вы как-то думаете, что T(2) = T(1) = 1? И если да, то является ли T(3) = T(2) = T(1) = 1, ... T(n) = 1?   -  person Amit    schedule 06.06.2015
comment
@Amit T(n) = T(n-1), потому что рекурсивный вызов выполняется для длины массива минус 1...   -  person    schedule 06.06.2015


Ответы (1)


T(1) = O(1)
T(n) = T(n-1) + O(1)

Это действительно сигнатура последовательного поиска, и он имеет временную сложность O(n). Это связано с тем, что T(n) = T(n-1) имеет сложность O(n) и терм O(1) выпадает.

Решение тривиально: скажем, мы знаем T(n) = T(n-1), и мы также знаем, что T(1) = O(1). Это подразумевает, что T(2) = O(1) и T(3) = O(1) и так далее. Так что это просто эквивалентно n*O(1), что равно O(n).

person Special Sauce    schedule 05.06.2015
comment
Почему aT(n-1) был добавлен O(1)? Является ли оператор return? - person ; 06.06.2015
comment
Член O(1) исходит из стоимости фактического сравнения больше чем. Вы также можете концептуально объединить остальные операторы функции, такие как if и return. Пока они являются одноразовыми операторами и их сложность не зависит от длины n, все они будут в сумме равны O(1). - person Special Sauce; 06.06.2015