Algorithm 分析算法-为什么只有时间复杂性?

Algorithm 分析算法-为什么只有时间复杂性?,algorithm,Algorithm,我在学习算法和时间复杂性,这个问题突然出现在我的脑海里 为什么我们只分析算法的时间复杂度 我的问题是,分析一个算法不应该有另一个指标吗?假设我有两个算法A和B A表示100个元素需要5秒,B表示100个元素需要1000秒。但两者都有O(n)时间 这意味着A和B的时间增长都慢于两个独立常数c=c1和c=c2的增长。但在我有限的算法经验中,我们总是忽略这个常数项,只关注增长。但是,在我给出的例子A和B之间进行选择时,这不是很重要吗?在这里c1我们测量 但我想你说的更多的是“常数不重要吗?

我在学习算法和时间复杂性,这个问题突然出现在我的脑海里

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

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

A表示100个元素需要5秒,B表示100个元素需要1000秒。但两者都有
O(n)
时间

这意味着A和B的时间增长都慢于两个独立常数c=c1和c=c2的增长。但在我有限的算法经验中,我们总是忽略这个常数项,只关注增长。但是,在我给出的例子A和B之间进行选择时,这不是很重要吗?在这里
c1我们测量


但我想你说的更多的是“常数不重要吗?”的方法。是的,有。忽略常量很有用的原因是它们一直在变化。不同的机器以不同的速度执行不同的操作。您必须在一般有用和特定机器上有用之间走一条线。

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

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

  • 用于实现算法的特定编程语言
  • 正在使用的特定编译器
  • 底层CPU架构
我们可以尝试对这些进行估计,但一般来说,这是一个失败的原因,除非我们做出一些简化的假设,并研究一些定义良好的计算模型,如模型

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

A表示100个元素需要5秒,B表示100个元素需要1000秒。但两者都有 没有时间

为什么会这样?
O(N)
是相对于程序输入执行程序所需的步数的渐近度量。
这意味着对于非常大的
N
值,算法的复杂性是线性增长的。
我们不比较
X
Y
秒。我们分析了当输入越来越大时,算法的行为。O(n)可以让您了解相同的算法对于不同的n会慢多少,而不是比较算法。
另一方面,还有空间复杂性——内存使用量是如何随着输入n的变化而增长的。

这并不总是时间的问题。还有空间

至于O()给出的渐近时间成本/复杂性,如果你有很多数据,那么,例如,当n>100时,O(n2)=n2将比O(n)=100*n更糟糕。对于较小的n,你应该更喜欢这个O(n2)

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


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

可能重复的挑剔:我们不仅分析时间上的复杂性,还分析空间上的复杂性、所做的比较、所做的交换、对相关oracle的查询或任何感兴趣的内容。是的,常数通常被忽略。+1:常数不仅被BigOh隐藏,甚至还有ω和θ,它们也被用来讨论时间的复杂性。