所以我已经被这个问题困扰了很长一段时间,我想,我可以从这个社区得到一些支持,作为我的最后手段
Algorithm gibby(A, B, n)
Input: arrays of integers, A and B, both of length n
Output: integer value
lal := 0
for i := 0 to n-1
for j := 0 to n-1
lal := lal + (A[i] * B[j])
endfor
endfor
return lal
我认为这是正确的,时间复杂度为0(N^2(,如果我错了,请详细说明,因为这将不胜感激。
此外,我如何创建另一个算法,该算法计算的内容与上面的算法完全相同,但时间复杂度为0(N(?
提前谢谢。
您的复杂性分析是正确的,因为您在两个数组上嵌套了两个迭代。
关于在线性时间O(N(中创建算法,您可以利用乘法和加法的数学特性。交换性、结合性和分配性使我们能够重新排序您想要进行的计算。
例如,n=4,输入数组为:
A=[a][c][e][g]
B=[b][d][f][h]
您的算法将执行以下计算:
i = 0 and j = 0..3: ab + ad + af + ah = a(b+d+f+h)
i = 1 and j = 0..3: cb + cd + cf + ch = c(b+d+f+h)
i = 2 and j = 0..3: eb + ed + ef + eh = e(b+d+f+h)
i = 3 and j = 0..3: gb + gd + gf + gh = g(b+d+f+h)
如果你采用等价的表达式,并再次简化表达式:
a(b+d+f+h) + c(b+d+f+h) + e(b+d+f+h) + g(b+d+f+h)
你得到:
(b+d+f+h)(a+c+e+g)
它是单个数组之和的乘积。这将得到相同的结果,但可以使用线性时间算法来实现。使用您的伪代码语法,算法将如下所示:
suma := 0
sumb := 0
for i := 0 to n-1
suma := suma + A[i]
sumb := sumb + B[j]
endfor
return suma*sumb
- 是的,您的算法的时间复杂度(上限(为O(n^2(。您有两个嵌套的
for
循环,每个循环运行n
次 - 在最坏的情况下,基元运算
lal := lal + (A[i] * B[j])
的总数为n X n=n ^2。这和最坏的一样第1点中讨论的案例时间复杂性
p。S.您可能想阅读Thomas H.Cormen的算法导论中的几章。它解释了时间复杂性的基本原理。每个程序员都应该阅读这篇文章。