算法概述

1.1程序与算法

     算法是有若干条指令组成的又穷序列。且满足下列四条性质:
     (1)输出:有零个或者多个由外部提供的量作为算法的输入。
     (2)输出:算法产生至少一个量作为输出。
     (3)确定性:组成算法的每条指令都是清晰,无歧义的。
     (4)有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。
     程序与算法不同,程序是算法用某种程序设计语言的具体实现。程序可以不满足算法的性质(4)。例如:操作系统实在无限循环中执行的程序。

1.2算法的复杂性分析

      算法复杂性的高低体现在运行费算法所需要的计算机资源的多少,所需的资源越多,则算法的复杂性越高。对于计算机而言,他所有的资源不过时间和空间。因此,算法的复杂性就有了时间复杂性和空间复杂性。
         复杂性的值只依赖于问题的规模,算法的输入输出,以及算法本身。即 C = F ( N , I , A ),其中C代表复杂度,N代表问题的规模,I代表算法的输入输出,A代表算法本身。对于一个算法通常只考虑三种情况下的复杂性,即最坏情况,最好情况,和平均情况。实践表明,可操作性最好且最具有实际价值的是最坏情况下的复杂度。
         一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数。假设一个具体的算法A,设T(n)表示前面所定义复杂性函数。n表示问题的规模。若有某个辅助函数T‘(n),使得当n趋近于无穷大时,有( T(n)-T’(n)/T(n)的极限值为0,那么,就说T‘(n)是T(n)当n→无穷时的渐进性态或渐进表达式。或称T’(n)为算法 A的渐进复杂性。由于当n趋近于无穷时,T(n)渐进与T’(n),我们有理由用T‘(n)代表T(n)作为算法A在n趋近于无穷是的复杂性度量。
         例如:
                   当T(n)= 3 n 2 +4nlogn+1 时,T’(n)的一个答案就是3 n 2 ,为了进一步简化,我们将忽略T‘(n)中的常数因子。也即 T’(n)=n 2
         为了进一步说明问题,我们将引入渐进意义下的记号O,Ω,θ,o。

         设 f( N ) 和 g( N ) 是定义在正整数集上的正函数。
         如果存在正的常数C和自然数N。使得当 N ≥ N o 时有 f( N ) ≤ Cg( N ),则称函数f( N )当n趋近于无穷时上有界,且g(n)为其一个上界,记 f( N )=O(g( N ))。
         举几个例子:
              (1) 因为对所有的 N≥1 有 3N≤4N,所以有 3N=O(N);
              (2)因为当 N≥10 时,有 2N 2 +11N+1≤3N 2 ,所以有 2N 2 +11N+1 =O(N 2
              (3)因为当N≥1时,有 N 2 ≤N 3 ,所以有  N 2 =O(N 3
         按照符号O的定义,容易证明的几个运算性质:
              (1) O(f)+O(g) = O( max(f,g) )
              (2) O(f)+O(g) = O( f+g )
              (3) O(f)O(g)=O(fg)
              (4) 如果g(n)=O(f(n)),则O(f)+O(g)=O(f)
              (5) O(Cf(n))=O(f(n))
              (6) f=O(f)
         应当指出:根据O的定义,得到的只有当规模充分大时的一个上界。这个上界的阶越低,则评价的就越精确,结果越有价值。
         同理:
          设 f( N ) 和 g( N ) 是定义在正整数集上的正函数。
         如果存在正的常数C和自然数N。使得当 N ≥ N o 时有 f( N ) ≥ Cg( N ),则称函数f( N )当n趋近于无穷时下有界,且g( N )为其一个下界,记 f( N )=Ω(g( N ))。
         应当指出:根据 Ω 的定义,得到的只有当规模充分大时的一个上界。这个上界的阶越低,则评价的就越精确,结果越有价值。
         定义f(n)= θ (g(n)),当且仅当f(n)=O(g(n)),且f(n)=Ω(g(n))。这时,我们说 f 与 g 等价。
         最后,如果对于任意给定的 ε>0,都存在一个正整数N 0 ,使得当N ≥ N 0 时有f( N )/g(N) < ε ,则称函数f(N)当N充分大时的阶比g(N)低,记做f( N )=o(g( N ))

         常见的算法时间复杂度由小到大依次为: Ο(1)<Ο(log 2 n )<Ο(n)<Ο(nlog 2 n )<Ο( n 2 )<Ο( n 3 )<…<Ο( 2 n )<Ο(n!)

1.2.2计算算法时间复杂度时有以下几个简单的程序分析法则:

    (1).对于一些简单的输入输出语句或赋值语句,近似认为需要O(1)时间

    (2).对于 顺序 结构,需要依次执行一系列语句所用的时间可采用大O下"求和法则"
     求和法则:是指若算法的2个部分时间复杂度分别为 T1(n)=O(f(n))和 T2(n)=O(g(n)),则 T1(n)+T2(n)=O(max(f(n), g(n)))
    特别地,若T1(m)=O(f(m)), T2(n)=O(g(n)),则 T1(m)+T2(n)=O(f(m) + g(n))
    (3).对于选择结构,如if语句,它的主要时间耗费是在执行then字句或else字句所用的时间,需注意的是检验条件也需要O(1)时间
    (4).对于 循环 结构,循环语句的运行时间主要体现在多次迭代中执行循环体以及检验循环条件的时间耗费,一般可用大O下"乘法法则"
     乘法法则: 是指若算法的2个部分时间复杂度分别为 T1(n)=O(f(n))和 T2(n)=O(g(n)),则 T1*T2=O(f(n)*g(n))
    (5).对于复杂的算法,可以将它分成几个容易估算的部分,然后利用求和法则和乘法法则技术整个算法的时间复杂度

1.3NP完全性理论

     论计算机的算法复杂性可以通过解决该问题所需计算量的多少来衡量。如何区分一个问题是“易”问题,还是“难”问题?人们通常将可以在多项式时间内解决的问题看成“易”解问题,而将需要在指数函数时间内解决的问题看成“难”解问题。这里所说的多项式时间和指数函数时间是针对问题的规模而言的,即解决问题所需的时间是问题规模的多项式时间还是指数函数时间。
     所有可以再多项式时间内求解的判定问题构成P类问题。P类5问题是确定性算法模型下的易解问题类。而NP问题是非确定性计算模型下的易验证问题类。
     非确定性算法将问题的求解分为猜测和验证两个阶段。算法的猜测阶段是非确定性的,他给出问题解的一个猜测。算法的验证阶段是确定性的。他验证猜测阶段给出解的正确性。假设算法A的解是一个判定问题Q的非确定性算法。如果算法A的验证阶段可以再多项式时间内完成,则称算法A是一个多项式时间内非确定性算法。同时也称问题Q为非确定性多项式时间可解的。
     所有非确定性多项式时间可解的判定问题构成NP类问题。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值