c-经验运行时分析

c-经验运行时分析,c,runtime,computer-science,C,Runtime,Computer Science,嘿,所以我很难掌握经验运行时分析。所以我有一个问题: 假设我们有一个O(1)函数,在n=2000的情况下需要8秒才能执行。如果n=10000,您希望运行时是什么 下面是我认为是错误的思考过程: 如果T(n)是O(1),那么T(n)=c*O(1),其中c只是一个常数。求解c,我们得到c=T(n)/O(1)。既然我们知道T(2000)=8s,n=2000,我们就可以把它代入求解c,c=(8s)/(2000),得到0.004。 现在我们必须对n=10000做同样的计算,所以在这种情况下T(10000)

嘿,所以我很难掌握经验运行时分析。所以我有一个问题:

假设我们有一个O(1)函数,在n=2000的情况下需要8秒才能执行。如果n=10000,您希望运行时是什么

下面是我认为是错误的思考过程: 如果T(n)是O(1),那么T(n)=c*O(1),其中c只是一个常数。求解c,我们得到c=T(n)/O(1)。既然我们知道T(2000)=8s,n=2000,我们就可以把它代入求解c,c=(8s)/(2000),得到0.004。 现在我们必须对n=10000做同样的计算,所以在这种情况下T(10000)=c*O(1)
在这种情况下,我们可以插入我们之前发现的相同的c,因为它只是一个常数,然后为O(1)插入10000,这将给我们T(10000)=(0.004)*10000,等于40秒。我只是不确定我的思考过程是否正确。

正确的答案是我们不能期待任何特定的时间

说函数的运行时O(1)就是说存在一些数字C,使得函数总是在不到C秒的时间内运行。如果函数在8秒内运行一次,我们知道C至少是8。但可能是一百万。或者说是七百万

O(1)告诉我们,无论n是什么,运行时间都是有限的。运行时间可以随着n的变化而上下波动,但它总是受到C的限制

相反,将其与运行时为O(n)的函数进行比较。这意味着存在一个数字C,使得函数的运行时间始终小于C*n秒(允许有限数量的异常除外)。所以我们没有一个恒定的极限;我们有一个取决于n的极限。随着n的增长,此函数可能需要越来越多的时间


也可能不是。O表示法只告诉您函数运行时的限制。它不会告诉您实际的运行时间。如果我知道你昨天的车里有一加仑汽油,你跑了30英里,我知道你的车每加仑至少能跑30英里。如果你今天有两加仑汽油,我知道你至少可以走60英里,但也许你可以走得更远,我不知道你到底能走多远。我知道你的旅行是有限制的,但我不知道你的旅行实际是什么,也不知道你会走多远。

通常,记法的问题是非正式的(更不用说草率的)记法,带有很多假设

首先,Мsymbol1需要在其括号之间有一个函数,因此像М(1)这样的符号一开始是不清楚的(因为1是一个数字)。
在数学的某些领域,通常用“1”表示函数f:ℕ→ℕ 定义为f(n)=1∀N∊ ℕ.
这只是一个函数,每个input2返回1

另一个要考虑的是,强定义>< /强>在单变量函数上操作,为了避免歧义,应该始终明确地写出两个函数的自变量。 然而,由于从上下文中可以清楚地看出,我们只是在处理一种特定的函数,所以通常不会这样做

为了提高读者的警觉性,并以繁琐的注释为代价,我不会放弃自变量,从而将М(1)写成М(1(n))

最后,我更喜欢符号f(n)∊ М(1(n))在使用等号的普通平面上


我们希望用符号f(n)来澄清这一点∊ (1(n))我们正在断言函数f(n)w.r.t.的一个属性。另一个函数为每个输入返回1

big-O表示法是一种速记法(就像极限表示法一样),在我们的特定情况下,它可以转换为

f(n)∊ (1(n))

∃N∊ ℕ: ∀n>n | f(n)|≤ M·| 1(n)|(按定义)
∃N∊ ℕ: ∀n>n | f(n)|≤ M·1(n)(1(n)始终为正)
∃N∊ ℕ: ∀n>n | f(n)|≤ M·1(1(n)=1表示所有n)
∃N∊ ℕ: ∀n>n | f(n)|≤ M

因此,符号简化为f(n)在绝对值上被一个(未指定!)常数M限定

这就给我们留下了很多函数,即使给定了函数在某一点上的值。
例如,即使我们知道f(2000)=8,两个函数g(n)=8 cos(n-2000)和h(n)=8 en-2000都在o(1(n))中,但它们在n=10000时的值不同


big-O符号很有用,因为它简化了事情,但到目前为止,它似乎失败了很多

缺少的部分是我们正在处理算法及其时间复杂性3,因此我们感兴趣的函数f是:

  • 非分段
    我们考虑由两个算法产生的分段函数,而不是单个算法的表达式。
  • 单调非递减。 我们假设对于同一个问题,一个更大的实例要解决的时间更长

在这个假设下,我们可以看到,如果一个函数有界,那么在某个点上它必须停止增加并无限期地保持在该值

这就是f(n)的意义∊ (1(n))表示法表示:f是一个常数函数(渐近)

如果f是常数,那么f(n)=c,如果f(2000)=8,那么c=8,因此f(10000)=8

最好按如下方式使用big-O表示法:取括号中的函数,乘以常数c,并用它代替f

有时我们甚至不关心常数:(1(n))意味着如果我们将n加倍,输出保持不变,(n)意味着如果我们将n加倍,输出加倍(n=2时n为2),(n2)意味着如果我们将n加倍,输出四倍(n=2时n2为4),依此类推


你的方法有两个问题:说T(n)=c*O(1)是正确的,但没有用,我们就