算法设计与分析---第1章 绪论

算法理论的两大论题:

  • 算法设计—对于一个问题如何设计一个有效的算法
  • 算法分析—如何评价或判断一个算法的优劣

1.1.1 为什么要学习算法
理由1:算法——程序的灵魂
问题的求解过程:
分析问题→设计算法→编写程序→整理结果
程序设计研究的四个层次:
算法→方法学→语言→工具
理由2:提高分析问题的能力
算法的形式化→思维的逻辑性、条理性
1.1.2 算法及其重要特性
算法(Algorithm):对特定问题求解步骤的一种描述,是指令的有限序列。
算法的五大特性
输入:一个算法有零个或多个输入。
输出:一个算法有一个或多个输出。
有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出。
可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现。
实例:

  • 数码相机人脸自动对焦和笑脸快门技术
  • 人脸识别技术

常见的人脸识别技术:

  • 几何特征的人脸识别方法
  • 基于特征脸(PCA)的人脸识别方法
  • 神经网络的人脸识别方法

:欧几里德算法——辗转相除法求两个自然数 m 和 n 的最大公约数
1.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.1.5 重要的问题类型
1、查找问题
2、排序问题
3、 图问题
4、组合问题
5、几何问题
1.2 算法分析
算法分析(Algorithm Analysis):对算法所需要的两种计算机资源——时间和空间进行估算
时间复杂性(Time Complexity)
空间复杂性(Space Complexity)
算法分析的目的
设计算法——设计出复杂性尽可能低的算法
选择算法——在多种算法中选择其中复杂性最低者
1.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)。
1.2.2 最好、最坏和平均情况
: 在一维整型数组A[n]中顺序查找与给定值k相等的元素(假设该数组中有且仅有一个元素值为k)

int Find(int A[ ], int n)   
{      
	for (i=0; i<n; i++)      
		if (A[i]= =k) 
			break;      
	return i;  
}

结论:如果问题规模相同,时间代价与输入数据有关,则需要分析最好情况、最坏情况、平均情况。
最好情况:出现概率较大时分析
最差情况:实时系统
平均情况:已知输入数据是如何分布的, 通常假设等概率分布
1.2.3 非递归算法的分析
:求数组最小值算法

int ArrayMin(int a[ ], int n)  
{       
	min=a[0];       
	for (i=1; i<n; i++)          
		if (a[i]<min) 
			min=a[i];       
	return min;  
}

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

  1. 决定用哪个(或哪些)参数作为算法问题规模的度量
  2. 找出算法中的基本语句
  3. 检查基本语句的执行次数是否只依赖于问题规模
  4. 建立基本语句执行次数的求和表达式
  5. 用渐进符号表示这个求和表达式

关键:建立一个代表算法运行时间的求和表达式,然后用渐进符号表示这个求和表达式。
1.2.4 递归算法的分析
关键:根据递归过程建立递推关系式,然后求解这个递推关系式。

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

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

  1. 明确实验目的
  2. 决定度量算法效率的方法,为实验准备算法的程序实现
  3. 决定输入样本,生成实验数据
  4. 对输入样本运行算法对应的程序,记录得到的实验数据
  5. 分析得到的实验数据
发布了48 篇原创文章 · 获赞 25 · 访问量 2453

猜你喜欢

转载自blog.csdn.net/qq_43628959/article/details/105058852