algorithm - 如何确定以下算法的时间复杂度?
问题描述
我明天有一个期中考试,很难理解以下时间复杂度问题。
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
然后,我计算循环的迭代次数 n,并将其添加到公式中:
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
- 我增加到 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²) 复杂度是合理的。
推荐阅读
- r - 如何将十六进制代码传递给ggplot中的geom_hline?
- python - 创建或替换 AWS Glue 爬虫
- google-apps-script - Google AppScript - 使用 appscript 更新谷歌表单
- postgresql - PostgreSQL 检查数组是否包含列表中的任何值
- python - Python pandas 正则表达式非常慢
- lit-element - 全局共享数据并在 LitElement 中呈现
- c# - C#从excel加载数据适配器,是否有最大列数?
- python - 在 python 3.8 的异步编程中如何使用 'yield' 语句?
- oracle - Oracle Forms 11g 和 Oracle Forms 12 之间是否存在不兼容问题?
- javascript - 获取目录大小的异步函数(不包括子目录)