算法的基本概念
算法是指解决方案的准确而完整的描述,是一系列解决问题的清晰指令。
研究算法的目的是为了更有效的处理数据,提高数据运算效率。算法是定义在数据的逻辑结构上,但算法具体实现要在存储结构上进行。
算法可以简单的理解为解决问题的方法和它的程序代码实现
用程序代码输出”hello world”也是算法,就像1+1=2是数学一样。
有关算法及其内容导图
算法复杂度
算法的复杂性体现在运行该算法时的占用计算机资源的多少上,计算机最重要的资源是时间(CPU )和空间(内存),因此杂度分为时间和空间复杂度(性)。
复杂度用O(f(n))表示。f(n)表示与需处理的问题规模n相关的关系函数
时间复杂度是指执行算法所需要的计算工作量。也就是:计算机运行一个算法时,程序代码被执行的总次数。
空间复杂度是指执行这个算法所需要的内存空间。
时间复杂度
- 案例
int sum(int n)
{
int value=0; //1
int ii=1; //1
while(ii<=n) //100
{
cvalue=value+i; //100
ii++; //100
}
return value; //1
}
假设n=100,程序将被执行1+1+100+100+ 100+1=303次。
T(n)=O(f(n))=O(3n+3)
(T表示时间time)
时间复杂度关心的是数量级,所以对f(n)函数表达式要简化,原则是:
①略去常数 ②只保留最高阶的项 ③变最高阶项的系数为1
所以最终时间复杂度为:O(n)
如果 f(n)=2n^3+7n
则:T(n)=O(2n^3+7n) O(2n^3)最终为: O(n^3)
所以求时间复杂度,只关心程序代码中最内层循环的次数,即最多的那一个循环次数就可以了。
- 常见的时间复杂度
- 时间复杂度有最好时间复杂度、平均时间复杂度、最坏时间复杂度
比如输入一个数字6范围内的数字,确定这个数字为3,可能一次就可以确定,为O(3)。折半找,平均2次可以确定,O(2)。遍历就3次可以确定,O(3)
空间复杂度
空间复杂度S(n)是指算法消耗的内存空间,也是问题规模(需要处理的数据量) n的函数。S(n)=O(f(n))
S表示space
int sum(int n)
{
int value=0;
int ii=1;
while (ii<=n)
{
value=value+ ii;
ii++;
}
return value;
}
这个函数代码块中,定义了整型变量n、value、ii
如果int占用的内存是4B,所需空间是4+4+4 ,
不管n怎么变,算法所需要的内存空间都是一个固定的常数,空间复杂度为O(1)
int sumt(int n)
{
int ii;
int arrIn];
}
如果int占用的内存是4B,所需空间是4+4+4n , S(n)=O(n)
int sumt(int n)
{
int ii;
int arr1[n];
int arr2[n][n];
}
所需空间是4+4+4n+4n^2 S(n)=O(n^2)
空间复杂度在递归函数里运用起来较为复杂,以后有机会再记录~