这种算法的 Big O 是什么?
What is the Big O of such an algorithm?
如果您有这样的代码,大 O 会是什么?我不确定 if
语句如何影响大 O。
n = some arbitrary number
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if(i <= j)
for(k = i; k <= j; k++)
//do some simple operation
y = x+1
else
//do some simple operation
y = y+1
我不考虑编译器优化。我知道这是 O(n^2) 和 O(n^3) 之间的某个地方,但我不确定,因为 if 语句并不总是执行最内层的循环。
这是 O(N^3)。
最后一个循环运行 (j - i + 1)
次。
如何手动找到这笔金额?
这不是火箭数学。
尝试阅读 https://en.wikipedia.org/wiki/Telescoping_series
只是为了节省时间,为此目的使用 wolframalpha 更容易。
O(N * N * N) 我们可以说是 O(N^3)
第一次循环发生N次。
第二个循环发生 N 次。
那些相乘得到 O(N^2)
在所有可能的 N^2 循环中,第三个循环将 运行 大约一半的时间,即 O(N/2) 等同于 O(N)。
这就是你如何得到 O(N * N * N) 或 O(N^3)
事实上,您可以(几乎准确地)计算您执行了多少次操作:
i: 0 到 n-1 = N 次操作
x
j: 0 到 n-1 = N 次操作
x
仅当i<=j,从i到j,或者另一个任务O(1)
other 任务给你 NxN 操作,然后 O(NxN)
也就是说,如果你反转
对于每个 j(0 到 n-1):N 个操作
那么对于从0到j的每一个i,你都做一个从i到j的操作,即j-i+1
和每0到j次操作完全一样。然后你有 (j+1)x(j+2)/2 个操作。
最后,你得到从 0 到 N 的 Sum (j+1)x(j+2)/2 即
1/2 ((N+1)x(N+2)/2 + (N+1)^3/3+(N+1)^2/2+(N +1)/6) 操作,所以 O(N^3)
也许,我忘记了一些+/-1
您可以使用 Sigma 符号分析您的算法:
由此可见,时间复杂度将取决于立方 n
项,因此您的算法在 O(n^3)
.
中
如果您有这样的代码,大 O 会是什么?我不确定 if
语句如何影响大 O。
n = some arbitrary number
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if(i <= j)
for(k = i; k <= j; k++)
//do some simple operation
y = x+1
else
//do some simple operation
y = y+1
我不考虑编译器优化。我知道这是 O(n^2) 和 O(n^3) 之间的某个地方,但我不确定,因为 if 语句并不总是执行最内层的循环。
这是 O(N^3)。
最后一个循环运行 (j - i + 1)
次。
如何手动找到这笔金额? 这不是火箭数学。
尝试阅读 https://en.wikipedia.org/wiki/Telescoping_series
只是为了节省时间,为此目的使用 wolframalpha 更容易。
O(N * N * N) 我们可以说是 O(N^3)
第一次循环发生N次。 第二个循环发生 N 次。 那些相乘得到 O(N^2)
在所有可能的 N^2 循环中,第三个循环将 运行 大约一半的时间,即 O(N/2) 等同于 O(N)。
这就是你如何得到 O(N * N * N) 或 O(N^3)
事实上,您可以(几乎准确地)计算您执行了多少次操作:
i: 0 到 n-1 = N 次操作
x
j: 0 到 n-1 = N 次操作
x
仅当i<=j,从i到j,或者另一个任务O(1)
other 任务给你 NxN 操作,然后 O(NxN)
也就是说,如果你反转
对于每个 j(0 到 n-1):N 个操作
那么对于从0到j的每一个i,你都做一个从i到j的操作,即j-i+1
和每0到j次操作完全一样。然后你有 (j+1)x(j+2)/2 个操作。
最后,你得到从 0 到 N 的 Sum (j+1)x(j+2)/2 即
1/2 ((N+1)x(N+2)/2 + (N+1)^3/3+(N+1)^2/2+(N +1)/6) 操作,所以 O(N^3)
也许,我忘记了一些+/-1
您可以使用 Sigma 符号分析您的算法:
由此可见,时间复杂度将取决于立方 n
项,因此您的算法在 O(n^3)
.