算法的定义:
对特定问题求解步骤的描述。
时间复杂度
指算法中所有语句的频度(执行次数)之和。
记为:T(n)=O(f(n))
其中,n是问题的规模;f(n)是问题规模n的某个函数。
表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
常见的时间复杂度
O(1)<O()<O(N)<O()<O()<O()<O()<O(n!)
高阶数越小说明算法的性能越好。
举个例子:
int su=0; //执行一次
sum=n*(n+1)/2 //执行一次
printf("%d",sum); //执行一次
算法的执行次数等于3
时间复杂度为T(n)=O(1)
表示不会随n的增长而增长。
举个例子:
int x=2;
while(x<n/2)
x=2*x;
执行频率最高的语句为“x=2*x”。
设该语句共执行了t次,则<n/2,故t=-1=.
时间复杂度T(n)=O()
举个例子:
int sum=0,i=1;
while(i<n)
{
sum=sum+i;
i++;
}
printf("%d",sum);
执行频率最高的语句是while循环体中的代码
一共执行n次
时间复杂度T(n)=O(n)
举个例子:
int i,x=2;
for(i=0;i<n;i++)
{
x=0;
while(x<n/2)
x=2*x;
}
执行频率最高的语句是 x=2*x。
该语句内层循环执行了次,外层执行了n次,因此总计执行次数为
举个例子:
int i,j;
for(i=0 ; i<n;i++)
{
for(j=0;j<m;jt+)
sum=sum+1;
}
对于外层循环,相当于内部时间复杂度为O(m)的语句再循环n次。所以时间复杂度T(n)=O(mxn)
如果m=n,则时间复杂度T(n)=O()时间复杂度的乘法规则
举个例子:
int sum1=0,sum2=0,i,j;
for(i=0 ; i<n ; i++)
suml=sum1+i;
for(j=0;j<m;j++)
sum2=sum2+j;
printf ("%d,%d", sum1 , sum2 );
两个循环没有嵌套,串行执行。所以时间复杂度T(n)=O(n)+O(m)
取最大的,即时间复杂度T(n)=max(O(n)+O(m))时间复杂度的加法规则
思考题:
如果一个算法的执行次数为3+5n,那么该算法的时间复杂度为多少?
时间复杂度是要忽略高阶项系数和低阶项,上面题目的答案是O()
空间复杂度
空间复杂度S(n)指算法运行过程中所使用的辅助空间的大小。记为:
s(n)=O(f(n))
>除了需要存储算法本身的指令、常数、变量和输入数据外,还需要存诸对数据操作的存储单元。
>若输入数据所占空间只取决于问题本身,和算法无关,这样只需分析该算法在实现时所需的辅助单元即可。
>算法原地工作是指算法所需的辅助空间是常量,即O(1)。