Algorithm 使用大O表示法的数量级

Algorithm 使用大O表示法的数量级,algorithm,big-o,magnitude,Algorithm,Big O,Magnitude,这可能是已经讨论过的理由,但我还没有找到我能够理解的解释。我很可能很快就会感到尴尬 例如,我尝试使用以下大O表示法来寻找数量级: count = 0; for (i = 1; i <= N; i++) count++; count=0; 对于(i=1;i你的例子就是顺序 O(N) 式中,N=元素数量,并对每个元素执行可比计算,因此 for(int i=0;i100次操作,对于N=1000=>1000次操作……因此,增长是真正的线性增长 我将提供另外几个例子: for (int i

这可能是已经讨论过的理由,但我还没有找到我能够理解的解释。我很可能很快就会感到尴尬

例如,我尝试使用以下大O表示法来寻找数量级:

count = 0;
for (i = 1; i <= N; i++)
    count++;
count=0;

对于(i=1;i你的例子就是顺序

O(N)

式中,
N=元素数量
,并对每个元素执行可比计算,因此

for(int i=0;i
big-O表示法可能比你想象的要简单;在所有日常代码中,你都会发现循环、列表迭代、搜索和任何其他过程中的O(N)的例子,每个集合中的个体都会工作一次。首先是不熟悉的抽象,O(N)表示“某个工作单元”,重复N次。这是“某物”可以是递增计数器,如您的示例中所示,也可以是冗长且资源密集型的计算。在算法设计中,大多数情况下,“大O”或复杂性比工作单位更重要,这一点在N变大时尤为重要。“限制”或“渐近”的描述在数学上很重要,这意味着假设N足够大,或者“随着N的增长”,那么无论工作单元有多重要,复杂度较低的算法总是比复杂度较高的算法要好

再举一个例子,来理解这个大概的想法

for(int i=0;i
这里的复杂性是

O(N2)

例如,如果n=10,那么第二个“算法”将比第一个长10倍,因为10x10=100(=十倍)。如果你考虑当n等于、等于一百万、或十亿时会发生什么,你应该能够计算出它也将花费更长的时间。超级计算机在O(N2)中所做的,你应该能够用你的旧x386、怀表或其他旧工具打败它

这些符号(大O、大ω、θ)简单地说,当事情变得越来越大时,算法是如何渐进地“困难”(或复杂)的

对于大O,有两个函数:f(x)和g(x),其中f(x)=O(g(x)),那么你可以说你能找到一个x,其中g(x)总是大于f(x)。这就是为什么定义包含“渐近”的原因,因为这两个函数在开始时可能有任何运行(例如,对于前几个x,f(x)>g(x)但从单点来看,g(x)总是优于(g(x)>=f(x))。因此,从长远来看,您对行为感兴趣(不仅仅是小数字)。有时,大O符号被命名为上界,因为它描述了最坏的可能情况(该函数永远不会渐进地更困难)

这就是“数学”部分。当涉及到实践时,你通常会问:算法需要处理多少次?需要做多少次运算

对于简单循环来说,这很容易,因为随着N的增长,算法的复杂度将线性增长(作为简单的线性函数),因此复杂度为O(N)。对于N=10,您必须执行10次操作,对于N=100=>100次操作,对于N=1000=>1000次操作……因此,增长是真正的线性增长

我将提供另外几个例子:

for (int i = 0; i < N; i++) {
   if (i == randomNumber()) {
      // do something...
   }
}

您需要执行多少操作(循环将执行多长时间)?这取决于树的深度,对吗?以及如何定义完整二叉树的深度?它类似于log(N)-以对数为底=2。因此,这里的复杂性将是O(log(N))-通常我们不关心对数的底,我们关心的是函数(线性、二次、对数…)

如果你问以下问题,你可能会得到更好的答案:value=N;count=0;while(value>1){value=value/2;count++;}变量值代表N。因为对于循环的每次迭代,N基本上被切成两半,直到我们得到1。这是否意味着这个算法是O(log2N)?我对如何得出这个结论有基本的了解,但我不完全理解如何将这个代码片段分解到这个等式中。嗨,是的,我认为这是对的,如果你像那样将值减半,复杂性将是N的二进制对数-log(2)
for (int i = 0; i < N; i++) {
   for (int i = 0; i < N; i++) {
       // do something
   }
}
Node actual = root;
while(actual.left != null) {
   actual = actual.left
}
// in actual we have left-most leaf