【发布时间】:2011-03-10 15:23:51
【问题描述】:
我想这可能是在课堂上教授的东西,但作为一个自学成才的程序员,我很少看到它。
我收集到它与时间有关,O(1) 是最好的,而像 O(n^n) 这样的东西非常糟糕,但有人可以指出我对它的基本解释究竟代表什么,这些数字从何而来?
【问题讨论】:
标签: big-o
我想这可能是在课堂上教授的东西,但作为一个自学成才的程序员,我很少看到它。
我收集到它与时间有关,O(1) 是最好的,而像 O(n^n) 这样的东西非常糟糕,但有人可以指出我对它的基本解释究竟代表什么,这些数字从何而来?
【问题讨论】:
标签: big-o
Big 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) 的算法的运行时间随着输入数据集大小的平方而增加。
这是基本思想,详细解释请查阅维基百科页面,标题为“Big O Notation”。
【讨论】: