Мой учитель утверждал, что выполнение этого блока кода займет O (n) времени. Я пытаюсь понять, почему. Я понимаю, что два цикла for, связанные вместе, были бы арифметическим рядом ..... мой логический подход был, если K = 3, тогда внутренний цикл будет выполняться три раза, затем два раза, а затем один раз. Если K = 2, то внутренний цикл будет выполняться дважды, один раз, а затем остановится.
В математических терминах это будет N, N-1, N-2 для k = 3
Позже я смог использовать формулу арифметического ряда и получил N * (N + (N- (N-1)) / 2 ..
Я не знаю, как подойти к циклу while.
Все, что я могу предположить, это то, что когда N = 4, цикл запускается дважды, а до N = 9 цикл запускается трижды ... Как бы это установить математически?
Конечным результатом является N * (N + (N- (N-1))) / 2 + O (в то время как цикл), чтобы получить O (N)?
Любой совет будет принят с благодарностью.
void doit(int n) {
int k = 0; int m = n; int s = 0;
while (m <= n) {
k = k + 1;
m = k * k;
}
for (int i = 0; i < k; i++) {
for (int j = i; j < k; j++) {
s = s + m;
m = m - 1;
}
}
}