Внешняя петля не работает n/a раз, которая была бы с i + = a. Вместо этого он запускает журнал (a, n). Рассмотрим n = 30, a = 2.Это даст следующие действия:
рывок я
Так пятый раз он не будет выполняться. Это похоже на поведение log (2,30) (или log (30)/log (2)), которое возвращает около 4.906.
Итак, первый цикл работает 4 раза.
Теперь предположим, что вы хотите иметь этот внутренний цикл:
for(int j = 1; j <= i; j++)
Это первый запустить 1 раз, потом 2 раза, затем 4 раза, затем 8 раз, затем 16 раз. Общее количество раз тогда:
1 + 2 + 4 + 8 + 16
который равен (2^m)*2-1
, где m
является log(2,30)
. В этом случае это будет 10, поэтому внутренний цикл будет работать 31 раз.
Теперь ваша внутренняя петля имеет i*b
. Это означает, что он будет работать в два раза. Другими словами, ((2^m)*2-1)*b
.
Таким образом, в общей сложности у нас есть:
int m = (int)Math.floor(log(a,n));
return ((a^m)*a-1)*b/(a-1);
Это может быть сокращен до:
Return a^Math.floor(log(a,n))*b;
Пожалуйста, поправьте меня, если я ошибаюсь, потому что я ничего не проверял. Был интересный вызов сделать из головы.
Вам нужно точное число или просто 'O'-обозначение? – Petr
@Petr Exact был бы лучше, но метод, чтобы прийти к O-нотации, также поможет мне понять, что происходит. – gdagger
BTW, «петля outter будет работать n/a раз» неправильно – Petr