算法时空复杂度分析

目录

1.时间复杂度             2.空间复杂度          3.常见的算法复杂度 

4.相关典型例题         5.总结


 

1.时间复杂度

  • 概念

       在ACM范围里,我们只需了解时间复杂度可以大致地通过一个算法运算的次数来描述程序运行的效率,常常用大写字母O来表示。在表示时间复杂度的时候,只保留数量级最大的一项,并忽略系数。

  • 举个栗子

       对于给定的常数N ,若某一个算法计算的次数是3N^3 + N^2 + 10^5则我们可以认为它的时间复杂度为0(N^3)。只考虑最高次。

2.空间复杂度

  • 概念

顾名思义就是用来衡量内存的占有量的。除了计算复杂度,我们常常也需要直接算出来运行程序需要占用多少内存。

  • 单位换算

1G=1024MB           1MB = 1024KB          1KB = 1024B         1B (byte,字节)=8b (bit, 比特).

  • 常见数据类型

char/ bool.  1B          short. 2B               int/float/long. 4B          long long/double. 8B

ps:在不同的系统占的字节不同。如果忘记数据类型占用的内存,可用sizeof函数测出占用多少字节。
 

3.常见的算法复杂度

    1)常数阶:O(1)                                     2)对数阶:O(logN)                       3)线性阶:O(N)

    4)线性对数阶:O(N*logN)                    5)平方阶:O(N^2)                         6) 立方阶:O(N^3) 

 4.相关典型例题

(1) 求阶乘之和。

以下只列出求阶乘之和的代码。

  • 常规解法:时间复杂度很大。

  •  巧妙解法:时间复杂度小且简洁。利用的是:后一个数的阶乘等于前一个数的阶乘乘以后者的阶乘。

(2)

  •  巧妙思路:

我们记录下每个地毯的信息,对于(x,y),我们在n个地毯中倒序查找,如果满足在某个地毯内,那,我们就找到它了。时间复杂度:O(n),空间复杂度:O(n) 。

#include<iostream>
using namespace std;
struct Node{
	int a,b,w,h;
}node[100005];
int main()
{
	int x,y,n,state=0;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>node[i].a>>node[i].b>>node[i].w>>node[i].h;
	cin>>x>>y;
	for(int i=n;i>=1;i--)
		if(x>=node[i].a&&x<=node[i].a+node[i].w&&y>=node[i].b&&x<=node[i].b+node[i].h){
			cout<<i<<endl;state=1;break;
		}
	if(state==0)cout<<-1<<endl;
        return 0;
}

5.总结

  • 时间复杂度
  • 空间复杂度
  • 复杂度的优化思路——时间换空间,空间换时间
  • 计算机每秒运行的上限——一般10^8次
  • 相关内存的换算
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值