什么是算法
数据元素之间的关系有逻辑关系和物理关系,对应的运算有基于逻辑结构的运算描述和基于存储结构的运算实现。
通常把基于存储结构的运算实现的步骤或过程称为算法。
算法的五个重要的特性
特性 | 描述 |
---|---|
有穷性 | 在有穷步之后结束,算法能够停机 |
确定性 | 无二义性 |
可行性 | 通过基本运算有限次执行来实现,也就是算法中每一个动作能被机械地执行 |
有输入 | 表示存在数据处理 |
有输出 | 表示存在数据处理 |
算法分析基础
算法分析目的:分析算法的时空效率以便改进算法性能。
算法时间复杂度分析
一个算法是由控制结构(顺序,分支和循环三种)和原操作(指固有数据类型的操作,如±/*、++和–等)构成的。算法执行时间取决于两者的综合效果。
一个算法的基本构成:
例如
算法分析方式:
1.事后分析统计方法:编写算法对应程序,统计执行时间。
不可行,原因:
编写程序的语言不同 |
执行程序的环境不同 |
其他因素 |
简单说就是:每个人用的电脑不同,语言不同,每条语句编译和执行的速度不同,根本没法比。
2.事前估算分析方法:撇开上述因素,认为算法的执行时间是问题规模n的函数。
这是可行的,既然在不同的机子上程序执行的时间不同,就统计执行的次数,次数乘上机子每条语句的执行时间就是总的执行时间,那么干脆就用次数代替时间进行比较。
具体原因
求出算法所有原操作的执行次数,也称频度,它是问题规模n的函数,用T(n)表示 |
算法执行时间大致=原操作需要的时间 x T(n).所以T(n)与算法的时间成正比。所以用T(n)表示算法的执行时间 |
比较不同算法的T(n)大小得出算法执行时间的好坏 |
这段话真不好理解 |
整个程序的时间绝大部分用在了循环,所以总执行次数大致就是循环的次数,那么用循环的次数代替总执行次数。
举个栗子(例子)
算法的执行时间用时间复杂度来表示
算法执行时间T(n)是问题规模的n的某个函数f(n),记作:
T(n)=O(f(n)) (大O表示法)
记号O读作大O,它表示随问题规模n的增大算法执行时间的增长率和f(n)的增长率相同。
本质上讲,是一种T(n)最高数量级的比较,也就是只求出T(n)的最高阶,忽略其低阶项和常数,这样既可以简化T(n)的计算,又能比较客观的放映当n很大时算法的时间性能。
如上题的的
T(n)=2n^2+2n+1=O(n ^2)
一般的:
一个没有循环的算法的执行时间与问题规模n没有关系,记作O(1),也称作常数阶。
一个只有一重循环的算法的执行时间与问题规模n的增长呈线性增大关系,记作O(n),也称线性阶。
其余常用的算法时间复杂度还有平方阶,立方阶,对数阶,指数阶。
简化的算法时间度分析
算法的基本操作一般是最深层循环内的原操作。
算法执行时间大致=基本操作所需的时间X运算的次数
于是,计算T(n)时仅考虑基本操作的运算次数。
算法的空间复杂度分析
空间复杂度:用于量度一个算法在运行过程中临时占用的存储空间大小。
一般也作为问题规模n的函数,采用数量级形式描述,记作:
S(n)=O(g(n))
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。
一个算法的空间复杂度为O(1),称此算法为原地工作或就地工作算法。
空间复杂度分析只考虑临时占用的存储空间。
举个栗子
int max(int a[],int n)
{
int i;maxi=0;
for(i=1;i<=n;i++)
if(a[i]>a[maxi])
maxi=i;//找到最大值的下标
return a[maxi];//返回最大值
}
void maxfun()
{
int b[]={1,2,3,4,5},n=5;
printf("Max=%d\n",max(b,n));
}
max算法的空间复杂度为O(1),如果max函数再考虑形参a的空间,就重复累计了执行整个算法所需的空间。
maxfun算法中为b数组分配了相应的内存空间,如果有n个数据,就得分配相应的内存,复杂度为O(n).
再举个栗子
def fun(n):
int k=1;
if n == k:
return n
else:
return fun(--n)
递归实现,每次调用,要创建一个新的变量,调用n次,有n个变量
复杂度为O(n).
不知道为什么PPT上对空间复杂度的介绍明显没有时间复杂度详细,可能是时间复杂度求解更有意义,很多情况也可以牺牲空间来减小时间复杂度。