我正在学习算法和时间复杂度,这个问题刚刚出现在我脑海中。
为什么我们只分析算法的时间复杂度?
我的问题是,是否应该有另一个分析算法的指标?说我有两个算法A和B.
对于100个元素,A需要5秒,对于100个元素,B需要1000秒。但两者都有O(n)
时间。
因此,这意味着对于两个单独的常量cn
和c=c1
,A和B的时间都比c=c2
增长得慢。但是由于我对算法的经验非常有限,我们总是忽略这个不变的术语,只关注增长。但是在我给出A和B的例子之间进行选择时,这不是很重要吗?在这里c1<<c2
所以Algo A比Algo B好得多。
或者我是否在早期阶段过度思考,以后会进行适当的分析?它叫什么?
或者我的整个时间复杂概念是错误的,在我给出的例子中,两者都不能有O(n)
时间?
答案 0 :(得分:4)
我们担心增长的顺序,因为当输入大小变为无穷大时,它为算法的行为提供了有用的抽象。
O
符号“隐藏”的常量很重要,但它们也很难计算 ,因为它们取决于以下因素:
我们可以尝试来估计这些,但总的来说它是一个失败的原因,除非我们做一些简化的假设并且在一些定义良好的计算模型上工作,比如{ {3}}模型。
然而,我们又回到了抽象的世界,正是我们开始的地方!
答案 1 :(得分:2)
我们衡量lots of other types of complexity。
但我想你更多地谈论的是“常数不重要吗?”做法。是的,他们这样做。忽略常量有用的原因是它们不断变化。不同的机器以不同的速度执行不同的操作你必须在特定机器上使用有用的和有用的之间。
答案 2 :(得分:1)
并不总是时间。还有空间。
对于O()给出的渐近时间成本/复杂度,如果你有大量数据,那么,例如,O(n 2 )= n 2对于n> 100,将比O(n)= 100 * n更差。对于较小的n,您应该更喜欢这个O(n 2 )。
显然,O(n)= 100 * n总是比O(n)= 10 * n差。
您的问题的详细信息应该有助于您决定几种可能的解决方案(算法选择)。
答案 3 :(得分:0)
对于100个元素,A需要5秒,对于100个元素,B需要1000秒。但两者都有 有O(n)时间。
为什么?
O(N)
是对执行与程序输入相关的程序所需步骤数的渐近度量。
这意味着对于非常大的N
值,算法的复杂性是线性增长
我们不会比较X
和Y
秒。我们分析算法在输入变得越来越大时的行为
答案 4 :(得分:0)
O(n)让您了解相同算法对于不同的n的速度会慢多少,而不是用于比较算法。 另一方面,还存在空间复杂性 - 内存使用量如何随输入n而增长。