我对以下代码的时间复杂性有疑问。我猜时间复杂度是 O(n ^ 3),但我的朋友告诉我,时间复杂度应该是 O(n ^ 2)。但是,我仍然不相信答案。我的立场是:第一个和第二个for循环将花费 O(1/2 n ^ 2),内循环将需要另一个O(n)复杂度。因此,它大约是 O(n ^ 3)。
for (int i = 1; i <= len; i++) {
for (int j = i + 1; j <= len; j++) {
int mid = (i + j) / 2;
for (int k = i; k <= j; k++) {
dist[i][j] += Math.abs(A[k - 1] - A[mid - 1]);
}
}
}
答案 0 :(得分:2)
所以你需要找到这样的时间复杂度:
for (int i = 1; i <= N; i++) {
for (int j = i + 1; j <= N; j++) {
for (int k = i; k <= j; k++) {
// some O(1) operation
}
}
}
每个循环都以O(N)运行,因此复杂度为O(N ^ 3)。你也可以用你的语言编写一个简单的测试程序(我在python中写道):
def check(N):
s = 0
for i in xrange(1, N + 1):
for j in xrange(i + 1, N + 1):
for k in xrange(i, j + 1):
s += 1
return s
print [check(i) for i in xrange(1, 10)] // [0, 2, 7, 16, 30, 50, 77, 112, 156]
并检查closed form for this sequence。它是,
显然 O(n ^ 3)