算法的运行时间

时间:2018-09-29 15:34:36

标签: arrays algorithm big-o

对不起,这是一个三部分的问题。我一直在努力获得第一部分,并且我认为如果我掌握了其余部分,那么我的运行时间就不太正确了。我知道有n次迭代,但是没有如何在不使用值j的情况下计算内部循环的迭代次数

请考虑以下基本问题。您得到的数组A由n个整数A [1],A [2],... A [n]组成。您想输出二维 n×n数组B,其中B [i,j](对于i = j,因此这些值的输出无关紧要。) 这是解决此问题的简单算法。

For i=1, 2,...,n
    For j=i+1, i+2, ... n
        Add up array entries A[i] through A[j]
        Store the result in B[i,]]
    Endfor
 Endfor

(a)对于应该选择的某些函数f,在大小为n的输入上,以该算法的运行时间为界,形式为O(f(n))。算法执行的操作)。

(b)对于相同的函数f,表明算法在大小为n的输入上的运行时间也为〜2(f(n))。 (这显示了®(f(n))在运行时间上的渐近严格边界。)

(c)尽管您在(a)和(b)部分分析的算法最多 解决问题的自然方法-毕竟,它只是遍历数组B的相关条目,为每个条目填充一个值-它包含了一些非常不必要的效率低下的原因。给出一种不同的算法来解决此问题,并以渐近地更好的运行时间。换句话说,您应该设计一个运行时间为O(g(n))的算法,其中limn-> infinity g(n)/ f(n)= O。

2 个答案:

答案 0 :(得分:0)

我将介绍第一部分。然后,对于您来说解决第二部分可能就足够清楚了。第三个问题是一个完全独立的问题(因此,如果需要帮助,也应单独发布)。

要分析运行时间,我们可以从内部开始,然后逐渐向外

Add up array entries A[i] through A[j]

假设您直接遍历条目,这将为您提供j - i + 1(抽象时间单位)的运行时间。确切的数目将取决于实现以及您对操作进行计数的方式。对于O(*)表示法,这没有什么区别。我将保留这些特定时间,并且不会将它们简化为一些O(*)表示法,因为您可能会需要(b)部分的特定时间。

Store the result in B[i,j]

运行时间为1。因此,内部循环中的部分的运行时间为j - i + 2。我将用T(j - i + 2)开始替换代码。因此,我们剩下的代码是:

For i=1, 2,...,n
    For j=i+1, i+2, ... n
        T(j - i + 2)
    Endfor
 Endfor

要找到内部循环的运行时间,我们需要求解给定范围内的总和:Sum (for j from i+1 to n) (j - i + 2)。这是带有解1/2 * (i - n - 5) * (i - n)的算术级数。现在的代码是:

For i=1, 2,...,n
    T(1/2 * (i - n - 5) * (i - n))
Endfor

再次求和就得出了1/6 * (n^3 + 6n^2 - 7n)的最终运行时间。而且此功能位于O(n^3)中。

答案 1 :(得分:0)

由于A[i]A[j]的总和为j - i + 1,因此f(n) = \sum_{i=1}^n\sum_j={i+1}^n (j-i+1) + 1的{​​{1}}是为1增值的。因此,通过B[i,j]k = j - i + 1的变化变量。通过更改变量f(n) = \sum_{i=1}^n \sum_{k=0}^{n-i+1}k = \sum_{i=1}^n (n-i +1)(n - i + 2)/2h = n-i。因此,f(n) = \sum_{h=1}^{n-i} (h + 1)(h + 2)/2。这表示算法为f(n) = n^3

对于第三部分,您可以根据这一事实使用O(n^3)。这意味着您可以使用先前计算的总和来计算转发的总和。利用这个事实,您可以将B[i, j] = B[i, j-1] + A[j]更改为j - i + 1。这意味着1g(n) = n^2的等轴线。