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

Algorithm 以下代码的渐近时间复杂度是多少?,algorithm,Algorithm,你是怎么想出大O符号的 float sum = 0 ; for ( int i = 1; i < n ; i++) { sum + = A[i]; } cout << sum; 浮点和=0; 对于(int i=1;i

你是怎么想出大O符号的

float sum = 0 ; 
    for ( int i = 1; i < n ; i++)
    {
    sum + = A[i];
    }
    cout << sum;
浮点和=0;
对于(int i=1;i你问这个真是太好了。我只是在课堂上复习了一遍,问了同样的问题。大O表示法用于描述算法的效率或复杂程度

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

bool bigO(String[] big)
{
if(big[0] == null)
{
    return false;
}
return true;
}
bool bigO(String[] strings, String value)
{
for(int i = 0; i < strings.Length; i++)
{
    if(strings[i] == value)
    {
        return true;
    }
}
return false;
}
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),它取决于输入的大小。比如说

bool bigO(String[] big)
{
if(big[0] == null)
{
    return false;
}
return true;
}
bool bigO(String[] strings, String value)
{
for(int i = 0; i < strings.Length; i++)
{
    if(strings[i] == value)
    {
        return true;
    }
}
return false;
}
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;
}
bool bigO(字符串[]字符串,字符串值)
{
for(int i=0;i
正如您所知,根据输入,此方法可能需要更长的时间来执行。如果strings.Length很小,则速度会很快,但如果长度较大,则需要一段时间

然后是O(N^2)。这涉及it自身中的多个循环。它可以是O(N^3),这取决于嵌套迭代的深度。比如说

bool bigO(String[] big)
{
if(big[0] == null)
{
    return false;
}
return true;
}
bool bigO(String[] strings, String value)
{
for(int i = 0; i < strings.Length; i++)
{
    if(strings[i] == value)
    {
        return true;
    }
}
return false;
}
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;
}
bool bigO(String[]strings)
{
for(int i=0;i
现在看看你的算法,你认为你的算法是什么? 如果你说O(N)你是对的。大O表示法取决于算法的效率。效率取决于 CPU(时间)使用率, ,内存使用率 ,磁盘使用率
和网络使用情况在这段代码中,唯一会影响运行时间的参数是
n
A[i]
的实际值并不重要,因为浮点加法的时间不依赖于操作数值-至少作为第一近似值)。因此,将运行时间分析为
n
的函数

我们有两个赋值和一个输出语句(
sum=0
i=1
coutsum
)执行一次。我们还看到一个循环,它被精确地
n-1
次;它执行一个比较、两个整数相加和一个跳转(
i
i++
sum+=a[i]
for

假设所有基本操作都需要一个恒定的时间量,我们可以得出结论,对于两个常量
a
B
,运行时间正好是
a+B.n


在渐近条件下(即当
n
达到您想要的最大值时),您只关心函数的整体行为。所以你只需要看占支配地位的术语A.n,你甚至可以隐藏常量A。这就是为什么你说运行时间是以
O(n)
为界的,称为线性时间。

提供了一些帮助,说明了如何在一般情况下做到这一点。@ghost不,当然你是对的-完全的大脑崩溃时刻。当你没有定义n代表什么时,避免使用O(n)符号。这种分析有点肤浅,值得一些精确。运行时间随着字符串内容的变化而变化:搜索可以立即成功,也可以不成功;它也可能失败;这就是为什么关注最坏情况下的行为是有意义的。第二种算法的最坏情况是搜索失败;将每个给定字符串与目标进行比较;在最坏的情况下,字符串比较所需的时间与最短的字符串相同;假设目标与任何给定字符串一样长,最坏情况下的时间是O(M),其中M表示字符串中的字符总数