int k=1;
while (k<n){
k=k+C //where C is a constant and >=2
}
Это займет (n-1)/C
шагов: напишите u = (k-1) / C. Тогда k = Cu + 1 и утверждение становится
u=0;
while(u < (n-1)/C) {
u=u+1
}
Следовательно, цикл while равен O(n)
(поскольку C
является константой)
РЕДАКТИРОВАТЬ: позвольте мне попытаться объяснить это с другой стороны.
Начните с фиктивной переменной u
. Петля
u=0;
while(u < MAX) {
u = u+1
}
работает MAX
раз.
Когда вы разрешите MAX = (n-1) / C
, цикл будет
u=0;
while(u < (n-1)/C) {
u=u+1
}
И это работает (n-1)/C
раз.
Теперь проверка u < (n-1)/C
эквивалентна C*u < n-1
или C*u + 1 < n
, поэтому цикл эквивалентен
u=0;
while(C*u + 1 < n) {
u=u+1
}
Теперь предположим, что мы переписали этот цикл в терминах переменной k = C * u + 1
. Тогда,
u=0;
k=1; // C * 0 + 1 = 1
Петля выглядит как
while(C*u + 1 < n) {
while(k < n) {
и внутреннее состояние
u=u+1
k=k+C //C * (u+1) + 1 = C * u + 1 + C = old_k + C
Собираем все вместе:
int k=1;
while (k<n){
k=k+C
}
делает (n-1)/C
шагов.