01-算法概述

程序=算法+数据结构

理解算法的概念。
理解什么是程序,程序与算法的区别和内在联系。
掌握算法最好、最坏、平均计算复杂性概念。
掌握算法渐近复杂性的数学表述。
掌握用C++语言描述算法的方法。

算法

教课书式定义:算法式解决问题的一种方法或一个过程
算法式若干指令的有穷序列,满足性质:

  1. 输入,有外部提供的量作为算法的输入,
  2. 输出:算法产生至少一个量作为输出
  3. 确定性:组成双发的每一条指令是清晰的,无歧义的
  4. 有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的,

程序

程序是算法用某种程序设计 语言的具体实现
程序可以不满足算法的性质
操作系统是一个在无限循环中执行的程序,因而不是一个算法,
操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序通过特定的算法来实现,该子程序得到输出结果便终止

问题求解(Problem Solving)

算法复杂性分析

算法复杂性=算法所需要的计算机资源
算法的时间复杂性T(n)=T(n,i)
算法的空间复杂性S(n)=S(n,i)
其中n是问题的规模(输入大小) i表示算法及其输入

   算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在一定程度上能很好反映出算法的优劣与否,因此作为编程人员掌握基本的算法时间复杂度分析方法是很有必要的,
     算法的空间复杂度与时间复杂度计量方法相似且相对简单

算法时间复杂度

    一个算法是由控制系统(顺序,分支,循环)和原操作(固有数据类型的操作)构成的,那麽算法时间复杂度取决于两者的综合效果
  通常从算法中选取一个对于所研究的问题来说是基本操作的原操作,以该基本操作的重复执行的次数作为算法的时间量度
一个算法中的语句执行次数成为时间频度T(n),称为问题的规模,但不断变化时,时间频度也会不断变化,为了研究其变化规律引入时间复杂度,
  若有一个辅助函数f(n),使得当n趋于无穷大时,T(n)/f(n)的极限值不为零的常数,者称为f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),称O(F(n))为算法的渐进时间复杂度,简称时间复杂度

算法渐近复杂性

T(n) 趋于无穷大 , as n趋于无穷大 ;
(T(n) - t(n) )/ T(n) 趋近于0 ,as n趋于无穷大;
t(n)是T(n)的渐近性态,为算法的渐近复杂性。
在数学上, t(n)是T(n)的渐近表达式,是T(n)略去低阶项留下的主项。它比T(n) 简单。
如T(n)=2nn+n+1,此时t(n)=nn.

渐近分析的记号

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

算法分析中常见的复杂性函数

其中从常数c到n的3次方称为多项式时间,而2的n次方与n的阶乘(n!)等称为指数时间,计算机科学专家普遍认为多项式复杂度的算法是有效算法,称为P(Polynomial,多项式)类问题。而把后者称为NP(Non-Determiniistic Pollynomial,非确定多项式)问题。

小规模数据

在这里插入图片描述
中等规模数据
在这里插入图片描述

算法的时间复杂性分析

(1)最坏情况下的时间复杂性
Tmax(n) = max{ T(I) | size(I)=n }
(2)最好情况下的时间复杂性
Tmin(n) = min{ T(I) | size(I)=n }
(3)平均情况下的时间复杂性
Tavg(n) =
其中I是问题的规模为n的实例,p(I)是实 例I出现的概率。

算法分析方法

在这里插入图片描述
(1)Tmax(n) = max{ T(I) | size(I)=n }=O(n)
(2)Tmin(n) = min{ T(I) | size(I)=n }=O(1)
(3)在平均情况下,假设:
(a) 查找成功的概率为p ( 0 <=p <= 1 );
(b) 在数组的每个位置i ( 0 <= i < n )查找成功的概率相同,均为 p/n。

算法分析的基本法则

非递归算法:
(1)for / while 循环
循环体内计算时间循环次数;
(2)嵌套循环
循环体内计算时间
所有循环次数;
(3)顺序语句
各语句计算时间相加;
(4)if-else语句
if语句计算时间和else语句计算时间的较大者。

在这里插入图片描述
在最好情况下,ti=1, for 1 <= i <n;

在最坏情况下,ti <=i+1, for 1 <=i <n;

对于输入数据a[i]=n-i,i=0,1,…,n-1,算法insertion_sort 达到其最坏情形。因此,

在这里插入图片描述

(有下界)
由此可见,Tmax(n)= (n2)(同阶)
在这里插入图片描述
求递归算法时间复杂性

int factorial(int n)
{
if (n == 0) return 1;
return n*factorial(n-1);
}

Summary
1、算法的概念
2、算法的4个性质
3、渐近上界记号O,渐近下界记号
4、算法的时间复杂度的定义和求解
5、算法的时间复杂度的5条运算规则
6、算法的最坏,最好,平均时间复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值