如何解决如何确定以下算法的时间复杂度?
1。
Algorithm foo(n)
i←0
j←0
while i<n do {
if j=i then j←j+1
else if j=2i then i←n−j
else {
i←i+1
j←j+1
}
}
哪个是O(1)
2。
Algorithm foo(n)
i←0
j←0
while i<n do {
if i=k then {
A[i]←k
k←k+1
i←1
}
}
else i←i+1
哪个是O(n ^ 2)
因此,基本上,我一直在解决这些类型的问题的方法是找到算法中执行恒定数量操作的部分。对于算法1,这将是变量以及循环中的内容:
C1:
i←0
j←0
C2:
if j=i then j←j+1
else if j=2i then i←n−j
else {
i←i+1
j←j+1
f(n)= C1 + nC2是O(n)(错误的答案)
我可以说,我的问题是我在错误计算这两个循环的迭代次数。如果有人让我知道我的思维过程是否完全错误和/或我应该如何计算循环迭代次数,将不胜感激。
解决方法
您是否实现了算法,只是看发生了什么?您应该,如果还没有的话。
示例1
def bigo_one(n):
print(f"n == {n}")
i = 0
j = 0
while i<n:
if j==i:
j = j + 1
elif j == 2 * i:
i = n - j
else:
i = i + 1
j = j + 1
print(i,j)
bigo_one(10)
bigo_one(100)
bigo_one(1000)
输出:
n == 10
0 1
1 2
8 2
9 3
10 4
n == 100
0 1
1 2
98 2
99 3
100 4
n == 1000
0 1
1 2
998 2
999 3
1000 4
从输出中很容易看到总是发生什么,而与n无关:
- j增加到2
- 我跳到n-2
- i增加到n
总是5步-> O(1)
示例2
def bigo_nsquare(n):
print(f"n == {n}")
i = 0
j = 0
while i<n:
if j==i:
j = j + 1
i = 1
else:
i = i + 1
print(i,j)
bigo_nsquare(2)
bigo_nsquare(4)
bigo_nsquare(10)
输出:
n == 2
1 1
1 2
2 2
n == 4
1 1
1 2
2 2
1 3
2 3
3 3
1 4
2 4
3 4
4 4
n == 10
1 1
1 2
2 2
1 3
2 3
[...]
此循环逐步遍历方矩阵的下三角,因此它具有O(n²)复杂度是可能的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。