伪代码:
s <- 0
for i=1 to n do
if A[i]=1 then
for j=1 to n do
{constant number of elementary operations}
endfor
else
s <- s + a[i]
endif
endfor
其中A [i]是n个整数的数组,每个整数都是1到6之间的随机值。
我在这里失去了......从我的笔记和其他在线资源中挑选,我得到了
T(n)= C1(N)+ C2 + C3(N)+ C4(N)+ C5
其中C1(N)和C3(N)= for循环,C4(N)=常数基本操作。虽然我有一种强烈的感觉,我错了。
答案 0 :(得分:0)
您正在从1..n循环,并且每个循环也从1..n循环(在最坏的情况下)。 O(n ^ 2)对吗?
换句话说:你不应该添加 C3(N)。如果你有一个来自1..n的两个独立for循环就是这种情况。但是你有一个嵌套循环。你将运行内循环N次,外循环运行N次。 N * N = O(n ^ 2)。
答案 1 :(得分:0)
让我们考虑一下这个算法的作用。
你基本上循环遍历数组中的每个元素至少一次(外部为,i为一个)。有时,如果值A [i]为1,那么您也将使用j for循环遍历整个循环。
在最糟糕的情况下,你正在对抗所有1的阵列。
在这种情况下,您的复杂性是:
这意味着:T = T(s)+ n *(T(测试)+ n * T(常数))= n ^ 2 * T(常数)+ n * T(测试)+ T(s)。 渐近地,这是一个O(n ^ 2)。
但这是一个最坏情况的分析(大多数时候你应该执行的分析)。如果我们想要进行平均案例分析怎么办?
在这种情况下,假设A中的值均匀分布,您将访问j的for循环,平均为1/6次。
所以你得到: - 初始时间 - n *(测试[i] == 1 + 1/6 * n *时间{constant ...} + 5/6 * T(增量s)的时间
这意味着:T = T(s)+ n *(T(测试)+ 1/6 * n * T(常数)+ 5/6 * T(inc s))= 1/6 * n ^ 2 * T(常数)+ n *(5/6 * T(inc s)+ T(测试))+ T(s)。
再次,渐近地,这仍然是O(n ^ 2),但根据T(inc s)的值,这可能比其他情况更大或更低。
有趣的练习:你能估算A中一般值分布的预期平均运行时间,而不是统一的运行时间吗?