2

我正在学习算法和时间复杂度,这个问题突然出现在我的脑海中。

为什么我们只分析算法的时间复杂度?

我的问题是,不应该有另一个指标来分析算法吗?假设我有两个算法 A 和 B。

A 需要 5s 处理 100 个元素,B 需要 1000s 处理 100 个元素。但两人都有O(n)时间。

所以这意味着 A 和 B 的时间都比cn两个单独的常数c=c1和的增长慢c=c2。但在我非常有限的算法经验中,我们总是忽略这个常数项,只关注增长。但是,在我给定的 A 和 B 示例之间进行选择时,这不是很重要吗?在这里c1<<c2,所以 Algo A 比 Algo B 好得多。

还是我在早期阶段想得太多,稍后会进行适当的分析?这叫什么?

或者我的时间复杂度的整个概念是错误的,在我给定的例子中,两者都没有O(n)时间?

4

5 回答 5

4

我们担心增长的顺序,因为当输入大小趋于无穷大时,它为算法的行为提供了有用的抽象。

符号“隐藏”的常数O很重要,但它们也难以计算,因为它们取决于以下因素:

  • 用于实现算法的特定编程语言
  • 正在使用的特定编译器
  • 底层 CPU 架构

我们可以尝试估计这些,但通常这是一个失败的原因,除非我们做出一些简化的假设并在一些定义良好的计算模型上工作,比如RAM模型。

但是,我们又回到了抽象的世界,正是我们开始的地方!

于 2013-03-22T17:52:19.647 回答
2

我们测量了许多其他类型的复杂性

但我想你更多地谈论的是“常数不重要吗?” 方法。是的,他们有。忽略常量有用的原因是它们不断变化。不同的机器以不同的速度执行不同的操作。您必须在一般有用和在特定机器上有用之间划清界限。

于 2013-03-22T17:49:48.900 回答
1

这并不总是时间。还有空间。

至于 O() 给你的渐近时间成本/复杂度,如果你有很多数据,那么,例如,O(n 2 )=n 2会比 O(n)=100* n 表示 n>100。对于较小的 n,您应该更喜欢这个 O(n 2 )。

而且,显然,O(n)=100*n 总是比 O(n)=10*n 差。

你的问题的细节应该有助于你在几个可能的解决方案(算法的选择)之间做出决定。

于 2013-03-22T17:54:30.230 回答
0

A 需要 5s 处理 100 个元素,B 需要 1000s 处理 100 个元素。但两者都有 O(n) 时间。

这是为什么?
O(N)是相对于程序输入执行程序所需的步骤数的渐近测量。
这意味着对于非常大的值,N算法的复杂性是线性增长的。
我们不比较XY秒。我们分析算法在输入变得越来越大时的表现

于 2013-03-22T17:52:32.427 回答
0

O(n) 让您知道对于不同的 n,相同的算法会慢多少,而不是比较算法。另一方面,还有空间复杂性——内存使用量如何随着输入 n 的函数增长。

于 2013-03-22T17:53:04.763 回答