以下代码的渐近时间复杂度是多少?

时间:2014-02-06 04:55:49

标签: algorithm

你如何提出Big O符号?

float sum = 0 ; 
    for ( int i = 1; i < n ; i++)
    {
    sum + = A[i];
    }
    cout << sum;

2 个答案:

答案 0 :(得分:2)

很好,你问这个。我刚刚在课堂上讨论了这个问题。 Big O表示法用于描述算法的效率或复杂程度。

O(1)是同时执行的算法。这是最有效的算法类型。例如

bool bigO(String[] big)
{
if(big[0] == null)
{
    return false;
}
return true;
}

还有O(N)取决于输入的大小。例如

bool bigO(String[] strings, String value)
{
for(int i = 0; i < strings.Length; i++)
{
    if(strings[i] == value)
    {
        return true;
    }
}
return false;
}

正如您所知,根据输入,此方法可能需要更长时间才能执行。如果strings.Length很小就会很快,但如果它很长,则需要一段时间。

然后有O(N ^ 2)。这涉及到自身内的多个循环。它可以是O(N ^ 3),具体取决于嵌套迭代的深度。例如

bool bigO(String[] strings)
{
for(int i = 0; i < strings.Length; i++)
{
    for(int j = 0; j < strings.Length; j++)
    {
        if(i == j) 
        {
            continue;
        }

        if(strings[i] == strings[j])
        {
            return true;
        }
    }
}
return false;
}

现在通过查看您的算法,您认为您的算法是什么? 如果你说O(N)你是对的。 Big O表示法取决于算法的效率。效率可以取决于 CPU(时间)使用情况, ,内存使用情况 ,磁盘使用情况 和网络使用

答案 1 :(得分:0)

在这段代码中,影响运行时间的唯一参数是nA[i]的实际值无关紧要,因为浮点加法的时间确实如此不依赖于操作数值 - 至少作为第一近似值。因此,运行时间作为n的函数进行分析。

我们有两个分配和一个输出语句(sum= 0i= 1cout sum)执行一次。我们还看到一个完全n-1次的循环;它执行比较,两个整数加法和跳转(i < ni++sum+= A[i]for)。

假设所有原始操作都需要一段时间,我们可以得出结论:对于两个常量A + B.nA,运行时间正好为B

在渐近项中(即当n得到你想要的大小时),你只关心函数的整体行为。因此,您只需查看占优势的术语A.n,甚至可以隐藏常量A。这就是为什么你说运行时间超过O(n),称为线性时间。