我正在尝试评估这几行代码的运行时复杂度,这是一个冒泡排序代码。 现在我知道它是O(n ^ 2),但我想做一个准确的分析。 我不确定我做对了
for i ← 1 to n-1
for j ← n downto i+1
if A[j-1] > A[j]
temp ← A[j-1]
A[j-1] ← A[j]
A[j] ← temp
我所做的是: 第一行执行了n次,所以(c1)* n 第二行取决于i,但是它将是n,然后是n-1,...,1 那就是我的问题所在,我应该对i使用求和吗?似乎很奇怪,运行时取决于我 第三行也取决于我们得到的数组,而下一行也取决于我们。
任何人都可以帮助您进行适当的分析吗? 谢谢你。
答案 0 :(得分:0)
对于i
的每个值,代码执行许多取决于i
的操作,例如c(i)
。因此,总操作量为
total := sum_{i=1}^{n-1} c(i)
现在让我们为通用c(i)
计算i
。在最坏的情况下,if
语句的真实分支始终执行并执行C
操作,该操作的数量独立于j
,i
和{{ 1}}。所以
n
因此
c(i) <= sum_{j=n}^{i+1} C
= C*(n - (i+1) + 1)
= C*(n - i)
请注意,在最佳情况下,total <= sum_{i=1}^{n-1} C*(n-i)
= C * sum_{i=1}{n-1} (n-i)
= C * n(n-1)/2
= O(n^2)
的真实分支将永远不会发生,您只需要采取计算不等式所需的操作数即可,例如if
。因此,您可以重复进行相同的计算,然后再将D
替换为C
,将D
替换为<=
以获得
>=