C语言OJ上输出超限怎么解决,时间复杂度的计算及其他补充知识

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

时间复杂度

时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。

计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。(来自百度百科)

时间复杂度最重要的一句话也就是上面加粗的这一句。

我们学习算法的目的就是使用算法使解决问题的时间复杂度尽量的小,就对于排序算法来说,排序有许多种方法,对于初学者来说,最简单的就是冒泡排序1

2

3

4

5

6

7

8

9

10

11

12int a[maxn];

int temp,n;

for (j = 0; j < n - 1; j++)

for (i = 0; i < n - 1 - j; i++)

{

if(a[i] > a[i + 1])

{

temp = a[i];

a[i] = a[i + 1];

a[i + 1] = temp;

}

}

可以看出,两层循环的情况下,里面的 if()语句总共运行了n*(n-1)/2次。展开最高项次数为2,因此时间复杂度为O(n^2)。

再看一个判断质数的代码:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19int n,i;

scanf("%d",&n);

for(i=2;i

if(n%i==0){

break;

}

}

if(i==n) printf("is primen");

else printf("isn't primen");

//时间复杂度O(√n) 从因子的角度出发,如果在√n之前没有其他因子,那么之后也不会再有了

for(i=2;i*i<=n;i++){

if(n%i==0){

break;

}

}

if(i==n) printf("is primen");

else printf("isn't primen");

上面就是两个判断质数的时间复杂度的区别。

注意:上述循环中的结束条件( i < n , i * i <=n ) 均与 n 的值有关,在计算复杂度时,我们一般只考虑输入的值对代码时间的影响,比如如下面几个代码:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15int n;

scanf("%d",&n);

for(int i=0;i<100000;i++){

printf("Hello worldn");

}

for(int i=0;i<10000;i++){

for(int j=0;j

printf("Hello worldn");

}

}

while(1){

printf("Hello worldn");

}

这几个代码的时间复杂度均为O(1),因为不管输入为任何值,对这一部分代码的运算不会有任何影响。

所以当我们考虑时间复杂度时,只考虑与输入相关的部分,但在做题时,要考虑这一部分代码对整体时间使用的影响。

然后看接下来的代码:1

2

3

4

5

6

7

8

9//计算n的二进制位数

int n;

scanf("%d",&n);

int sum=0;

while(n>0){

n/=2;

sum++;

}

printf("%dn",n);

这个代码的复杂度为O( log(n) ),其中log的底数一般不写,这是在做题时可能遇到的比较低时间复杂度。

接下来看这个代码:1

2

3while(~scanf("%d",&n)){

printf("%d",n*n);

}

这个代码的时间复杂度为O(1),因为我们前面说过忽略常数的影响,在OJ系统中,如果说多组输入,那么我们在计算复杂度时只需要考虑单组的时间复杂度。

但是这个代码:1

2

3

4

5

6int t,n;

scanf("%d",&t);

while(t--){

scanf("%d",&n);

printf("%dn",n*n);

}

这个代码的时间复杂度为O( t ),因为 t 是一个输入的变量,是可以改变的变量,所以我们在计算时间复杂度是需要计算上 t 对代码的影响。

虽然有些代码时间复杂度并不高,但在做题时,如果常数比较大,那么在写代码时仍要注意常数给代码带来的影响。

一般情况下,OJ评测机的每秒运算次数大概为 1e8~1e9 次。

空间复杂度

空间复杂度和时间复杂度是相对应的,空间复杂度为输入的变量对空间的要求,一维数组为O( n ) ,二维数组为O(n^2)或O(n*m)等多种形式,一般情况下,代码的数组大小最好在1e8之下,否则,内存就会超限,导致虽然代码正确,但是并不通过的情况发生。

OJ常见评测结果

Accepted

答案正确!多么完美的返回结果!

####

Wrong Answer

答案错误!一定是评测机坏了!本地对了就是对了,OJ上错误说明OJ肯定有问题!

Compile Error

编译错误。语言不小心选错了?哦,少复制了一点代码。 [email protected]

Time Limit Exceed

时间超限。一定是评测机太慢了!

Memory Limit Exceed

内存超限。扣死了,内存都不会弄多点,这点内存都不舍得给我!

Presentation Error

格式错误。不就多个空格,多个换行吗,又看不见那些字符,真是小心眼!

System Error

系统错误。辣鸡评测机,辣鸡OJ!

Output Limit Exceed

输出超限。我不是怕你看不懂吗,多输出点给你解释一下我的答案嘛!

Runtime Error

运行错误。不就不小心除以零了嘛,就当我又创造了一门数学嘛!啊?数组下标越界了?我就是放这个变量出去数组外面玩了一会嘛。

在刷题的足够多之后,一些超限问题或者运行错误等就会减少,剩下的就只有(听取)WA(声一片)了。哈哈哈哈哈。

常见刷题OJ

杭州电子科技大学 ( 杭电 ) OJ : acm.hdu.edu.cn ( 第11页之后有大量中文题目 )

codeforces : codeforces.com (一起来肝cf啊!)

洛谷:luogu.org

vj : vjudge.net (Virtual Judge,可以在这里创建比赛)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值