算法-绪论(是第一章呢)

算法的基本概念

1.1为什么要学习算法

  理由一:算法——程序的灵魂

       问题的求解过程:

       分析问题->设计算法->编写程序->整理结果

       程序设计研究的四个层次:

算法->方法学->语言->工具

  理由二:提高分析问题的能力

 

1.2算法及其重要性

算法(Algorithm):对特定问题求解步骤的一种描述,是指令的有限序列。

  

算法的五大特性:

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

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

⑶ 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。

⑷ 确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出。

⑸ 可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现。

 

1.3算法的描述方法

⑴ 自然语言

优点:容易理解

缺点:冗长、二义性

使用方法:粗线条描述算法思想

注意事项:避免写成自然段

     如欧几里得算法:

① 输入m 和n;

② 求m除以n的余数r;

③ 若r等于0,则n为最大公约数,算法结束;

   否则执行第④步;

④ 将n的值放在m中,将r的值放在n中;

⑤ 重新执行第②步。

⑵ 流程图

优点:流程直观

缺点:缺少严密性、灵活性

使用方法:描述简单算法

注意事项:注意抽象层次

    欧几里得算法:

                

⑶ 程序设计语言

优点:能由计算机执行

缺点:抽象性差,对语言要求高

使用方法:算法需要验证

注意事项:将算法写成子函数

  欧几里得算法:

#include <iostream.h>
int CommonFactor(int m, int n)
{
    int r=m % n;
    while (r!=0) 
   {
      m=n;
      n=r;
      r=m % n;
   }
   return n;
}
void main( )
{
   cout<<CommonFactor(63, 54)<<endl;
}

⑷ 伪代码——算法语言

伪代码(Pseudocode):介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,操作指令可以结合自然语言来设计。

优点:表达能力强,抽象性强,容易理解

欧几里得算法:

    1. r = m % n;

    2. 循环直到 r 等于0

        2.1 m = n;

        2.2 n = r;

        2.3 r = m % n;

    3. 输出 n ;

 

1.4算法设计的一般过程

1.理解问题

2.预测所有可能的输入

3. 在精确解和近似解间做选择

4. 确定适当的数据结构

5.算法设计技术

6.描述算法

7.跟踪算法

8.分析算法的效率

9.根据算法编写代码

 

1.5重要的问题类型

1. 查找问题

2. 排序问题

3. 图问题

4. 组合问题

5. 几何问题

 

  2  算法分析

算法分析(Algorithm Analysis):对算法所需要的两种计算机资源——时间和空间进行估算

时间复杂性(Time Complexity)

   时间复杂性分析的关键:

问题规模:输入量的多少;

基本语句:执行次数与整个算法的执行时间

                       成正比的语句

 

空间复杂性(Space Complexity)

 

2.1  渐进符号

1. 大O符号

定义1.1  若存在两个正的常数c和n0,对于任意n≥n0,都有T(n)≤c×f(n),则称T(n)=O(f(n)),或称算法在O(f(n)中。

2. 大Ω符号

定义1.2  若存在两个正的常数c和n0,对于任意n≥n0,都有T(n)≥c×g(n),则称T(n)=Ω(g(n))

3. Θ符号

  定义1.3 若存在三个正的常数c1、c2和n0,对于任意n≥n0都有c1×f(n)≥T(n)≥c2×f(n),则称T(n)=Θ(f(n))

 

定理1.1  若T(n)=amnm +am-1nm-1 + … +a1n+a0(am>0),则有T(n)=O(nm)且T(n)=Ω(n m),因此,有T(n)=Θ(n m)。

 

2.2  最好、最坏和平均情况

最好情况:出现概率较大时分析

最差情况:实时系统

平均情况:已知输入数据是如何分布的,通常假设等概率分布

 

算法——非递归算法、递归算法

2.3  非递归算法的分析

非递归算法分析的一般步骤:

1. 决定用哪个(或哪些)参数作为算法问题规模的度量

2. 找出算法中的基本语句

3. 检查基本语句的执行次数是否只依赖于问题规模

4. 建立基本语句执行次数的求和表达式

5. 用渐进符号表示这个求和表达式

关键:建立一个代表算法运行时间的求和表达式,然后用渐进符号表示这个求和表达式。

 

2.4  递归算法的分析

关键:根据递归过程建立递推关系式,然后求解这个递推关系式。

1. 猜测技术:对递推关系式估计一个上限,然后(用数学归纳法)证明它正确。

2. 扩展递归技术

3. 通用分治递推式

大小为n的原问题分成若干个大小为n/b的子问题,其中a个子问题需要求解,而cnk是合并各个子问题的解需要的工作量。

 

2.5  算法的后验分析

   算法的后验分析(Posteriori)也称算法的实验分析,它是一种事后计算的方法,通常需要将算法转换为对应的程序并上机运行。

一般步骤:

  1. 明确实验目的

2. 决定度量算法效率的方法,为实验准备算法的程序实现

  1. 决定输入样本,生成实验数据

4. 对输入样本运行算法对应的程序,记录得到的实验数据

  1. 分析得到的实验数据

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值