如何计算伪代码的时间复杂度
How to calculate time complexity on psuedo-code
所以我已经被这个问题困扰了很长一段时间,我想,我可以从这个社区获得一些支持作为我最后的手段
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^2)。您有两个嵌套
for
循环,每个循环 运行 n
次。
- 在最坏的情况下,原始操作的总数
lal
:= lal + (A[i] * B[j])
是n X n = n^2。这和最坏的一样
第 1 点中讨论的案例时间复杂度。
P.S。您可能想阅读 Thomas H. Cormen 的 Introduction to Algorithms 的几章。它解释了时间复杂度的基本原理。每个程序员都应该阅读这篇文章。
您的复杂性分析是正确的,因为您在两个数组上嵌套了两次迭代。
关于在线性时间 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
所以我已经被这个问题困扰了很长一段时间,我想,我可以从这个社区获得一些支持作为我最后的手段
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^2)。您有两个嵌套
for
循环,每个循环 运行n
次。 - 在最坏的情况下,原始操作的总数
lal := lal + (A[i] * B[j])
是n X n = n^2。这和最坏的一样 第 1 点中讨论的案例时间复杂度。
P.S。您可能想阅读 Thomas H. Cormen 的 Introduction to Algorithms 的几章。它解释了时间复杂度的基本原理。每个程序员都应该阅读这篇文章。
您的复杂性分析是正确的,因为您在两个数组上嵌套了两次迭代。
关于在线性时间 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