Algorithm 时间复杂性

Algorithm 时间复杂性,algorithm,time,complexity-theory,Algorithm,Time,Complexity Theory,我有一些算法,我正试图找到它的时间复杂度。我想出了一些答案,但我不确定它们是否正确。有人能帮我吗 public static int f4(int N){ if (N == 0) return 0; return f4(N/2) + f1(N) + f4(N/2); } // f1 had a time complexity of O(n) 1) 我相信这个是O(n) 2) 我相信这是O(n!)或O(n)。阿克沙的答案很详细 如果第二个函数中有一个循环,那么它将变成O(n!) 下

我有一些算法,我正试图找到它的时间复杂度。我想出了一些答案,但我不确定它们是否正确。有人能帮我吗

public static int f4(int N){
   if (N == 0) return 0;
   return f4(N/2) + f1(N) + f4(N/2);
} // f1 had a time complexity of O(n)
1) 我相信这个是O(n)


2) 我相信这是O(n!)或O(n)。

阿克沙的答案很详细

如果第二个函数中有一个循环,那么它将变成O(n!)

下面的例子是O(n!)

f6(int N){
如果(N==0)返回1;
对于(int i=0;i第一个问题的分析
声明指出,如果形式
f(n)=a*f(n/b)+O(n^k)
重复出现,可能会导致三种类型的复杂性:

  • 时间复杂度为
    O(n^k)
    if
    log{b}(a)
  • 时间复杂度为
    O(n^k log n)
    if
    log{b}(a)==k
  • 时间复杂度是O(n^(log{b}(a))
  • if
    log{b}(a)==k
    第一次重复出现的形式如下:

    f4(N) = 2f4(N/2) + O(n) = 2f4(N/2) + O(n^1)
    
    这显然属于第二种情况,如
    log{2}(2)==1
    。因此正确答案是
    O(n logn)

    您的第一个问题具有时间复杂性

    第二个问题分析 重复出现的形式为

    f6(N) = 2f6(N - 1)
    
    您可以将其展开如下:

    f6(N) = (2^k)f6(N - k)
    
    通过简单地将关系应用于
    f6(N-1)
    f6(N-2)
    ,等等

    由于
    f6(0)
    会立即返回,即需要一个步骤才能返回,因此完整的运行时复杂性为

    f6(N) = 2^N 
    
    只需插入
    k==N


    因此,第二个问题具有指数时间复杂度,我认为最好像调用方法那样递归地解决这个问题。 对于功能f6:

    T(n) = 2T(n-1) + c      = > T(n-1) = 2T(n-2) + c
    Then : T(n) = 2(2T(n-2)) + c) + c 
    T(n) = 4T(n-2) + 2c + c      => T(n-2) = 2T(n-3) + c
    T(n) = 4(2(T(n-3) + c) + 2c + c 
    T(n) = 8T(n-3) + 4c + 2c + c
    .
    .
    .
    T(n) = 2^i T(n - i) + 2^(i-1)c + 2^(i-2)c + ... + (2^0)c
    When i asymptotically goes to n , that is : i => n , then : 
    T(n) = 2^n T(n-n) + 2^(n-1)c + 2^(n-2)c + ... + (2^0)c
    T(n) = O(2^n)
    

    什么是
    f1
    ?在不知道的情况下无法评估
    f4
    。我不确定这个问题的直接答案是提问者真正需要的,而不是算法复杂性的完整课程。@ShadowRanger OP说“f1”的时间复杂性为o(n)@Lotharyx算法分析是我的下一门课程。这个问题是关于数据结构的。1)O(n logn)。参见主定理。例如:合并排序。2)O(2^n)。画一棵二叉树。它的基础有2^n个节点,总节点数是2*2^n-1=>O(2^n)。你对1的分析是不正确的。你忘记了-
    f4
    的递归关系是
    f4(N) =2f4(N/2)+O(N)
    ,它正确地解析为
    O(N log N
    )。您在某种程度上是正确的……但在该函数中……O(N)函数多次被称为“N”……捕捉得很好,但在这种情况下,递归关系变为
    f4(N)=2f4(N/2)+N*(O(N))
    ,其顺序与
    f4(N)=2f4(N/2)相同+O(n^2)
    ,意味着它是
    O(n^2)
    。事实上,不是。函数
    O(n)
    没有被调用
    n
    次。它被
    n
    调用一次。它将在
    O(n/2)
    的递归调用中被调用,但您仍然可以证明它的总体复杂性为
    O(n)
    通过绘制关联的二叉树。@kataymaradu:您试图用函数在基本情况下的完整运行时复杂性替换递归关系中的术语,而不考虑对
    f4(N/2)
    (调用O(N/2)函数等的影响)。主定理允许您仅使用返回签名的运行时复杂性来计算运行时复杂性,该复杂性正确地为
    2f4(N/2)+O(N)
    。请查阅主定理的证明以了解如何正确替换它,它位于链接中。
    f6(N) = 2^N 
    
    T(n) = 2T(n-1) + c      = > T(n-1) = 2T(n-2) + c
    Then : T(n) = 2(2T(n-2)) + c) + c 
    T(n) = 4T(n-2) + 2c + c      => T(n-2) = 2T(n-3) + c
    T(n) = 4(2(T(n-3) + c) + 2c + c 
    T(n) = 8T(n-3) + 4c + 2c + c
    .
    .
    .
    T(n) = 2^i T(n - i) + 2^(i-1)c + 2^(i-2)c + ... + (2^0)c
    When i asymptotically goes to n , that is : i => n , then : 
    T(n) = 2^n T(n-n) + 2^(n-1)c + 2^(n-2)c + ... + (2^0)c
    T(n) = O(2^n)