2016-06-26 3 views
2

Вычислить временную сложность этого фрагмента кода, если функция «процесс» имеет сложность O (LogN)Является ли временная сложность этого кода правильной?

void funct (int a[], int n) 
{ 
    int i=0 
     while (i < n){ 
     process (a, n); 
     if (a[i]%2 == 0) 
      i = i*2+1; 
     else 
      i = i+1; 
    } 

Я пытался вычислить наилучший и наихудший случай сложности времени;

Худший случай, когда «еще» заявление дозвонилось таким образом это должно быть просто:

В худшем случае: Т (п) = O (NlogN)

У меня есть некоторые проблемы с лучшим случаем. Я попробовал этот путь, но я не знаю, если это правильно

Так как в «если» заявление «я» получить приращение на «2i + 1» должно быть

i=2^k-1 
2^k < n+1 

so k < log_2(n+1) 

Является ли правильным сказать, что цикл while выполняется (log_2(n+1)-2)/2 раз, потому что это последнее возможное значение, для которого i < n?

Если это так, то сложность времени O (lognlogn) в лучшем случае?

+1

Сложности верны, но цикл while исполняется 'ceil (log_2 (n + 1))' раз. После первой итерации 'i = 1'. После второго 'i = 2 + 1'. После третьего 'i = 2^2 + 2 + 1' и т. Д. После последней i.e 'kth' итерации' i = 2^k-1> = n'. Поэтому 'k' должен быть' ceil (log_2 (n + 1)) '. Пожалуйста, поправьте меня, если вы найдете это неправильно. –

+0

Да, вы правы, спасибо –

ответ

1

Наилучший случай, если выборковые значения в a все четные. В этом случае сложность составляет O(log(n)*log(n)), так как счетчик циклов составляет O(log(n)).

В худшем случае, если выбранные значения в a являются нечетными. В этом случае сложность составляет O(n*log(n)), так как счетчик циклов составляет O(n).

+0

Спасибо за ответ (у меня даже нет репутации downvote btw). Не могли бы вы подтвердить, если в лучшем случае цикл while будет выполнен (log_2 (n + 1) -2)/2 раза? –

+1

В лучшем случае счетчик циклов - 'O (log (n))', так как 'i' более чем удваивается каждый раз и меньше, чем в три раза, что все, что вам нужно, чтобы получить' O (log (n)), '. Я не уверен, является ли ваше выражение count count точным или нет в этом случае, но это 'O (log (n))', что важно. –

+0

Хорошо, спасибо, по крайней мере, я знаю, что сложность была правильной: D –

Смежные вопросы