В одном 2-й, приращение петли пропорциональна конечной точке контура. Число итераций не увеличивается с n, а только диапазон значений. Начиная с j=0
, он принимает не более 5 приращений j+=(n/4)
для j <= n
, чтобы стать ложным. (Только 4, если n кратно 4). В любом случае это O (1).
Таким образом, внутренняя петля 2-й версии выполняет ~ 5 операций, а снаружи цикла находится cout << endl
, поэтому каждая итерация внешнего цикла выполняет ~ 6 операций печати. (Если они подключены к терминалу, это будет только строка-буферизация, поэтому подсчет стоимости по количеству напечатанных строк = количество системных вызовов. Если это будет файл, по умолчанию он будет заблокирован по блоку, поэтому стоимость ~ = количество операций ~ = число 4k блоков данных, напечатанных.)
Внешний цикл 2-й версии работает от i = 2 .. n, поэтому он запускается n-1 раз, каждый раз печатая 6 строк. (или 5, если n%4 == 0
). T (loop2) = 6n.
Анализ Хассана выглядит нормально для первого цикла.
Таким образом, первым будет T (n) = (n/2) + n? – John
no it будет: n/4 * (n/2 + 1), потому что формула суммирования между 1 и x равна (x/2) * (x + 1) примеру: от 1 до 10 = 10/2 * 11 = 5 * 11 = 55 – hasan83
Вы поняли это? – hasan83