Время применять золотое правило понимания гнезд цикла:
Если есть сомнения, работайте наизнанку!
Давайте начнем с оригинального гнезда цикла:
for (int i=n/2; i<=n; i++)
for (int j=1; j<=n; j = 2 * j)
for (int k=1; k<=n; k = k * 2)
count++;
Этот внутренний цикл будет выполняться Θ (log n) раз, поскольку после m итераций цикла мы видим, что k = 2 m , и останавливаемся, когда k ≥ n = 2 * 1012.* LG N .Итак, давайте заменим этот внутренний цикл на более простое выражение:
for (int i=n/2; i<=n; i++)
for (int j=1; j<=n; j = 2 * j)
do Theta(log n) work;
Теперь посмотрим на самый внутренний оставшийся цикл.С тем же рассуждением, что и раньше, мы видим, что этот цикл также выполняется Θ (log n).Поскольку мы выполняем Θ (log n) итераций, каждая из которых выполняет Θ (log n), мы видим, что этот цикл можно заменить на этот более простой:
for (int i=n/2; i<=n; i++)
do Theta(log^2 n) work;
И здесь этот внешний цикл выполняется Θ (n), поэтому общее время выполнения составляет Θ (n log 2 n).
Я думаю, что, основываясь на том, что вы сказали в своем вопросе, вы имели правильные представления, но просто забылиумножьте на две копии лог-термина, по одному для каждого из двух внутренних циклов.