------------------时间复杂度------------------
算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n));例如:
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
c[i][j]=0;//该步骤属于基本操作执行次数:n的平方次
for(k=1;k<=n;++k)
c[i][j]+=a[i][k]*b[k][j];//该步骤属于基本操作执行次数:n的三次方次
}
}
计算时间复杂度的时候,先找出算法的基本操作,然后根据
相应的各语句确定它的执行次数,如:
T(n) = n 的平方+n的三次方。
再找出 T(n) 的同数量级(同数量级有以下:1,log(2)n,n,n log(2)n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n) = 该数量级,则
f(n) = n的三次方。若
T(n)/f(n) 求极限可得到一常数c,则时间复杂度T(n) = O(f(n))。即T(n) = O(n^3) 注:n^3即是n的3次方。
分类:(按数量级递增排列)常见的时间复杂度:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),k次方阶O(n^k),指数阶O(2^n);
------------------空间复杂度------------------
指运行完一个程序所需内存的大小。程序执行时所需存储空间包括以下两部分:
1.固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
2.可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
一个算法所需的存储空间用f(n)表示。S(n)=O(f(n)) ,其中n为问题的规模,S(n)表示空间复杂度。
------------------寻找算法------------------
算法三种基本结构:顺序、条件、循环。一个问题的解决,先模拟过程,找到循环的部分,抓住核心思想,确定变量;把握核心变量/条件,确定循环体的逻辑分支等;最后根据循环体思想套用/确定变量初始值。循环思想-循环体-确定变量-找核心量/条件-循环体分支判断-初值确定-特殊情况处理;
例子:计算器算法:根据循环体,常规思路可能是:算数1、运算符、算数2、计算结果;但是仔细模拟过程发现,算数1、运算符需要,但是算数2和计算结果合为一个更方便,处理数值输入更好;变量确定了,重复循环体,发现”运算符“在算法中起核心作用,运算符是一个个独立体;之前输入各种数字等,一旦运算符A输入了,它的左操作数必须确定,不管是取display还是之前计算而来,而一旦碰到下一个运算符B,B的左运算数必须确定,总是只有一个左操作数+运算符;一旦输入新的运算符,之前的部分计算,变成新的左操作数+运算符。核心量找到了,循环体内的逻辑分支就好写了,判断运算符为空或者不为空的处理,初值处理,一切逻辑清晰了。