《算法设计与分析》 01.算法与算法分析

1.1 算法及其描述

一个运算实现是通过算法来表述的。

算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每条指令表示一个或多个操作。

算法设计应满足以下几条目标:

正确性:要求算法能够正确地执行预先规定的功能和性能要求。这是最重要也是最基本的标准。

可使用性:要求算法能够很方便地使用。这个特性也叫做用户友好性。

可读性:算法应该易于人的理解,也就是可读性好。为了达到这个要求,算法的逻辑必须是清晰的、简单的和结构化的。

健壮性:要求算法具有很好的容错性,即提供异常处理,能够对不合理的数据进行检查。不经常出现异常中断或死机现象。

高效率与低存储量需求:好的时间空间效率。

算法的5个特性:

有限性:一个算法必须总是(对任何合法的输入值)在执行有限步之后结束,且每一步都可在有限时间内完成。

确定性:算法中每一条指令必须有确切的含义,不会产生二义性。

可行性:算法中每一条运算都必须是足够基本的,就是说它们原则上都能精确地执行,甚至人们仅用笔和纸做有限次运算就能完成。

输入性:一个算法有零个或多个输入。

输出性:一个算法有一个或多个输出。

例:有下列两段描述

        描述1是一个死循环,违反了算法的有限性特性。

        描述2出现除零错误,违反了算法的可行性特性。

 

C/C++语言中调用函数时只有从实参到形参的单向值传递,执行函数时若改变了形参而对应的实参不会同步改变。

例如,设计以下主函数调用Sum1函数:

        执行时发现输出结果为0。

        b对应的形参为s,Sum1执行后s=55,但s并没有回传给b。

        在C语言中可以用传指针方式来实现形参的回传,但增加了函数的复杂性。

 

C++语言中增加了引用型参数的概念,引用型参数名前需加上&,表示这样的形参在执行后会将结果回传给对应的实参。

         当将形参s改为引用类型的参数后,执行时main函数的输出结果就正确了即输出55。 

算法中引用型参数的作用

 

 1.2 算法分析

        计算机资源主要包括计算时间和内存空间。

        ●算法分析是分析算法占用计算机资源的情况。所以算法分析的两个主要方面是分析算法的时            间复杂度和空间复杂度。

        ●算法分析的目的不是分析算法是否正确或是否容易阅读,主要是考察算法的时间和空间效              率,以求改进算法或对不同的算法进行比较。 

有两种衡量算法效率的方法:

        ●事后统计法

        ●事前分析估算法

事后统计法存在这些缺点:

        一是必须执行程序,二是存在其他因素掩盖算法本质。

通常采用事前分析估算法来分析算法效率。

1. 算法时间复杂度分析

       ●采用事前分析估算方法分析算法的时间性能。

       ●一个算法是由控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)构成            的。

       ●算法的运行时间取决于两者的综合效果。

例如,如下算法Solve,其中形参a是一个m行n列的数组,当是一个方阵(m=n)时求主对角线所有元素之和并返回1,否则返回0。

 算法的执行时间主要与问题规模n有关。例如,数组的元素个数、矩阵的阶数等都可作为问题规模。

所谓一个语句的频度,即指该语句在算法中被重复执行的次数。

算法中所有语句的频度之和记做T(n),它是问题规模n的函数。

一个算法的语句的频度之和T(n)与算法的执行时间成正比,所以可以将T(n)看作算法的执行时间。

当问题规模n趋向无穷大时,T(n)的数量级称为渐进时间复杂度,简称为时间复杂度,记作T(n)=O(f(n))

 

O”的含义是为T(n)找到了一个上界f(n),其严格的数学定义是:

T(n)的数量级表示为O(f(n)),是指存在常量c≠0和n0(为一个足够大的常量),使得

 成立。

 

T(n)=5n3-2n2+3n-100,则T(n)=O(n3),因为

 T(n)≠O(n4),因为当n足够大时,c1值趋于0。

 T(n)≠O(n2),因为 当n足够大时,c2值趋于∞。

 

 算法的时间复杂度是T(n)的数量级

算法中基本运算语句的频度与T(n)同数量级。被视为算法基本运算的语句一般是最深层循环内的语句

所以通常采用算法中基本运算语句的频度来分析算法的时间复杂度。

       一个没有循环的算法中基本运算次数与问题规模n无关,记作O(1),也称作常数阶。一个只有一重循环的算法中基本运算次数与问题规模n的增长呈线性增大关系,记作O(n),也称线性阶。其余常用的还有平方阶O(n2)、立方阶O(n3)、对数阶O(log2n)、指数阶O(2n)等等。

 各种不同数量级对应的值存在着如下关系:

        O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)

对于求1+2+…+n值,下图所示的算法1不如下面的算法2好。 

 因为算法1的时间复杂度为O(n),而算法2的时间复杂度为O(1)。

 

例:求解出以下算法的时间复杂度。

 :其中基本运算语句是while循环内的语句。

       设while循环语句执行的次数为m,i从1开始递增,最后取值为1+2m,有:

  i=1+2m≤n

     即

  T(n)=m≤(n-1)/2=O(n)

  该算法的时间复杂度为O(n)。

 

2. 算法空间复杂度分析

        ●一个算法的存储量包括形参所占空间和临时变量所占空间等。

        ●对算法进行存储空间分析时,只考察临时变量所占空间

        ●算法的临时空间一般也作为问题规模n的函数,以数量级形式给出,记作:S(n) = O(g(n)),            其中“O”的含义与时间复杂度中的含义相同。

为什么算法占用的空间只考虑临时空间,而不必考虑形参的空间呢?

 因为形参的空间会在调用该算法的算法中考虑。

 

若算法所需临时空间相对于输入数据量来说是常数,则称此算法为原地工作就地工作

若所需临时空间依赖于特定的输入,则通常按最坏情况来考虑。

例:分析算法1和算法2的空间复杂度。

 :这两个算法中,需临时分配空间的变量只有固定几个变量,故它们的空间复杂度均为O(1),即该算法为原地工作算法。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值