我不确定以下代码的一般时间复杂性。
Sum = 0
for i = 1 to N
if i > 10
for j = 1 to i do
Sum = Sum + 1
假设i和j增加1。 我知道第一个循环是O(n),但第二个循环只在N> 1时运行。 10.一般时间复杂度是否为O(n ^ 2)?非常感谢任何帮助。
答案 0 :(得分:1)
考虑Big O Notation的定义。
________________________________________________________________
让 f :ℜ→ℜ和 g :ℜ→ℜ。
然后, f ( x )= O ( g ( X ))
⇔
∃ k ∈ℜℜ∋ M > 0∈ℜℜ∋ x ≥ k ,| f ( x )| ≤ M ⋅| g ( x )|
________________________________________________________________
可以不那么正式地阅读:
________________________________________________________________
让 f 和 g 成为实数子集上定义的函数。
然后, f 是 g 的 O ,如果足够大 x ' s(这是 k 在正式定义中的含义)有一个
常量 M (当然来自实数),这样< em> M 次 g ( x )总是大于
或等于(实际上,你可以增加 M 它总会更大,但我退步了) f ( x )。
________________________________________________________________
(你可能会注意到,如果一个函数是 O ( n ),那么它也是 O ( n ²)和O( e ^ n ),但当然我们通常对“最小”函数 g 感兴趣,这样它是 O ( g )。事实上,当有人说 f 是 O g 那么他们几乎总是意味着 g 是最小的这样的函数。)
让我们将其转化为您的问题。让 f ( N )为您的过程完成 N 的功能所需的时间。现在,假装添加需要一个单位时间来完成(并检查if语句并增加for循环,不需要时间),然后
f (1)= 0
f (2)= 0
...
f (10)= 0
f (11)= 11
f (12)= 23
f (13)= 36
f (14)= 50
我们希望找到一个 g ( N )函数,以便 N 的值足够, f ( N )≤M· g ( N )。我们可以通过 g ( N )= N ²来满足这个要求,而 M 只能是1(也许它可以要小一些,但我们并不在乎。在这种情况下,足够大意味着大于10(当然, f 仍然小于 M ⋅ g 对于 N &lt; 11)。
tl; dr:是的,一般时间复杂度为 O ( n ²),因为Big O假定你的N要去无穷大。
答案 1 :(得分:1)
让我们假设你的代码是
Sum = 0
for i = 1 to N
for j = 1 to i do
Sum = Sum + 1
总共有N^2
次总和操作。使用if i > 10
的代码会减少10^2
次总和操作。因此,对于足够大的N
,我们有
N^2 - 10^2
操作。那是
O(N^2) - O(1) = O(N^2)