一次由 System.out.println() 引起的 MLE&TLE

C++-时间复杂度 在C++中,常见的时间复杂度包括常数级别O(1)、对数级别O(logn)、线性级别O(n)、平方级别O(n2)、立方级别O(n3)等。其中,常数级别是最快的,而立方级别是最慢的。当然,在实际应用中,我们需要选择合适的算法来降低时间复杂度。在竞赛中,一般算机一秒能运行。立方级别:通常是三层嵌套循环的形式,所需计算时间随着问题规模的增加呈立方级别增长。平方级别:通常是嵌套循环的形式,所需计算时间随着问题规模的增加呈平方级别增长。线性级别:随着问题规模增加,所需计算时间也呈线性增长,如遍历一个数组等。 阅读详情

莫名其妙 MLE

  笔者并非 ACM 选手,但是由于最近备考 CCF 认证需要练练手,笔者是忠实的 Java 选手,于是就打算使用 Java 进行考试。随机到一道题 P5461 赦免战俘,看题第一感觉就是递归处理,不出意外的成功写出了递归解法,然后高高兴兴的就在 OJ 上提交,然后就是莫名其妙的 MLE。

原始代码:

// 递归函数
public static void f(int[][] a, int x1, int x2, int y1, int y2) {
	if (x2-x1==1 && y2-y1==1) {
		a[x1][y1] = 0;
		return;
	} else {
		for (int i = x1; i <= (x2-x1)/2+x1; ++i) {
			for (int j = y1; j <= (y2-y1)/2+y1; ++j) {
				a[i][j] = 0;
			}
		}
		f(a, (x2-x1)/2+x1+1, x2, y1, (y2-y1)/2+y1);
		f(a, x1, (x2-x1)/2+x1, (y2-y1)/2+y1+1, y2);
		f(a, (x2-x1)/2+1+x1, x2, (y2-y1)/2+1+y1, y2);
	}
}

第一次尝试结果:
在这里插入图片描述

第一次思考

  因为使用的是 int 类型的二维数组,而题目明确只需要存储 0 和 1。于是理所当然的想到将 int[ ][ ] 改为 byte[ ][ ],于是进行第二次尝试。

第一次改进代码:

// 更改后的递归函数
public static void f(byte[][] a, int x1, int x2, int y1, int y2) {}

第二次尝试结果:
在这里插入图片描述

第二次思考

  第二次尝试仍然没有解决问题,证明问题不是出在那里,看来得另辟蹊径了。 难道是递归深度太深导致爆内存? 于是决定改进算法,仔细观察题目给出样例,发现数据有规律,类似于杨辉三角,数据依赖于该数上方和右上方的数(eg. a[2][3] = (a[1][3] + a[1][4]) % 2,也就是不进位的加法,可以使用异或优化计算,所以可以优化为 a[2][3] = a[1][3] ^ a[1][4]),于是将原有代码全部推倒从头再来,经过一番努力终于完成新算法,于是进行第三次尝试。

第二次改进代码:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		byte[][] a = new byte[2048][2048];
		n = (1<<n); // 等价于 n = Math.pow(2, n); 
		a[0][n+1] = 1;// 需要一个初始化数
		
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= n; ++j) {
				// 等价于 a[i-1][j] = (a[i-1][j] + a[i-1][j+1]) % 2;
				a[i][j] = (byte)(a[i-1][j] ^ a[i-1][j+1]);
				System.out.printf("%d ", a[i][j]);
			}
			System.out.println();
		}
		in.close();
	}
}

第三次尝试结果:
在这里插入图片描述

第三次思考

  如此简洁的代码怎么可能 MLE 呢?数组占用内存很小,计算使用位运算优化,没道理会 MLE,唯一可能的就是 IO 产生的内存占用了,于是开始测试自己的想法,每次输出完后调用 System.gc(); 处理一下垃圾。

第三次改进代码:

