时间复杂度计算与规模

做题的时候经常会碰到The Time Limit,虽然很多时候知道该算法的复杂度,但是无法判断计算机能不能在题目的时间限制内跑出来,搜集整理了一下,希望有所帮助;
先罗列几种算法(也不能称之为算法)复杂度

1:O(1)

这个应该最省时间的复杂度了吧,顾名思义和 n 没有关系;例如
计算 sum=1+2+3+4+5+…+100;

sum=0;
for(int i=1;i<=100;i++)
{
	sum+=i;
}

2 : O(n)

复杂度为n,根据n的大小而定,栗子:
输入一个数 n ,计算1-n;

sum=0;
for(int i=1;i<=n;i++)
{
	sum+=i;
}

3 : O(n^2)

简而言之嵌套循环

for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
		sum++;

4 :O(logn)

关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多少
算法中log级别的时间复杂度都是由于使用了分治思想,这个底数直接由分治的复杂度决定。
如果采用二分法,那么就会以2为底数,三分法就会以3为底数,其他亦然。
不过无论底数是什么,log级别的渐进意义是一样的。
也就是说该算法的时间复杂度的增长与处理数据多少的增长的关系是一样的。

我们先考虑O(logx(n))和O(logy(n)),x!=y,我们是在考虑n趋于无穷的情况。
求当n趋于无穷大时logx(n)/logy(n)的极限可以发现,极限等于lny/lnx,也就是一个常数,
也就是说,在n趋于无穷大的时候,这两个东西仅差一个常数。
所以从研究算法的角度log的底数不重要。

常见的二分三分这种折半的循环,复杂度都是logn,还有快速幂等等


5 :O (nlogn)

比起logn的复杂度,外面多了一层循环,比如进行n次二分查找计算n个数的快速幂


6:O(n^3)

这个复杂度一般总做题过不了(签到还是可以的),可能是我比较菜,碰见n^3的思路直接放弃;
三重循环;就不写了;


7:O(2^n)

这个复杂度更高,当n超过2^28次方时,1s绝对爆;
例如容斥定理算法:

    for(int i=1;i<(i<<m);i++)
    {
        for(int j=0;j<m;j++)
        {
            if(1&j)
            {
                .....
            }
        }
    }

规模

下面说一下各个复杂度1s可计算数据的规模:(用机房电脑跑出来的,仅供参考)

线性O(n) : 1s 大概 3e8 个数据 当然这只是执行一条语句; 多条语句 最好不要超过 1e8,感觉1e7都勉强了

    int sum=0;
    for(int i=1;i<=300000000;i++)
    {
        sum+=i;
    }

在这里插入图片描述
O(nlogn)
10^5 ~ 5 * 10^5

O(n^2)
1000 ~ 5000

O(n^3)
200 ~ 500

O(2^n)
20 ~ 24

O(n!)
12

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值