我们应该教渐近增长率的哪个定义?


35

当我们按照标准教科书,或传统,我们大多数人教大哦符号的定义如下在算法类的第几章: 甚至我们甚至可以给出带有所有量词的整个列表:

f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n)).
  1. f=o(g) iff (c>0)(n00)(nn0)(f(n)cg(n))
  2. f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n))
  3. f=Θ(g) iff (c>0)(d>0)(n00)(nn0)(dg(n)f(n)cg(n))
  4. f=Ω(g) iff (d>0)(n00)(nn0)(f(n)dg(n))
  5. f=ω(g) iff (d>0)(n00)(nn0)(f(n)dg(n))

但是,由于要证明甚至是简单的事物(例如5 n log 4 n + √),这些定义也不太容易使用。5nlog4n+nlogn=o(n10/9),我们大多数人迅速移动推出“极限特技”:

  1. f=o(g)0limnf(n)/g(n)0
  2. LIM Ñ →交通 ˚F Ñ /Ñ + f=O(g)如果存在并且不,则,limnf(n)/g(n)+
  3. LIM Ñ →交通 ˚F Ñ /Ñ 0 + f=Θ(g)如果存在并且既不为也不为,limnf(n)/g(n)0+
  4. LIM Ñ →交通 ˚F Ñ /Ñ 0f=Ω(g)如果存在且不为,则,limnf(n)/g(n)0
  5. f=ω(g)如果存在且为,则。+ limnf(n)/g(n)+

我的问题是:

以限制条件作为,,,和定义来教授本科算法课是否会造成重大损失?那就是我们所有人最终都会使用的东西,对我来说,很明显,跳过量词定义会使每个人的生活变得更轻松。ø Θ Ω ωoOΘΩω

我想知道您是否遇到过一些令人信服的自然情况,其中实际上需要标准 -definitions,如果不是,是否有一个令人信服的参数可以使标准 -definitions始终保持预先状态。 c n 0c,n0c,n0


1
该标签确实应该是“教学”,但是我找不到任何相关标签,也不允许创建新标签。
slimton 2010年

1
这基本上将量词吸收到极限的epsilon-delta定义中。我唯一担心的是,许多CS学生没有进行分析,因此他们对限制的理解大多是机械的。为了使他们能够快速计算,这是不费吹灰之力的。
Per Vognsen

6
请注意,您对O()的两个定义并不等效(相同的警告适用于Θ()和Ω())。考虑偶数n为f(n)= 2n且奇数n为f(n)= 1的情况。f(n)= O(n)吗?我更喜欢使用limsup而不是lim,这样在这种情况下我可以说f(n)=Θ(n)(尽管您的定义都不允许这样做)。但这可能是我个人的偏爱(甚至是非常规的做法),而且我从未教过一门课。
伊藤刚(Tsuyoshi Ito)2010年

2
@Tsuyoshi:我认为“极限技巧”的要点是,它是的充分但非必要条件。(对于也有必要。)振荡函数的反例没有限制。o O()o()
安德拉斯·萨拉蒙

1
您不应该在每个定义和属性中都用代替符号吗?我发现的使用对学生非常困扰。===
杰里米

Answers:


13

我更喜欢用量词教授原始定义。

IMO,人类通常很难直接用两个以上的量词来理解公式和定义。引入新的量词可以阐明定义的含义。在这里,最后两个量词仅表示“对于所有足够大的n”,引入这种量化可以有所帮助。

我为解释这些概念而绘制的图片与量词版本更匹配。

我认为简化限制对只对计算增长率感兴趣的工程系学生有用,而对计算机科学系的学生则没有帮助。实际上,使用这种简化可能造成弊大于利。

这个想法类似于以下建议:我们使用计算导数的规则(多项式,求幂,...,链式规则...)代替它的epsilon-delta定义,恕我直言,这不是一个好主意。


最终的统治概念也很有用: iff。现在如果 st。\ esits Ñ > ˚F Ñ < Ñ ˚F Ô c ^ > 0 ˚F X « Ç X f(x)g(x)\esitsmn>mf(n)<g(n)fO(g)c>0f(x)cg(x)
卡夫

9

编辑:版本3中的主要版本。

由于我从没教过课,所以我认为我不能对我们应该教的内容有任何说服力。不过,这是我对此的想法。

