> 寒假复习计划——C语言篇
Day 1——算法(Algorithm)
1.什么是算法?
算法(Algorithm):是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作解决问题具体的方法和步骤。
例如:我们可以把所有的算法想象为一本“菜谱”,特定的算法比如菜谱中的的一道“老醋花生米”的制作流程,只要按照菜谱的要求制作老醋花生米,那么谁都可以做出一道好吃的老醋花生米。so,这个做菜的步骤就可以理解为:“解决问题的步骤”
###2.算法的特征:
算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。此外,一个算法还具有下列5个重要特性:
1) 有穷性
一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。
2) 确定性
算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。即对于相同的输入只能得出相同的输出。
3) 可行性
一个算法是可行的,即算法中描述的操作都是吋以逋过已经实现的基本运算执行有限次来实现的。
4) 输入
一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。
5) 输出
一个算法有一个或多个的输出,这些输出是同输入有着某种特定关系的量。
通常设计一个“好”的算法应考虑达到以下目标:
正确性:算法应当能够正确地解决求解问题。
可读性:算法应当具有良好的可读性,以助于人们理解。
健壮性:当输入非法数据时,算法也能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。
效率与低存储量需求:效率是指算法执行的时间,存储量需求是指算法执行过程中所需要的最大存储空间,这两者都与问题的规模有关。
3.如何选择合适的算法?
解决问题的方式方法有好坏之分,因此算法也就有好坏之分。算法性能的好坏并不会因为选取的语言的不同的而存在出入。
因此,引入评价算法性能的方式,也就是时间复杂度和空间复杂度。
时间复杂度:主要通过对算法的时间复杂度数量级进行分析、衡量。
空间复杂度:一般情况下只是去看是否有借助外部存储。
1.) 时间复杂度:
(1)进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而确定T(n)的数量级。算法的时间复杂度记作:T(n)=O(f(n))。这表示随着问题规模n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。
(2)我们用O()来体现算法时间复杂度的记法,称作大O记法。
推导大O阶:
1.用常数1取代运行时间中的所有加法常数。
2.在修改后的运行次数函数中,只保留最高阶项。
3.如果最高阶项存在且不是1,则删除与这个项相乘的常数。
得到的结果就是大O阶。
(3)常见的时间复杂度:
常用时间复杂度所耗费的时间从小到大排序:
Ο(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环语句,其时间复杂度就是Ο(1)。其中Ο(log2n)、Ο(n)、 Ο(nlog2n)、Ο(n2)和Ο(n3)称为多项式时间,而Ο(2n)和Ο(n!)称为指数时间。计算机科学家普遍认为前者(即多项式时间复杂度的算法)是有效算法,把这类问题称为P(Polynomial,多项式)类问题,而把后者(即指数时间复杂度的算法)称为NP(Non-Deterministic Polynomial, 非确定多项式)问题。
循环的时间复杂度=循环体的复杂度*循环运行次数。
(4)常用的算法的时间复杂度和空间复杂度
一个经验规则:其中c是一个常量,如果一个算法的复杂度为c 、 log2n 、n 、 n*log2n ,那么这个算法时间效率比较高 ,如果是2n ,3n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。
2.)空间复杂度:
算法完成其执行所需的计算机存储器的总量
说白了,就是程序执行所需要的内存空间:
指令空间:用于存储已编译版本指令的内存量。
环境堆栈:在函数调用时存储部分执行函数信息的内存量。
数据空间:用于存储所有变量和常量的内存量。