你如何提出Big O符号?
float sum = 0 ;
for ( int i = 1; i < n ; i++)
{
sum + = A[i];
}
cout << sum;
答案 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)
在这段代码中,影响运行时间的唯一参数是n
(A[i]
的实际值无关紧要,因为浮点加法的时间确实如此不依赖于操作数值 - 至少作为第一近似值。因此,运行时间作为n
的函数进行分析。
我们有两个分配和一个输出语句(sum= 0
,i= 1
,cout sum
)执行一次。我们还看到一个完全n-1
次的循环;它执行比较,两个整数加法和跳转(i < n
,i++
,sum+= A[i]
,for
)。
假设所有原始操作都需要一段时间,我们可以得出结论:对于两个常量A + B.n
和A
,运行时间正好为B
。
在渐近项中(即当n
得到你想要的大小时),你只关心函数的整体行为。因此,您只需查看占优势的术语A.n
,甚至可以隐藏常量A
。这就是为什么你说运行时间超过O(n)
,称为线性时间。