按渐近增长对函数进行排序


35

假设我有一个功能列表,例如

nloglog(n),2n,n!,n3,nlnn,

如何渐近地对它们进行排序,即在由

fOgfO(g)

假设它们确实是成对可比的(另请参见此处)?使用的定义似乎很尴尬,并且通常很难证明合适的常数和的存在。Ç Ñ 0Ocn0

这是关于复杂度的量度,因此我们对渐进行为感兴趣,并且我们假定所有函数仅采用非负值()。∀ Ñ ˚F Ñ 0n+n,f(n)0


4
由于OP再也没有回来,因此我将删除本地化的内容,并从中提出参考问题。
拉斐尔

Answers:


48

如果需要严格的证明,以下引理通常是有用的。比定义更方便。

如果存在,则c=limnf(n)g(n)

  • c=0 fo(g)
  • c(0,)fΘ(g)
  • c=   fω(g)

这样,您应该能够订购算法分析¹中出现的大多数功能。做个练习,证明一下!

当然,您必须能够相应地计算限制。将复杂功能分解为基本功能的一些有用技巧:

  • 将两个函数都表示为并比较指数;如果它们的比率趋于或,则原始商也是如此。e0
  • 更笼统地说:如果您有一个凸的,连续可微的和严格增加的函数那么您可以将商重新写为h

    f(n)g(n)=h(f(n))h(g(n))

    与和gΩ(1)

    limnf(n)g(n)=

    然后

    limnf(n)g(n)=

    有关此规则的严格证明,请参见此处(德语)。

  • 考虑您的职能在现实中的延续。您现在可以使用L'Hôpital规则;注意其条件²!

  • 看一下离散等效项Stolz–Cesàro
  • 当阶乘弹出时,使用斯特林公式

    n!2πn(ne)n

保留一次证明并经常使用的基本关系池也很有用,例如:

  • 对数比多项式增长慢,即

    (logn)αo(nβ)对于所有。α,β>0

  • 多项式的阶数:

    nαo(nβ)对于所有。α<β

  • 多项式的增长比指数慢:

    nαo(cn)对于所有和。αc>1


可能会发生上述引理不适用的情况,因为该限制不存在(例如,函数振荡时)。在这种情况下,请考虑使用上等/劣等石灰对Landau类进行以下表征:

使用我们有cs:=lim supnf(n)g(n)

  • 0cs<fO(g)
  • cs=0fo(g)

使用我们有了ci:=lim infnf(n)g(n)

  • 0<cifΩ(g)
  • ci=fω(g)

此外,

  • 0<ci,cs<fΘ(g)gΘ(f)
  • ci=cs=1fg

如果您对我的记法感到困惑,请在此处此处进行检查。


¹注意:我的同事编写了一个Mathematica函数,该函数成功地对许多函数执行了此操作,因此引理确实将任务简化为机械计算。

²另请参见此处


@Juho afaik不是公开的,但是写自己是基本的。计算Limit[f[n]/g[n], n -> Infinity]并执行区分大小写。
拉斐尔

20

另一个技巧:有时将单调函数(例如log或exp)应用于函数会使情况更清晰。


5
这应该谨慎进行: ,但。2nO(n)22nO(2n)
Shaull

2
第二。“应用单调功能”似乎是某种民间文学艺术,通常不起作用。我们一直在研究足够的标准,并提出了我在最新答案版本中发布的内容。
拉斐尔

17

Skiena在他的《算法设计手册》一书中提供了最常见功能之间的优势关系的排序列表:

n!cnn3n2n1+ϵnlgnnn1/2
lg2nlgnlgnlglgnlglgnα(n)1

这里表示逆阿克曼函数α(n)


那是一个奇怪的清单。许多关系(无论到底是什么意思)都可以概括为少数更一般的引理。
拉斐尔

这是他对优势关系的表示。
罗伯特·S·巴恩斯

11

提示:使用Wolfram Alpha之类的工具绘制这些函数的图形,以了解它们的增长方式。请注意,这不是很精确,但是如果您尝试使用足够大的数字,则应该看到比较的增长方式。这当然不能代替证明。

例如,尝试:从1到10000绘制log(log(n))以查看单个图形,或者从1到10000 绘制log(log(n))并绘制log(n)以查看比较。


9
我们真的应该推荐伏都教吗?
拉斐尔

+1表示建议绘制函数图,尽管除非您知道它们的含义,否则链接的图相当混乱。
伊藤刚(Tsuyoshi Ito)2012年

1
以图表作为提示,您可能想要证明。该提示当然是错误的。
gnasher729

8

我建议根据各种符号的定义进行操作。从任意一对表达式开始,然后确定它们的顺序,如下所述。然后,对于每个其他元素,使用二进制搜索和如下比较来找到其在排序列表中的位置。因此,例如,让我们对的前两个函数和排序,以启动列表。nloglogn2n

我们使用的属性将第一个表达式重写为。然后,我们可以继续使用该定义来显示,因为对于任何常数,有一个使得对于,。n=2lognnloglogn=(2logn)loglogn=2lognloglognnloglogn=2lognloglogno(2n)c>0n0nn0c(nloglogn)=c(2lognloglogn)<2n

接下来,我们尝试。我们将其与进行比较,这是我们迄今为止放置的最大元素。由于,我们类似地显示。3n2n3n=(2log3)n=2nlog32no(3n)=o(2nlog3)

等等。


2

这是Wikipedia的列表,表中的级别越低,复杂度等级越高;

NameRunning TimeConstant timeO(1)Inverse Ackermann timeO(a(n))Iterated logarithmic timeO(logn)Log-logarithmicO(nlogn)Logarithmic timeO(logn)Polylogarithmic timepoly(logn)Fractional powerO(nc),where 0<c<1Linear timeO(n)"n log star n" timeO(nlogn)Quasilinear timeO(nlogn)Quadratic timeO(n2)Cubic timeO(n3)Polynomial timepoly(n)=2O(logn)Quasi-polynomial time2O(poly(logn))Sub-exponential time (first definition)O(2nϵ),ϵ>0Sub-exponential time (second definition)2o(n)Exponential time(with linear exponent)2O(n)Exponential time2poly(n)Factorial timeO(n!)

注意:poly(x)=xO(1)


1
此外,有趣的是该表如何建议。当你的表链接到是有点准确,一个挂(和复制)大约是复杂的类,这是不是在这里混在一个有用的东西。Landau标记与“时间”无关。2nlogno(n!)
拉斐尔

1
我这样说,以便可以在这里直接谈论复杂性类的名称。是的,Landau更多地涉及密码学中的一种特定类型的算法。
kelalaka

1
我反对@Raphael的一些观点。我多年来一直是数学家和讲师。我相信,除了证明这些事情之外,像这样的一张大桌子可以轻松,大大地增加人们的直觉。渐近类的名称可以帮助人们记忆和交流很多。
Apass.Jack

1
@ Apass.Jack在我的教学经验中,当有一张桌子时,许多学生会心地学习它,而无法订购该桌子上没有的任何功能。请注意,这种效果似乎是如何解释这个站点上渐近生长的许多问题的。就是说,如果可以简化证明,我们当然会使用表格隐含的引理,但这是学习了如何对表格进行证明之后得出的。(要强调这一点,来这里的人不需要帮助,不需要从桌子上读书。他们需要帮助证明亲戚关系。)
拉斐尔

1
@kelalaka“是的,Landau更多地涉及密码学中的一种特定类型的算法。” -这甚至没有意义。Landau符号是描述数学函数属性的简写。它与算法本身无关,更不用说密码学了。
拉斐尔
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.