在自然的例子中,无法应用所写的“极限技巧”。例如,假设您通过使用大小加倍的定长数组(即,每次将要超过数组的大小时)来实现“可变长度向量”(如C ++中的vector <T>)重新分配数组,大小是现在的两倍,并复制所有元素)。当我们在向量中存储n个元素时,数组的大小Sn)是大于或等于n的2的最小幂。我们想说Sn)= O(n),但是使用定义中写的“限制技巧”将不允许我们这样做,因为Sn)/ n在[1,2)范围内密集振荡。Ω()和Θ()也相同。

作为一个稍微分开的问题,当我们使用这些符号来描述算法的复杂性时,我认为您对Ω()的定义有时不方便(尽管我认为该定义很常见)。当且仅当limsup fn)/ gn)> 0 时才定义fn)=Ω(gn))更为方便。这是因为对于n(例如具有奇数顶点n的图上的完美​​匹配问题)。Θ()和ω()的情况相同。

因此,我个人发现以下定义最容易用来描述算法的复杂性:对于函数fg:ℕ→ℝ > 0

  • 当且仅当limsup fn)/ gn)= 0时fn)= o(gn))。(这等于lim fn)/ gn)=0。)
  • 当且仅当limsup fn)/ gn)<∞时,fn)= O(gn))。
  • 当且仅当0 <limsup fn)/ gn)<∞时,fn)=Θ(gn))。
  • 当且仅当limsup fn)/ gn)> 0时fn)=Ω(gn))。(这等效于fn)不是o(gn))。
  • 当且仅当limsup fn)/ gn)=∞时,fn)=ω(gn))。(这等效于fn)不是O(gn))。)

或等效地,

  • ˚FÑ)= O(Ñ))当且仅当对于每个Ç > 0,对于足够大的Ñ˚FÑ)≤ ÇÑ)。
  • ˚FÑ)= O(Ñ))当且仅当对于一些Ç > 0,对于足够大的Ñ˚FÑ)≤ ÇÑ)。
  • ˚FÑ)=Θ(Ñ))当且仅当˚FÑ)= O(Ñ))和˚FÑ)=Ω(Ñ))。
  • ˚FÑ)=Ω(Ñ))当且仅当对于某些d > 0,为无穷多个Ñ˚FÑ)≥ dÑ)。
  • ˚FÑ)=ω(Ñ))当且仅当对于每个d > 0,为无穷多个Ñ˚FÑ)≥ dÑ)。

