算法导论-从算法复杂度开始说起

在各种论文中我们经常会看到算法复杂度分析。这是一个高频出现的内容。大部分的同学第一反应肯定是 什么是复杂度?算法复杂度是不是算法具体执行了多少次?

其实算法复杂度是指算法的时间复杂度,其单位并不是一次具体的运算(如 加法 乘法 或者寄存器操作等),相反,凡是能够在有限时间内完成的,统称为常数时间操作,是算法复杂度的基本单位。算法的时间复杂度也不是指具体的算法执行次数,而是指随着算法输入规模增加,算法的复杂度增长的规律。因此,算法复杂度是一个极限的概念,也称为渐进复杂度。既然是极限相关的分析,所以我们先给出算法复杂度分析中遵循的四个基本规律:

  1. 考虑算法复杂度最坏的情况
  2. 忽略低阶项
  3. 忽略常数
  4. 假设输入规模n为无穷大

算法复杂度的相关符号有三个 \mathcal{O}(), \Omega(), \Theta(),分别表示上界,下界,和确界。

为了方便我们假设算法复杂度实际上用T(n)表示。接着我们给出三个符号的定义:

  1.  算法复杂度上界\mathcal{O}(f(n))表示,存在一个常数c,n_{0}, 函数f(n), 当n>n_{0}, T(n)<= cf(n)。
  2.  算法复杂度下界\Omega(f(n)))表示,存在一个常数c,n_{0}, 函数f(n), 当n>n_{0}, T(n)>= cf(n)。

  3.  算法复杂度确界\Theta(f(n)))表示,存在尝试c1, c2,n_{0}, 函数f(n), 当n>n_{0}, c1f(n)<=T(n)<=c2f(n)。

有了以上的定义,我们稍微做几道联系巩固一下。

ex1 . 我们考虑一下如下的任务,给定两个数组,A,B,我们想知道A,B两个数组有没有公共元素。

这个问题的伪代码如下图所示:

for i=1:n

      for j=1:n

             if A[i]==B[j]

                     return True

              endif

       endfor

endfor

return false

显然,上述问题最坏情况下就是执行n^{2}次,因此算法复杂度上界为 \mathcal{O}(n^{2})。

为了更好的对前文提到的上界 下界 确界进行理解,我们再一起做一到练习

ex 2. 假设某算法复杂度T(n)=\frac{1}{2}n^{2}+3n,则下列说法正确的有:

         A.T(n) = \mathcal{O}(n)

         B T(n)=\Omega(n)

         C T(n)=\Theta(n^{2})

         D T(n)=\mathcal{O}(n^{3})

正确答案是 BCD,首先T(n) = \mathcal{O}(n^{2})< \mathcal{O}(n^{3}), 所以A错,D对。注意\mathcal{O}代表上界。只是D是一个不太好的上界而已。同理 \Omega(n)是一个不太好的下界,所以B对。又\frac{1}{2}n^{2}\leq \frac{1}{2}n^{2}+3n \leq n^{2}, c1 = \frac{1}{2}, c2=1,因此C选项也是对的。

希望通过这一篇博文,大家可以明确掌握算法复杂度的定义,其中复杂度上界用的是最多的。另外两个用的比较少。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值