Time complexity 如何计算综合增长顺序?

Time complexity 如何计算综合增长顺序?,time-complexity,complexity-theory,space-complexity,Time Complexity,Complexity Theory,Space Complexity,假设我有一个带有形式参数p的递归过程。这个程序 在Θ(1)(延迟)操作中包装递归调用 并在该调用之前执行Θ(g(k))操作 k取决于p的值。[1] 过程使用参数p/b调用自身,其中b是一个常量(假设它在1到0之间的某个点终止) 问题1。 如果n是过程初始调用中p的参数值,那么对于该过程生成的过程,空间的增长顺序和执行的步骤数(以n为单位)是多少 如果k=p?[2] 如果k=f(p)?[3] 脚注 [1] 也就是说,在参数的值传递到p时 [2] 即,嵌套操作的输入大小与我们的过程相同 [3]

假设我有一个带有形式参数p的递归过程。这个程序

  • Θ(1)(延迟)操作中包装递归调用
  • 并在该调用之前执行Θ(g(k))操作
  • k取决于p的值。[1]

    过程使用参数p/b调用自身,其中b是一个常量(假设它在1到0之间的某个点终止)

    问题1。 如果n是过程初始调用中p的参数值,那么对于该过程生成的过程,空间的增长顺序和执行的步骤数(以n为单位)是多少

    • 如果k=p?[2]
    • 如果k=f(p)?[3]

    脚注 [1] 也就是说,在参数的值传递到p时
    [2] 即,嵌套操作的输入大小与我们的过程相同
    [3] 也就是说,嵌套操作的输入大小是我们过程的输入大小的函数


    抽样程序
    (定义(*a b)
    (cond(=b0)0)
    ((偶数b)(双倍(*a(b减半)))
    (其他(+a(*a(-b 1()())))
    
    此过程根据规则将整数乘法作为重复加法执行

    • a*b=double(a*(b/2))如果b是偶数
    • a*b=a+(a*(b-1))如果b是奇数
    • a*b=0如果b为零
    伪代码:

    define *(a, b) as
    {
        if (b is 0) return 0
        if (b is even) return double of *(a, halve (b))
        else return a + *(a, b - 1)
    }
    
    这里

    • 形式参数是b
    • 递归调用的参数为b/2
    • double x
      是一种类似于
      返回x+x
      Θ(1)操作
    • 将k减半
      Θ(g(k))k=b,即它是Θ(g(b))
    问题2。 当评估
    *(a,n)
    时,以n为单位的增长顺序是什么


    在你回答之前 请注意,主要问题是问题1的两部分


    问题2可以作为第一部分回答。对于第二部分,您可以假设f(p)是您喜欢的任何函数:logp、p/2、p^2等。

    您需要应用麦汁案例分析

    首先,, 您可以使用二次幂近似求解:

    如果这样,那么算法显然需要:(where)

    如果它是一个奇数,那么在应用-1之后,你得到一个偶数,然后除以2,你只能重复几次,步骤的数量也是,b是奇数的情况显然是最坏的情况,这给了你答案


    (我想你需要一个额外的基本情况:b=1)

    我看到有人已经回答了问题2,所以我只回答问题1

    首先要注意的是,问题的两个部分是等价的。在第一个问题中,k=p因此我们对一些函数执行g操作。在第二个例子中,k=f(p)我们执行aΘ(g(f(p))=Θ((g)∘f) (p))。将第一个问题中的g替换为g∘f第二个问题解决了

    因此,我们只考虑第一种情况,即<强> k= P< /强>。用T(n)表示递归过程的时间复杂度,我们得到:
    T(n)=T(n/b)+g(n)[自由项应乘以常数c,但我们可以在“c的量”中讨论复杂性,θ界显然保持不变]

    递推公式的解是T(n)=g(n)+g(n/b)+…+g(n/b^i)+…+g(1)
    除非提供有关g的更多信息,否则我们无法进一步简化它。例如,如果g是一个多项式,g(n)=n^k,我们得到它

    T(n)=n^k*(1+b^-k+b^-2k+b^-4k+…+b^-log(n)*k)为什么
    double n=Θ(1)
    halve n=Θ(g(n))
    ?(假设
    a、b
    具有任意精度)@meowgoesthedog,因为除法运算不直接可用
    halve n
    必须计算
    n/2
    ,这不一定是
    Θ(1)
    。我的观点是,只有当
    a,b
    具有任意精度时,大O分析才相关,即
    double n
    不应该是
    Θ(1)
    操作。@meowgoethedog好的,我明白你的意思。但出于我们的目的,假设Asaf所说的
    +
    -
    是基本的
    Θ(1)
    操作。我们想把这些抽象出来,这样我们就可以专注于更高层次的分析。在任何情况下,给出的过程都只是代表性的。我的问题主要是关于一般情况。另外,我在问题中提到了
    Θ
    (θ)而不是
    O
    (big-O)(如果它们不同的话)。此外,我主要是在寻找第一个问题(有两个部分)的答案。对不起,如果这不清楚,我已经编辑了我的问题,使之明确。第一个问题有点让人困惑,f(n)是什么意思?看来你可以运用主定理来解决这个问题:谢谢。我已经澄清了我的问题,以区分n(初始值)和p(给定示例中的b),p是n传递到的形式参数。我想说的是f(p)。请参见添加的脚注。你可以假设它是p的任意函数。注:对于k=n的情况,即
    halve
    isΘ(g(n))这回答了问题2。但在问题中,它是Θ(g(b)),即调用它的成本随着每次连续递归调用而变化。此外,变量名表示与问题中不同的内容,可能会引起混淆。不过公平地说,至少