时间复杂度与空间复杂度

算法的定义
        对特定问题求解步骤的描述。


时间复杂度
        指算法中所有语句的频度(执行次数)之和。
记为:T(n)=O(f(n))
其中,n是问题的规模;f(n)是问题规模n的某个函数。
表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
常见的时间复杂度
O(1)<O(log_{2}n)<O(N)<O(nlog_{2}n)<O(n^{2})<O(n^{3})<O(2^{n})<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次,则2^{t+1}<n/2,故t=log_{2}(n/2)-1=log_{2}n-2.

时间复杂度T(n)=O(log_{2}n)

举个例子:

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。

该语句内层循环执行了log_{2} n次,外层执行了n次,因此总计执行次数为nlog_{2}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(n^{2})时间复杂度的乘法规则

举个例子:

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))时间复杂度的加法规则
思考题:

如果一个算法的执行次数为3n^{3}+5n,那么该算法的时间复杂度为多少?

时间复杂度是要忽略高阶项系数和低阶项,上面题目的答案是O(n^{3})

空间复杂度

空间复杂度S(n)指算法运行过程中所使用的辅助空间的大小。记为:
                s(n)=O(f(n))
>除了需要存储算法本身的指令、常数、变量和输入数据外,还需要存诸对数据操作的存储单元。
>若输入数据所占空间只取决于问题本身,和算法无关,这样只需分析该算法在实现时所需的辅助单元即可。
>算法原地工作是指算法所需的辅助空间是常量,即O(1)。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值