降低嵌套循环算法的时间复杂度

时间:2020-03-05 17:51:48

标签: algorithm time-complexity big-o nested-loops

我有以下要重写的算法,因此它具有时间复杂度O(n)。我是算法的新手,但据我所知,由于两个for循环都进行n次迭代,因此复杂度始终为O(n 2 )。甚至有可能降低其复杂性吗?

Algorithm example(ArrayA, ArrayB, n)                                           
Input: 2 arrays of integers, ArrayA and ArrayB, both length n          
Output: integer

value <- 0                                                    1 operation
for i <- 0 to n-1                                             n-1 operations
    for j <- 0 to n-1                                         (n-1)^2 operations
        value <- value + (ArrayA[i] * ArrayB[j])              3(n-1)^2 operations
return value                                                  1 operation

原始操作总数:n 2 + 2n-1,使其时间复杂度为O(n 2 )。

2 个答案:

答案 0 :(得分:1)

通过应用一些代数:

algebra

这是一种算法,可以在O(n)时间内计算出相同的结果:

sum_A ← 0
for i ← 0 to n-1
    sum_A ← sum_A + ArrayA[i]

sum_B ← 0
for j ← 0 to n-1
    sum_B ← sum_B + ArrayB[j]

return sum_A * sum_B

通常来说,不能总是更改带有嵌套循环的算法来减少时间复杂度;但是在某些情况下,您可以做到这一点,只要您能确定有关计算的特定内容,这意味着可以用其他方法完成。

对于这样的总和,有时可以通过编写代数等价物来更有效地计算结果。因此,遇到此类问题时,请戴上数学家的帽子。

答案 1 :(得分:0)

此类操作将仅在n2时间内运行。原因是您必须将i的每个元素与j的每个元素进行比较。例如:

i*j, i*j+1,...,i*j+(n-1)
(i+1)*j, (i+1)*(j+1),...,(i+1)*(j+n-1)
.
.
.
(i+n-1)*j, (i+n-1)*(j+1),...,(i+n-1)*(j+n-1)

没有办法降低复杂性。