函数是否总是渐近可比的?


15

当我们比较两种算法的复杂度时,通常是f(n)=O(g(n))g(n)=O(f(n))(可能两者)的情况,其中fg是两种算法的运行时间(例如)。

总是这样吗?也就是说,是否始终保持关系f(n)=O(g(n))中的至少一个g(n)=O(f(n)),即对于通用函数fg?如果不是,我们必须做出哪些假设?(为什么)我们谈论算法的运行时间?

Answers:


21

并非每对函数都可与表示法相提并论;考虑功能˚F Ñ = ÑÑ = { 1 ,如果  Ñ  是奇数Ñ 2 如果  Ñ  是偶数 而且,像g n 这样的函数实际上是随着算法的运行时间而出现的。考虑一下显而易见的蛮力算法,以确定给定的整数n是否为质数:O()f(n)=n

g(n)={1if n is odd, n2if n is even.
g(n)n
IsPrime(n):
  for i ← 2 to (n-1)
     if i·⌊n/i⌋ = n
        return False
  return True

n为偶数O 时,此算法需要算术运算Θ(1)n操作时,ñ是复合材料,但Θñ操作时,ñ是素数。因此,从形式上讲,该算法与使用的算法无可比拟O(n)nΘ(n)nn个n算术运算。n n

在大多数时候,当我们分析算法时,对于某些相对简单的函数f,我们只想要形式的渐近上限。例如,大多数教科书会简单(正确地)报告以O n 算术运算运行。典型的上限函数是指数,多项式和对数的乘积(尽管偶尔还会出现阶乘和迭代对数之类的奇异野兽)。不难证明任何两个这样的功能都是可比较的。O(f(n))fIsPrime(n)O(n)

另请参见此MathOverflow问题


7

从维基百科,大O符号的定义:

当且仅当存在一个正常数M使得对于所有足够大的值,f x )的 绝对值最大为M乘以g x 。即,˚F X Ô X 当且仅当存在一个正实数中号和实数X 0,使得xf(x)g(x)f(x)O(g(x))Mx0

|f(x)|<=M|g(x)|for allx>x0

对于不收敛的函数(常数或无穷大)会发生什么?

看一下函数,且g x = 10f(x)=|xsin(x)|g(x)=10

对于每个,有一些X > X 0,使得X = ķ π,从而˚F X = 0 -因此每个中号 - 中号˚F X > X 将产生假,和X x0x>x0x=kπf(x)=0MMf(x)>g(x)g(x)O(f(x))

但是,很容易看到通过任何常数为每个是无界为好,因此中号X 0,有一些X > X 0,使得˚F X < 中号X 也将产生假,和˚F X Ô x |xsin(x)|Mx0x>x0f(x)<Mg(x)f(x)O(g(x))

注意:对于定义而言,如果大O允许g x 之间存在最大常数差,则将g x = log x 应用于相同的想法Mf(x)g(x)g(x)=log(x)


6

这是一对渐近不可比的单调函数。这是相关的,因为实际上产生的大多数复杂性实际上都是单调的。

X = Γ X - 1 / 2 + 3 / 2

FX=ΓX+1=X
GX=ΓX-1/2+3/2

Γ


4

大号经验值2日志X+日志日志X/X2FG大号F=ØGF=ωGF/G

结果是在算法分析中出现的任何两个“简单”功能都是可比的。这里的“简单”是指没有按大小写定义(除了有限的基本情况以外),并且没有出现令人惊讶的函数,例如Ackermann逆函数有时会在运行时间计算出来。


真好!但是,值得注意的是,周期元素在(d&c算法的)平均案例分析中经常出现。我所知道的一个在两侧都受常数约束,因此它们不会损害渐近可比性。
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.