多项式时间算法

    时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间随规模增长得有多快

    也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏。当这个数据的规模变大到数百倍后,程序运行时间是否相差不大,或者也跟着慢了数百倍,或者变慢了数万倍。

    1、不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O( 1 1 1)的时间复杂度,也称常数级复杂度;
    2、数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O( n n n),比如找n个数中的最大值;
    3、像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O( n 2 n^2 n2)的复杂度。
    4、穷举类的算法,所需时间长度成几何阶数上涨,这就是O( a n a^n an)的指数级复杂度,甚至O(( n ! n! n!))的阶乘级复杂度。

    不会存在O(( 2 n 2 2n^2 2n2))的复杂度,因为数字“2”是系数,不会影响到整个程序的时间增长。同样地,O ( n 3 + n 2 n^3+n^2 n3+n2)的复杂度也就是O( n 3 n^3 n3)的复杂度。因此,我们会说,一个O( 0.01 n 3 0.01n^3 0.01n3)的程序的效率比O( 100 n 2 100n^2 100n2)的效率低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增长得慢,最终O(n^3)的复杂度将远远超过O( n 2 n^2 n2)。我们也说,O( n 100 n^{100} n100)的复杂度小于O( 1.0 1 n 1.01^n 1.01n)的复杂度。

    总结:容易看出,前面的几类复杂度被分为两种级别,其中后者的复杂度无论如何都远远大于前者:一种是O( 1 1 1),O( l o g ( n ) log(n) log(n)),O( n a n^a na)等,我们把它叫做多项式级的复杂度,因为它的规模n出现在底数的位置;另一种是O( a n a^n an)和O( n ! n! n!)型复杂度,它是非多项式级的,其复杂度计算机往往不能承受。当我们在解决一个问题时,我们选择的算法通常都需要是多项式级的复杂度,非多项式级的复杂度需要的时间太多,往往会超时,除非是数据规模非常小。

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值