目录
一、算法
1、算法概述
2、算法的5个特性
3、设计算法的标准
二、时间复杂度
1、时间复杂度的介绍
2、渐进时间复杂度的求法
3、计算时间复杂度的代码举例(平方阶示例)
4、时间复杂度排序
三、空间复杂度
一、算法
1、算法概述
算法就是解决问题的方法。以数据结构来表示出来对于问题的解决方法。一般算法的表示有三种方法:①自然语言表示②程序代码③类C语言。
2、算法的5个特性
有穷性:算法的实现是通过又穷步就可完成,且每一步都是有穷时间内完成的。
确定性:算法实现的输出结果唯一,对于算法中的所要执行的操作有确切的规定,不会存在二义性。
可行性:所有操作在有限时间内可实现。
输入:一个算法有零个或多个输入。
输出:一个算法有一个或多个输出。
3、设计算法的标准
正确性:不单单是程序语法正确,还要在运行一些能涵盖所有情况的特殊数据后能够准确的得到及结构。
可读性:算法是给人看的,要让读者能够读懂,而不会在阅读中有很多看不明白的地方。多增加注释,在很多变量和语句中增加解释,让算法变得清晰。
健壮性:随机应变能力。当输入非法的数据时,不会乱七八糟的随意输出,而会做出正确的反应或者得到错误提醒的输出语句。
高效性:高效分为时间高效和空间高效。效率高,则时间短,所需空间小。但是有时候时间效率和空间效率是矛盾的,想要时间效率高有时候会消耗很大的空间。
二、时间复杂度
算法时间效率是依据程序在计算机上运行所消耗的时间来度量的。度量方法有事后统计和事前分析两种方法,而人们一般会用后者,在编写程序之前对算法所消耗资源进行估算。
1、时间复杂度的介绍
一个算法的运行时间是=每条语句的执行次数ⅹ该语句执行一次所需要的时间
for(i=0;i<n;i++){ //频度为n+1
for(i=0;i<n;i++){ //频度为n*(n+1)
k=k*2;
}
}
上面代码段的运行时间用含n的函数表示为f(n)=n²+2n+1,
上式函数的同阶函数为n²,
我们用"O"来表示数量级,则T(n)=O(f(n))=O(n²);T(n)即为上述算法的渐进时间复杂度,简称时间复杂度。
2、渐进时间复杂度的求法
大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:
- 用常数1取代运行时间中的所有加法常数。
- 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
3、计算时间复杂度的代码举例(平方阶示例)
int x=0;y=0;
for(k=1;k<=n;k++){
x++;
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
y++;
}
}
对循环语句只需考虑循环体中语句的执行次数,以上程序段中频度最大的语句是第(7)行,其频度为f(n)=n²,所以该算法的时间复杂度为T(n)=O(n²),称为平方阶。
笔者的理解是算法的时间复杂度是由最深层循环内的基本语句的频度f(n)决定的,最深处的语句就是频度最大的语句。
4、时间复杂度排序
时间复杂度T(n)按数量级递增顺序为(从左到右复杂度升高):
三、空间复杂度
时代发展,科技进步,人们都不是很关注空间的占用情况了,因为现在的计算机的存储空间都很大很大。
空间复杂度:算法所需存储空间(寄存器)的量度。
记作:S(n)=O(f(n))
算法所占用的空间包括:
①算法本身所占用的空间:输入输出以及定义的变量等所占用的空间。
②算法要使用的辅助空间。
笔者认为计算空间复杂度是注重在于寻找定义,因为变量是在定义的时候才会被分配空间,在程序中寻找总共分配了多少个空间给变量,空间复杂度就是多少,空间复杂度的差异取决于辅助空间的大小分配,辅助空间分配的多少就能间接的体现出来空间复杂度的大小。
值得注意的是:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
今天的分享就到这啦😉
如果我的文章对您有帮助,
希望可以 “点赞” “收藏” “关注” 一键三连支持一下哦!
想了解更多知识请前往故里♡927的博客
如果以上内容有什么问题,欢迎留言,大家一起学习,共同进步。
我们下期见😉~~