Function what(x, n:integer): integer:
Var
value : integer
begin
value := 1
if n > 0 then
begin
if n mod 2 =1 then
value := value * x;
value := value * what(x*x, n div 2);
end;
what := value;
end;
这将计算 xn
并具有时间复杂度O(log N)
。
请解释一下时间复杂度及其O(log N)
?
答案 0 :(得分:4)
非常简单。在每个递归级别,您调用下一个级别,传入n
的一半:
what(x*x, n div 2);
由于该值控制着进行多少次呼叫,因此复杂度为O(log N)
。
例如,如果您以64
开头,则可以使用64
,32
,16
,8
,4
进行调用,2
,1
和0
(八次)。以128
开头只会导致一个额外级别的递归。
如果您考虑类似(非递归)情况,则可能会更清楚:
function oLogN(n):
while n > 0:
n = truncate(n / 2)
这基本上就是您的代码的本质,根据不同的n
值取不同数量的steps
,
SEQUENCE
n steps lowest n | highest n (if different)
----- ----- ------------------+-------------------------
0 0 0 |
1 1 1, 0 |
2-3 2 2, 1, 0 | 3, 1, 0
4-7 3 4, 2, 1, 0 | 7, 3, 1, 0
8-15 4 8, 4, 2, 1, 0 | 15, 7, 3, 1, 0
16-31 5 16, 8, 4, 2, 1, 0 | 31, 15, 7, 3, 1, 0
32-63 6 ... and so on