这个pascal程序的时间复杂度是多少?

时间:2018-06-26 04:19:02

标签: algorithm time-complexity pascal

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)

1 个答案:

答案 0 :(得分:4)

非常简单。在每个递归级别,您调用下一个级别,传入n一半

what(x*x, n div 2);

由于该值控制着进行多少次呼叫,因此复杂度为O(log N)

例如,如果您以64开头,则可以使用64321684进行调用,210(八次)。以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