如何评估和解释此算法的运行时间?

时间:2014-11-05 16:34:05

标签: algorithm time evaluation

伪代码:

    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)=常数基本操作。虽然我有一种强烈的感觉,我错了。

2 个答案:

答案 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的阵列。

在这种情况下,您的复杂性是:

  • 时间到初始
  • n *(测试[i] = = 1 + n *时间{constant ...}的时间)

这意味着: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中一般值分布的预期平均运行时间,而不是统一的运行时间吗?