这段代码片段的复杂性是什么?

时间:2016-04-17 01:43:59

标签: java algorithm

我对以下代码的时间复杂性有疑问。我猜时间复杂度是 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]);
        }
    }
}

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。它是enter image description here

显然 O(n ^ 3)