【问题标题】:Determining running time of algorithm确定算法的运行时间
【发布时间】:2014-11-15 00:31:42
【问题描述】:

我一直在尝试确定以下组合算法的渐近运行时间。

算法 Alg-1 和 Alg-2 都将其作为输入,并生成一个包含 n 个条目的数组。

Alg-1 是

ALG-1(A[1,...,n])
1: B= ALG-1(A[1,...,⎿n/2⏌])
2: C= ALG-2(A[⎿n/2⏌+1,...,n])
3: return ALG-2(B,C)

考虑到 ALG-2 的运行时间 f(n) 为 Θ(√n),我想确定 ALG-1 的渐近运行时间。

我正在尝试建立算法的递归,然后通过主定理解决它,但我什至不知道如何开始。如果有人能帮我解决这个问题,我会很高兴。

【问题讨论】:

    标签: performance algorithm recurrence


    【解决方案1】:

    T_k 表示在大小为n = 2^k 的输入上运行ALG-1 所需的时间。我将假设您的ALG-2(B, C) 表示ALG-2BC 的串联上运行,其长度为n。然后,看起来你有复发

    T_k = T_{k - 1} + sqrt(n / 2) + sqrt(n) = T_{k - 1} + C * sqrt(2^k),
    

    其中C 是一个常数。如果你通过将T_{k - 1} 写成T_{k - 2} 等来继续扩展它,你会得到

    T_k = C * sqrt(2^k) + C * sqrt(2^{k - 1}) + C * sqrt(2^{k - 2}) + ...
    

    这是一个几何级数,因此总和与前导项的顺序相同(基本上,第一项大约与所有其余项的总和一样大)。所以T_k 的顺序是sqrt(2^k)sqrt(n)

    【讨论】:

    • 感谢您的回答,但现在我有点困惑。我在想递归看起来像 T(n)= 2(n/2)+ n,因为我们将数组分成两个子数组,并且我们遍历所有 n 个元素 1 次。你是怎么得到 (k-1) 的?
    • 您提出了一个很好的观点,即当您将数据传递给 ALG-2 时,即使算法本身只需要 O(sqrt(n)) 时间(例如考虑像二进制搜索这样的东西,它只需要 O(log n) 时间在大小为 n 的输入上)。然而,这通常可以通过引用传递数据来避免,即只传递一个指针而不是复制整个数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2015-06-18
    • 2015-06-16
    相关资源
    最近更新 更多