Вычислить временную сложность этого фрагмента кода, если функция «процесс» имеет сложность 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) в лучшем случае?
Сложности верны, но цикл 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)) '. Пожалуйста, поправьте меня, если вы найдете это неправильно. –
Да, вы правы, спасибо –