Big o 什么是大O符号?你是如何得出O(n)这样的数字的?

Big o 什么是大O符号?你是如何得出O(n)这样的数字的?,big-o,Big O,可能重复: 我想这可能是课堂上教的东西,但作为一名自学成才的程序员,我很少看到它 我认为这与时间有关,O(1)是最好的,而O(n^n)这样的东西非常糟糕,但是有人能给我一个基本的解释,说明它实际上代表什么,以及这些数字来自哪里吗?大O指的是最坏的运行时顺序。它用于显示算法根据数据集的大小(n->项数)进行缩放的效果 由于我们只关心阶数,常数乘数被忽略,任何比主项增长慢的项也被删除。一些例子: 单个操作或一组操作是O(1),因为它需要一些恒定的时间(不随数据集大小而变化) 循环是O(n)。数据集

可能重复:

我想这可能是课堂上教的东西,但作为一名自学成才的程序员,我很少看到它


我认为这与时间有关,O(1)是最好的,而O(n^n)这样的东西非常糟糕,但是有人能给我一个基本的解释,说明它实际上代表什么,以及这些数字来自哪里吗?

大O指的是最坏的运行时顺序。它用于显示算法根据数据集的大小(n->项数)进行缩放的效果

由于我们只关心阶数,常数乘数被忽略,任何比主项增长慢的项也被删除。一些例子:

单个操作或一组操作是O(1),因为它需要一些恒定的时间(不随数据集大小而变化)

循环是O(n)。数据集中的每个元素都是循环的

嵌套循环是O(n^2)。嵌套循环是O(n^3)及以后的循环

像二叉树搜索这样的东西是log(n),这更难显示,但是在树的每个级别上,可能的解决方案数都减半,因此级别数是log(n)(前提是树是平衡的)


类似于查找最接近给定值的一组数字的和是O(n!),因为需要计算每个子集的和。这很糟糕。

这是一种表达时间复杂性的方式

O(n)
表示对于列表中的
n
元素,需要
n
计算才能对列表进行排序。这一点都不坏。
n
的每次增加都会线性增加时间复杂度

O(n^n)
不好,因为执行排序(或执行任何操作)所需的计算量将随着
n
的增加而成倍增加


O(1)
是最好的,因为它意味着执行一个函数需要1次计算,想想哈希表,在哈希表中查找一个值具有
O(1)
时间复杂性。

应用于算法的大O表示法是指算法的运行时间如何依赖于输入数据量。例如,排序算法对大数据集进行排序所需的时间比对小数据集进行排序所需的时间更长。对于排序算法示例,如果将运行时间(纵轴)与要排序的值数(横轴)进行图形化,则对于从零到大的值数,结果的直线或曲线的性质将取决于所使用的排序算法。大O表示法是描述直线或曲线的简写方法

在大O表示法中,括号中的表达式是绘制的函数。如果表达式中包含一个变量(例如n),则该变量表示输入数据集的大小。你说O(1)是最好的。这是正确的,因为图f(n)=1不随n变化。无论输入数据集的大小如何,O(1)算法都需要相同的时间来完成。相比之下,O(n^n)算法的运行时间随着输入数据集大小的平方而增加


这是最基本的想法,详细的解释,请参考维基百科标题为“大O表示法”的页面。

可能重复您也可以使用此表示法来描述空间行为。-1不一定是最坏的情况,在我去年的算法课程中,我们展示了大O表示最坏的情况,最好的情况,如果我们能找到它,一般情况下,大O符号通常是一般情况。我们说插值搜索是O(logn),但如果值之间的距离足够远,则最坏的情况是O(n)。大O有时用来表示更常见的情况,因为最坏的情况没有那么有趣。如果你看到O(n^2)没有任何警告,你应该假设最坏的情况。事实上,这并不完全正确。这是关于表达最坏情况下成本增长的速度。所以O(N)意味着如果被处理的数据项的数量加倍,最坏情况下处理数据的时间将加倍。Oh和O(1)并不意味着“1计算”,它意味着计算成本是恒定的,与数据点的数量无关。没有冲突的哈希表就是一个很好的例子。