小声音算法
big-O notation and its relatives-concepts that belong in the vocabulary of every serious programmer and computer scientist.编程
为何要研究它编程语言
渐进表示法是算法分析里的基本术语,当听到别人说某段代码以"n的大O时间"运行,而另外一段代码以"n平方的大O时间 运行",你须要知道背后的含义。3d
当某个问题能够用不一样的算法解决时,须要用一个东西进行比较哪一个算法好。渐进表示算法就能够帮助区分。blog
High Levelci
一句话归纳渐进算法,就是: 忽略常数因子和低阶项。数学
渐进法还有更多的含义,可是10年后能记得的就是上面这个归纳,它很精妙。it
为何要忽略常数因子?io
常数因子通常很依赖于环境的细节,咱们的算法分析是不想固定某种特定的编程语言,计算机体系结构,因此忽略常数因子是合理的。class
为何要忽略低阶项?
当咱们的输入很大的时候,低阶项的做用很微小,而咱们算法关注的就是大规模的输入。
大O符号
标准的数学公式以下定义:
T(n)=O(f(n))当且仅当T(n)最后的上界是f(n)的一个常数积。
因此只须要找的到c和n0,使得当n>=n0的时候不等式知足,就表示T(n)=O(f(n))。
用图来表示就是
这里的n0就是指'最后的',3就是指'常数倍',当n>n0的时候,知足T(n)<=3f(n),因此T(n)=O(f(n))。
大Omega符号
它的数学表示以下:
它的定义和大O的定义是平行的,当且仅当T(n)最后的下界是f(n)的一个常数积。用图来表示就是:
当n>=n0时,T(n)>=1/4f(n),因此
大theta符号
能够把它类比为"等于",同时知足上面两个条件,即:
和
至关于T(n)最后被夹在了f(n)的两个不一样的常数积之间。数学定义以下:
参考书:Algorithms Illuminated