Big o 什么是大O形圈?

Big o 什么是大O形圈?,big-o,Big O,我在读关于大O符号的书。它说, 循环的big O是循环的迭代次数 循环中的语句数 下面是一段代码片段 for (int i=0 ;i<n; i++) { cout <<"Hello World"<<endl; cout <<"Hello SO"; } for(inti=0;iO(n)意味着循环的时间复杂度随着元素的数量线性增加 2*n仍然是线性的,所以你说循环的阶数是O(n) 但是,您发布的循环是O(n),因为循环中的指令需要固定的时间

我在读关于大O符号的书。它说,

循环的big O是循环的迭代次数 循环中的语句数

下面是一段代码片段

for (int i=0 ;i<n; i++)
{
    cout <<"Hello World"<<endl;
    cout <<"Hello SO";
}
for(inti=0;iO(n)意味着循环的时间复杂度随着元素的数量线性增加

2*n仍然是线性的,所以你说循环的阶数是O(n)


但是,您发布的循环是O(n),因为循环中的指令需要固定的时间。两倍的常数仍然是一个常数。

通常
大O
表示法表示函数中的主要操作数

在这个例子中,我们对n个元素进行了过度处理,所以复杂性是O(n)

当然不是O(n^2),因为这些算法的复杂性是二次的,比如冒泡排序,它将输入中的每个元素与所有其他元素进行比较

正如您所记得的,冒泡排序,为了确定插入元素的正确位置,将每个元素与列表中的其他元素n进行比较(冒泡行为)

最多,您可以声称您的算法具有复杂性,因为它为输入中的每个元素打印两个短语,但在
big O
中,符号O(n)与O(2n)相等。

O(n)用于将循环重新测量为一个数学函数(如n^2,n^m,…)

如果你有这样一个循环

  for(int i = 0; i < n; i++) {
     // sumfin
  }
     for(int i =0 ; i< n*2; i++) {

     }
for(int i=0;i
循环所采用的最佳描述数学函数是用O(n)计算的(其中n是介于0..无穷大之间的数字)

如果你有这样一个循环

  for(int i = 0; i < n; i++) {
     // sumfin
  }
     for(int i =0 ; i< n*2; i++) {

     }
for(int i=0;i
表示需要O(n*2);数学函数=n*2

    for(int i = 0; i < n; i++) {
         for(int j = 0; j < n; j++) {

         }
    }
for(int i=0;i
此循环需要O(n^2)时间;数学函数=n^n 通过这种方式,您可以计算出n10、100或1000的循环需要多长时间


通过这种方式,你可以为循环等构建图形。

Big-O表示法通过设计(和定义)忽略常数乘法器,所以O(n)和O(2n)是完全相同的。我们通常写O(n),因为它更短更熟悉,但O(2n)的意思相同。

如果你检查O()的定义你们会发现(乘数)常数并不重要

循环中要做的工作不是2。有两个语句,每个语句都需要执行两条机器指令,可能是50或78,或者其他,但这与渐近复杂性计算完全无关,因为它们都是常数。它不依赖于
n
。它只是O(1)

首先,不要称之为“大O”。这是错误的,也是误导性的。你真正想找到的是,作为n的函数,有多少指令将被渐进地执行。正确地看待O(n)的方法不是作为一个函数,而是作为一组函数。更具体地说:

O(n)是所有函数f(x)的集合,因此存在一些常数M和一些数x_0,其中对于所有x>x_0,f(x) 换句话说,当n变得非常大时,在某个点上,函数的增长(例如,指令数)将被一个具有常数系数的线性函数所限定

根据您对指令的计数方式,该循环可以执行不同数量的指令,但不管是什么,它最多只能迭代n次。因此,指令的数量以O(n)为单位。它是否重复6n或.5n或1000000000N次,或者即使它只执行恒定数量的指令,也无所谓!它仍然在O(n)中的函数类中


为了进一步扩展,类O(n*2)=O(0.1*n)=O(n),并且类O(n)严格包含在类O(n^2)中。因此,该循环也包含在O(2*n)中(因为O(2*n)=O(n)),并且包含在O(n^2)中(但上限并不严格).

循环中只有n个迭代,但循环中有2个语句loop@JustAnotherProgrammer请看我的答案,循环中的语句需要恒定的时间,两个常数构成另一个常数。重要的是循环中的迭代次数。No的可能重复No的大O将是O(n)当我们使用时间方程时,循环运行n+1次,因此大的O将是n而不是n2。.复杂性是针对指令进行测量的(可能不是正确的短语,但我不知道更好的短语)如果他想测量STD::CUT的复杂性,他是正确的。如果他想考虑所有的低级函数,那么你是正确的。尽管常量并不象你所指出的那样重要。如果内部循环<代码>(int j=0;j),将大(n ^ 2)改变。