Два цикла while должны быть O (n):
1. i = 2^n;
2. j = (1/2) * log (i) = 1/2 * n = n/2
3. the inner while executes for n/2 times then j becomes 0, now i = i / 2^(n/2) = 2^(n/2);
Теперь эта программа вернется к шагу 1, только с уменьшением вдвое.Таким образом, два цикла должны быть:
n/2+n/4+n/8+... = O(n)
На самом деле это также можно рассматривать с более простой точки зрения.Поскольку цикл не завершится до тех пор, пока i == 1, и для каждого выполнения i = i / 2 внутренний цикл будет выполняться n раз.Представьте, что мы сглаживаем внутренний цикл и выходной цикл, i = i / 2 будет n раз, следовательно, два цикла O (n).
В заключение, T (n) = T (n/ 3) + T (n / 2) + O (n).
Надеюсь, это может быть полезно!