for (int i = 1; i <= n; ++i) {
	for (int j = 1; j <= n; ++j) {
		a[i][j] = (byte)(a[i-1][j] ^ a[i-1][j+1]);
		System.out.printf("%d ", a[i][j]);
	}
	System.out.println();
	System.gc();// 测试是否 IO 引起的爆内存
}

第四次尝试结果:
在这里插入图片描述

第四次思考

  可以发现 MLE 的问题解决了,证明确实是 IO 引起的爆内存,但是由于 System.gc(); 消耗时间太多又导致了 TLE,于是决定控制 System.gc(); 先把题目 AC 了再说。但是经过多次调试都无法平衡时间和空间,要么 TLE 要么 MLE。

第五次尝试结果:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第五次思考

  无法取巧通过测试,就只能另辟蹊径了,突然想到输出文件的时候都需要一个缓冲区,平时都没怎么注意这个问题,存在即合理,官方这么做必要有它的道理。于是查看源码以及搜集资料。
  发现 System.out.println(); 是一个同步方法,有一定的开销,在高并发的情况下,会严重影响性能,但这并不是主要问题。更多的是添加字符到缓冲区和打印的开销,这才是导致我的代码 MLE 的原因,因为我的代码每次只输出一个数字,而且产生很多次调用,产生极大开销。于是决定改用缓冲区暂存输出结果,最后输出结果。

使用 PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
代替 System.out.println();

最终代码:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(new BufferedInputStream(System.in));
		PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
		int n = in.nextInt();
		byte[][] a = new byte[2048][2048];
		n = (1<<n);
		a[0][n+1] = 1;
		
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= n; ++j) {
				a[i][j] = (byte)(a[i-1][j] ^ a[i-1][j+1]);
				out.append(Byte.toString(a[i][j]));
				out.append(" ");
			}
			out.append("\n");
		}
		out.flush();
		out.close();
		in.close();
	}
}

最终结果:
在这里插入图片描述

总结

  • 使用 System.out.println() 进行标准输出时,开销较大,不适合频繁调用。
  • 同理,Scanner(System.in) 也不适合频繁调用(一次由 Scanner(System.in) 引起的 TLE)。
  • 频繁输入调用使用 StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  • 频繁输出调用使用 PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
  • 可手动调用 flush() 方法输出缓冲区,但是过于频繁的调用也有可能引发 TLE。
  • 一般情况下,使用传统的 System.out.println(); 我觉得足以应付,遇到频繁输出时再使用改进方法。当然为了防止输出问题导致 TLE&MLE 的话,可以直接使用 PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out)); 记得在最后调用 flush() 方法清空缓冲区,不然会输出不了结果。
  • 最后记得关闭输入输出流,养成一个好习惯,这样即使忘记清空缓冲区,也会因为关闭输出流而自动清空缓冲区。
详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解 最大似然估计(Maximum likelihood estimation, 简称MLE)和最大后验概率估计(Maximum a posteriori estimation, 简称MAP)是很常用的两种参数估计方法,如果不理解这两种方法的思路,很容易弄混它们。下文将详细说明MLE和MAP的思路与区别。 但别急,我们先从概率和统计的区别讲起。 概率和统计是一个东西吗? 概率(probabilty)和统... 阅读详情

相关推荐

ADS仿真设计平行定向耦合器学习笔记

ADS仿真设计平行定向耦合器

qq_36521926的博客 1万+

浅讲递归

递归的定义 递归就是指在函数的定义中使用函数自身的方法。 优点 递归可以把问题变得更简单,让路径更为清晰,使代码更为简洁明了。 递归的思想 就是有来有回,它和循环不一样,循环一旦开始就不会回头,到了某个条件时,循环会跳出。但是递归是到了某个条件时会再走回去,并不会立即结束。 如下面这张图,我们可以很明了的知道递归的基本思想。 注意 在我们使用递归时,我们必须明确终止条件,要不然他就会无线“递”下去,就买办法回来了。 可以使用递归的问题 1,阶乘; 2,斐波那契数列; 3,杨辉三角; 4,回文字符串的判断;

