c-经验运行时分析
嘿,所以我很难掌握经验运行时分析。所以我有一个问题: 假设我们有一个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-经验运行时分析,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)
在这种情况下,我们可以插入我们之前发现的相同的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是:
- 非分段
我们考虑由两个算法产生的分段函数,而不是单个算法的表达式。 - 单调非递减。 我们假设对于同一个问题,一个更大的实例要解决的时间更长
你的方法有两个问题:说T(n)=c*O(1)是正确的,但没有用,我们就