但是我不知道这是否是一种普遍的做法。我也不知道它是否适合教学。问题是我们有时想通过liminf定义Ω()(就像您在第一个定义中所做的那样)。例如,当我们说“该随机算法的错误概率为2- Ω(n ”时,我们并不意味着仅对于无限多个 n,错误概率就呈指数级减小。


我也使用limsup定义,但是对于没有看过limsup的学生(几乎所有学生),无论如何我都必须扩展为显式量词。
Jeffε

@JeffE:我同意大多数学生没有看过limsup,因此,如果我们使用limsup定义,则必须在课堂上使用量词。
伊藤刚(Tsuyoshi Ito)2010年

2
量词版本的问题在于它们难以记住和可视化。我更喜欢因为它可以描述为“最高极限点”。可能的解释是:“这与相似,只是仅在序列收敛时起作用。如果序列不收敛,例如因为算法在某些非常快而在其他很慢之间振荡,则我们采用最高极限点。” limsuplimlimnn
海因里希·阿普费尔莫斯

其实,有没有自然的例子可以说明算法的运行时间是否在波动?
海因里希·阿普费尔莫斯

2
@Heinrich:我已经提到了在n个顶点上找到图的完美匹配的算法的运行时间,但这算是自然的例子吗?我添加了另一个示例,其中运行时间不波动,但f(n)/ g(n)波动。该示例谈到空间复杂度,但是同一示例的时间复杂度具有相同的属性。
伊藤刚(Tsuyoshi Ito)2010年

8

使用限制有点让人困惑,因为(1)它是一个更复杂的概念(2)它不能很好地捕获f = O(g)(正如我们在上面的讨论中所看到的)。我通常谈论从自然数(严格为正数)到自然数(满足运行时间)的函数,跳过little-o内容,然后定义简洁明了,适合一年级的本科生:

Dfn:f = O(g)如果对于所有n的某个C,我们都有f(n)<= C * g(n)


1
首先,我不喜欢这个定义,因为陈述“全部n”掩盖了重要的事实,即O()表示法仅关心大n的函数的行为。但是,无论我们选择哪个定义,我都应该将这个事实与定义一起解释。这样想,说明这个简单的定义似乎很好。
伊藤刚(Tsuyoshi Ito)2010年

虽然这种捕获的本质,我不喜欢,如果对所有,对所有高达,和否则,则但此定义无法捕获此关系。因此,人们必须对某些在某种意义上表现良好的功能进行一些手工操作。f(n)=nng(n)=0nN0g(n)=f(n)+1f=O(g)
安德拉斯·萨拉蒙(AndrásSalamon)2010年

2
谈论范围为自然数(不包括0)的函数的目的不在于g(n)= 0。
诺姆

1
@Warren Victor Shoup在其关于计算数论的书中使用符号代替进行运行时分析,我发现它很简洁。len(a)loga
Srivatsan Narayanan

1
@Warren(续)这是他的解释:“在用输入表示算法的运行时间时,我们通常更喜欢写而不是。一个原因是审美:写强调的事实是运行时间的位长的函数另一个原因是技术:为大端上的任意域涉及功能估算,相应的不平等应持有境域,因为这个原因,使用类的功能在某些输入中消失或未定义非常不方便。” alen(a)logalen(a)aOlog
Srivatsan Narayanan

5

当我参加基础课程时,我们得到事物作为定义,而其他事物作为定理。c,n0

我认为对于大多数认为离散而不是连续的人来说,第一个更自然,这是大多数计算机科学家(以我的经验)。这也符合我们通常谈论这些事情的方式:“有一个次数为3的多项式函数,它是该的上限,直到一个常数因子。”f

编辑:如果使用此定义,则可以更接近这种说法: (请注意,将此定义与通常给出的定义联系起来)fO(g):⇔c,d>0n0:f(n)cg(n)+dd=f(n0)

极限值对于计算复杂度类(即笔和纸)非常有用。

无论如何,我认为对于学生来说,有很多(希望的)等效定义非常有用。他们应该能够意识到这一点,并在定义不相等的情况下找出差异。


4

仅在几年前研究过这些概念,对于我的班级来说,它们并不是最难掌握的(与归纳法或反义词等概念相对)。在我看来,对于熟悉微积分的人来说,限制和限制只是“直观”。但是具有这样的数学基础的学生无论如何都将具有定论背景,以便他们可以处理离散的限定词。

另外,更重要的是,请记住,最终您的学生将(希望)继续阅读其他CS理论教科书,甚至有一天可能会读一些研究论文。因此,即使最初并不是理想的构想,他们也应该对本领域的标准符号感到满意。一旦他们吸收了标准定义,给它们替代定义也没有什么害处。


3

有关这个问题的有趣观点,请看Don Knuth的写得很好的字母“通过O标记进行微积分”。他主张相反的观点,即演算应通过“ A”,“ O”和“ o”表示法进行教授。

注意:他使用“ A”符号作为定义标准“ O”符号的第一步。一定量的是的(即,)中,如果 。特别是说是是有意义的。A y x = A y | x | ý 100 200 xAyx=A(y)|x|y100A(200)


1
  1. 伊藤刚的定义看起来不太正确。对于小欧米茄和大欧米茄,定义应使用liminf而不是limsup。big-theta的定义既需要在liminf上设置一个下限,也需要在limsup上设置一个上限。

  2. f(n)= O(g(n))的一个定义是存在另一个函数f'(n)> = f(n),使得lim f'(n)/ g(n)<无穷大。

  3. 为什么允许新手发布答案但不发表评论?


1
关于第1项,我的意思是在所有情况下都实行limpsup,其原因在我答复的第二段中作了解释。
伊藤刚(Tsuyoshi Ito)2010年

不幸的是,这是一个垃圾邮件阻止机制。
Suresh Venkat

麻生太郎,您可以在答案中使用乳胶。
Suresh Venkat

1

首先,在展示方程式之前,我尝试在学生身上发展一些直觉

  • “合并排序与插入排序”是一个很好的起点。

然后,以后...我尝试展示两种方式。依赖直觉的学生更喜欢 而那些更依赖数学,等式,代数等的人,他们更喜欢“ ”的定义。lim n

f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n)).
limn

另一方面是,它在很大程度上取决于具体的研究计划。恕我直言,取决于以前的主题,一种定义会更合适-而恕我直言,仍然最好同时显示这两种解决方案并接受两种类型的解决方案。

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.