qq_45709386的博客 231

【机械臂算法】基于最小惯性参数集的动力学辨识仿真实践

本文深入探讨了机械臂动力学参数辨识的核心挑战与解决方案,重点阐述了基于最小惯性参数集的理论与方法。通过分析PUMA560实例,详细介绍了利用QR分解法或符号推导法获取可辨识参数集,并系统讲解了从激励轨迹设计、仿真数据采集、线性系统求解到模型验证的完整实践流程,为高精度动力学建模与控制奠定了坚实基础。

weixin_29054399的博客 376

c++算法之递归

1.确保递归一定能到递归出口,避免无限递归,这可能导致TLE(超时)、MLE(超内存)或RE(运行错误)。递归函数的一个条件,当满足该条件时,递归终止,避免无限递归。递归函数中的语句,用于解决规模更小的子问题,再将子问题的答案合并成为当前问题的答案。在for循环中for(i=1;首先,初始状态a[1]=n,拿n=6来说,dfs(2)进入后。2、适用于问题的规模没有明显的缩减,或者需要特定的迭代次数。输入n,求F(n),n<100000,结果对le9+7取模。n>3时F(n)=F(n-1)+F(n-2)

weixin_63201442的博客 952

EPLAN中3D宏文件的创建与优化技巧(以开关电源为例)

本文以开关电源为例,详细讲解了在EPLAN中创建和优化3D宏文件(.ema)的全流程。从搭建宏项目、导入模型,到精确定义安装面、调整视野方向,再到定义3D连接点并关联部件库,旨在帮助电气工程师在设计阶段实现精准布局、避免安装冲突,从而提升设计效率与质量。

weixin_29219539的博客 547

从零开始:如何用Python手绘波特图并分析电路稳定性

本文详细介绍了如何使用Python绘制波特图并分析电路稳定性,涵盖从基础理论到实际应用的完整流程。通过NumPy和Matplotlib实现频域分析,包括RC低通滤波器和RLC带通滤波器的案例,以及相位裕度计算等高级技巧,为电子工程师提供了一套高效的电路分析解决方案。

hhh00的博客 370

信息学竞赛中AC、WA、RE、CE、TLE、MLE、PE、OLE、分别什么意思

信息学竞赛中AC、WA、RE、CE、TLE、MLE、PE、OLE、分别什么意思 ‌AC Accepted 答案正确/通过 ‌WA Wrong Answer 答案错误 RE Runtime Error 运行时错误 这表明你的程序在运行过程中因为出锅而崩溃了,通常可能是访问非法内存等问题,出现这个提示但你还能过样例的话,大概率是数组没开够,仔细检查一下。 CE Complie Error 编译错误 这表明你的程序没有通过编译。如果在本地编译可以通过的话,检查一下提交语言是不是选对了或是有没有引用一些不该引用的东

Annie_bing的博客 4万+

Docker 磁盘占用过多问题处理过程记录

Docker 磁盘爆满问题处理

MR.骑士道 3553

最大似然估计程序c语言,萌新笔记——Cardinality Estimation算法学习(二)(Linear Counting算法、最大似然估计(MLE))...

在上篇,我了解了基数的基本概念,现在进入Linear Counting算法的学习。理解颇浅,还请大神指点!它的基本处理方法和上篇中用bitmap统计的方法类似,但是最后要用到一个公式:说明:m为bitmap总位数,u为0的个数,最后的结果为n的一个估计,且为最大似然估计(MLE)。那么问题来了,最大似然估计是什么东东?好像在学概率论的时候听说过,于是又去搜索了一下MLE的信息。MLE:(此处不使...

weixin_31953847的博客 785

【传感器模块项目实战】自动驾驶/机器人相关传感器原理及标定

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、IMU二、相机三、激光雷达四、轮速里程计五、GPS/RTK六、毫米波雷达总结 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对**【自动驾驶相关传感器原理及标定】**做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、IMU IMU惯导系统的特性(imu_calc函数功能) IMU运行的

qq_35635374的博客 1231

C# 上位机高级功能实战:报警、历史回放与远程监控

本文介绍了工业上位机系统的高级功能实现,主要包括实时报警机制、历史数据回放和远程监控三部分。报警功能通过阈值检测实现异常提醒;历史回放利用数据库存储数据,通过定时器控制回放进度;远程监控提供TCP、WebSocket等多种数据传输方式。文章还给出了综合优化建议,如异步处理、报警去抖动等,最终形成一个包含数据采集、显示、存储、报表及高级功能的完整工业自动化闭环系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 750

【转】ACM各种WA的说明及可能的原因

转载地址:ACM各种WA的说明及可能的原因_ROOM-优快云博客_mle的原因 1、答案错误 ——wrong answer 就是最常见的。这个没办法,基本是程序有些细节的点没有考虑到。 2、运行错误 ——Runtime Error 大致两种情况 1、是数组开太小,要存的数据太大,数组调大就OK了。 2、是数组发生越界操作,基本上是程序执行时访问到了不该访问的地方,程序问题了。 3、格式错误 ——presentation error 非常接近AC了。空格或者回车多输或者少输了。看题意再检查下..

weixin_51472673的博客 1206

备战2025数学建模国赛(算法46):多目标优化

本篇博客将深入浅出地介绍多目标优化的核心概念、主流算法,并重点结合一个数学建模竞赛的经典案例,提供完整的Python代码实现,助你在未来的竞赛中游刃有余。它通过寻找帕累托最优解集,完美地诠释了“鱼与熊掌不可兼得”的权衡思想,为最终决策提供科学依据。这些问题都包含多个相互冲突的目标,传统的单目标优化方法(如梯度下降、单纯形法)对此无能为力,因为它们无法同时优化多个目标。在数学建模竞赛中,我们面临的绝大多数问题都不是单一的“最好”,而是充满权衡与妥协的“最优”。记住,成功的建模不仅在于解出问题,更在于清晰地。

YOLO 284

*分享-神奇的MLE原因-为什么结构体开的内存不大却MLE?用数组开更大还能ac???

今天写了一道题,ac之后想看一下我的代码数据量最大可以开到多少。 出乎意料的是,我把结构体数据稍开大一点就MLE??? 非常不解,在网上找了别人的代码测试一下,结构就出现了下面的情况。 ps:xjb数组是测试用的,没啥用。。。但是居然还是ac了。 十分不解。虽然说知道结构体是内存对齐储存。 但是也不应该出现这种情况呀??第二段代码开longlong都没事啊? 大佬说可...

打过ICPC/CCPC,学习ACM算法,Linux内核,Openharmony,加油努力开心珍惜 7653

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++常见错误

这一结果的可能性非常多,常见的有段错误(直接的原因时非法访问了内存,例如数组越界,指针乱指),浮点错误(例如除数为0,模数为0),递归爆栈(一般由递归时层数过深导致的)等。一般来说,需要先检查数组大小是否比题目的数据范围大,然后再去检查可不可能有特殊数据可以使除数或者模数为0,有递归的情况则检查是否在大数据时递归层数太深。如果程序输出了过量的内容(一般是指过量非常多),那么就会返回OLE。每道题目都有规定程序使用的空间上限,因此如果程序中使用太多的空间,则会返回MLE,例如数组太大一般最容易导致这个结果。

ny_zhy_sort的博客 1303

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java 解决运行超时TLE,MLE,从入门到入坑完整版

1、用BufferedReader替换Snanner作为输入 class Reader { static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer tokenizer = new StringTokenizer(""); static String nextLine() throws IOException{// 读取下一行字符串 retu

double_app_le的博客 2391

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

刷题术语简称:OJ、AC、WA、TLE、OLE、MLE、RE、PE、CE分别代表的意思

刷题术语简称:OJ、AC、WA、TLE、OLE、MLE、RE、PE、CE分别代表的意思

weixin_51916266的博客 8904

信息学竞赛中常用名词

信息学竞赛中AC、WA、RE、CE、TLE、MLE、PE、OLE、分别什么意思。

厚积而薄发 4383

一些导致 WA/MLE/TLE 的坑点

本文总结了几个算法竞赛中常见的错误与优化技巧:1.避免使用pow函数计算快速幂以防精度问题;2.节点数多时应使用链式前向星而非vector存图防MLE;3.bool类型不能用%d输入;4.关闭同步流时避免使用递归快写函数;5.注意点双和边双处理时的特殊要求;6.警惕自增运算符在复杂表达式中的使用顺序问题。这些经验教训来自洛谷多道题目的WA/TLE/MLE测试案例。

Bree0307的博客 717

C++中AC、WA、RE、CE、TLE、MLE、PE、OLE的意思

这表明你的程序所调用的内存大小超出了测试点的内存限制,可能是算法的空间复杂度不是很优秀,要优化!可能是访问越界,除以0,或者是非void类型的函数没有返回值。那就是时间复杂度超出了题目限制,需要优化,或者是进入死循环了。那就是你的语法错误了,要在编译器中运行一下。没什么好说的,修改一下格式,按照题目要求。这我没遇到过,应该也是死循环。请各位大佬为我提出建议!这张图片可以让你秒懂AC。

sbsbsbnc的博客 1108

【心得:平衡选根+释放内存】由于深搜单链导致MLE的微优化

补充 该做法只是一个对堆栈内存的微优化,最多也只能节省 n2\frac{n}{2}2n​ 个 堆栈单位的临时储存空间。 如果不是 nnn 到了 1e61e61e6 级别然后差 2∼5Mb2\sim 5Mb2∼5Mb 而 MLEMLEMLE 的话,该优化效果差别不大。 当然也有评测机玄学的因素。。 题目 【题目】[POI2006]MET-Subway 就是给你一个 nnn 节点的树,用 lll 条路径最多覆盖多少个点? 这题之前不是做过吗?再写一遍练练手啥的… 【范围】 1≤k≤n≤1061\le k

溢流眼泪的博客 836

C++手写非线性优化方法: GN & LM & DL,对比测试

C++实现非线性优化方法,高斯牛顿法GN和列文伯格-马夸尔特法LM、狗腿法DL

啥也不懂的研究生也淦SLAM的博客 1744

C++基础六:C++入门知识、黑盒测试(详解)与复杂度

C++基础六:C++入门知识、黑盒测试(详解)与复杂度

weixin_63026364的博客 1096

针对于MLE和MLP的代码例子实现

在机器学习和模式识别中,极大似然估计和最大后验概率都对于其理解起到了很大的作用。本文建立在文中给出博客文章的基础上,通过python实现了文中所给例子,对于其理解有一定的作用。

m0_50845934的博客 511

洛谷 P1003 [NOIP2011 提高组] 铺地毯 (如何解决MLE?)

洛谷 P1003 [NOIP2011 提高组] 铺地毯 (如何解决MLE?)

Sonaldo的博客 485

c++查看程序静态内存

由于CSPCSPCSP最有把握也是期望得分最高的一道题因为MLEMLEMLE挂零了,所以学了一手如何查询程序静态内存 在所有变量定义之前先设定一个charcharchar类型变量,此时指向的地址就是程序最开头的内存地址,同理在最后也设定一个,指向所有变量之后存储的内存地址,两个地址相减得到了占用的内存字节。一般看程序内存都是MMM为单位,所以转换一下/1024/1024/1024/1024/1024/1024就好了。 #include <bits/stdc++.h> using namespa

Young_Zn_Cu 903
上一篇: 听说这玩意可以验证消息完整性 —— 消息认证码(MAC)
下一篇: 一次由 Scanner(System.in) 引起的 TLE
ali48
博客等级 码龄6年 31粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值