debug指南-基础bug
基础Bug
本章节主要阐述一些最基本的bug。
虽然这些bug看起来很弱智简单,但正是因为这些小bug,让我们调代码的时间增加至少 \(2,3\) 个小时。
本系列的宗旨就是综合这些小bug极其对应解决方案,让bug的阻碍尽量减小。
测评结果
测评结果其实并不算Bug,但这些多样的测评结果了解他们能够更好地了解Bug的种类,进而更快地找出Bug,瞬切此题。
- WA
WA,全称 Wrong Answer,是最为常见的一种错误。
最为常见的引发方式就是输出文件与答案文件不符,随便改一下代码,或者代码实现错误就出来了。
除此之外,也可能是因为空间越界、没有初始化导致的错误。
- TLE
TLE,全称 Time Limit Exceeded,超时。
一般是因为算法时间复杂度过大导致。
也有的是因为空间越界、输入文件未及时终止、常数过大导致。
- MLE
MLE,全称 Memory Limit Exceeded,内存超限。
一般是因为使用空间过大导致。
也有访问越界导致的可能。
- RE
RE,全称 Runtime Error,一般是因为访问越界、访问未定义位置导致。
值得一提的是,在CCF的本地测试中,RE一般会与MLE一同出现。
- CE
CE,全称Compile Error,编译错误,最不用说的错误,跟着编译器指引就能改好。
(若有欠缺,欢迎补充)
基本算法中的常见Bug
1.位运算
- 左/右移一个负数。
一般会RE。
- (1<<63) 爆 long long!(1<<31) 爆 int!
十年OI一场空,不开 long long 见祖宗,祖训自然不用说。
2.递推
- 空间开小了。
很常见的错误。
- 递推式错误。
推式子是个很艰难的过程。
- 递推数组越界
设递推式 \(s_i=s_{i-k}+i\),若 \(i-k<0\) 时则会越界,容易RE。
3.递归
- 递归爆栈
两种情况:
第一种,代码无误但大样例测试RE。
这个不是代码author的问题。
如果没有重定义栈空间大小,而有一个 \(10^5\) 级别的大数据,这时,你的本地测试大概率将会RE,但提交测试时没有问题。
第二种,开大栈空间后仍然RE
此时就是本地代码实现的问题了。
- 无限递归
考虑以下递归函数:
int solve(int l,int r,int x) {
int mid=l+r>>1;
return x<=mid?solve(l,mid,x):solve(mid,r,x);
}
当 \(l=r=x\) 时,会不断重复进入 \(solve(l,mid,x)\) 范围内,由于此时 \(mid=(l+r)/2=l*2/2=l=r\),故此时仍然在 \(solve(l,r,x)\)。成功死循环。欧耶!
- 递归中不合法
简单来说就是从一开始正常,到后面就会出现一些难以控制的情况,最后可能会导致RE等后果。
很难举例,无限递归就是其中一种。
3.二分
- 二分边界问题
很常见的情况,但掌握常见算法模板即可免除。
4.排序
cmp判定错误
排序边界错误
sort(a+1,a+n+1);//这个排的是 [1,n]
sort(a,a+n)//这个排的是[0,n)
0.其他常见问题
- 输入问题
请看这题:
给你两个长度分别为 \(n,m\) 的序列,分别输出他们的和。
正确代码:
int n,m,a[100010],b[100010];
int main() {
cin>>n>>m;int sum1=0,sum2=0;
for(int i=1;i<=n;++i) cin>>a[i],sum1+=a[i];
for(int i=1;i<=m;++i) cin>>b[i],sum2+=b[i];
cout<<sum1<<" "<<sum2<<"\n";
}
你可能是写成了:
int n,m,a[100010],b[100010];
int main() {
cin>>n>>m;int sum1=0,sum2=0;
for(int i=1;i<=n;++i) cin>>a[i],sum1+=a[i];
for(int i=1;i<=n;++i) cin>>b[i],sum2+=b[i];//m个数写成了n个。
cout<<sum1<<" "<<sum2<<"\n";
}
值得一提的是,这个问题经常出现在图论中,点数和边数搞反。
- 唐氏循环
for(int i=1;i<=n;--i)
for(int i=n;i>=1;++i)
while(n) {
//... (没写减少n的操作)
}
- 非 void 函数有返回值。
编译没问题,但提交可能莫名出现RE等其他问题。
- 精度误差
很唐氏玄学。
这么说吧,有的题要开 long double ,但有的题开 long double 反而过不掉。
- 数组问题
int a[100];
int main() {
for(int i=1;i<=100;++i) cin>>a[i];
}
对于一个数组,若:
int a[N];
那么 \(a\) 数组的下标访问边界是 \([0,N)\)。没错,访问 \(a[N]\) 是不合法的。
debug指南-基础bug的更多相关文章
- 【转】Spark性能优化指南——基础篇
http://mp.weixin.qq.com/s?__biz=MjM5NDMwNjMzNA==&mid=2651805828&idx=1&sn=2f413828d1fdc6a ...
- D3D11 Debug Layer的bug
在开发D3D应用程序时,我们会使用Debug Layer来调试应用程序,以确保我们的程序在最终发布时没有warnings和errors.不过最近在开发应用程序时遇到了这样的问题,就是我把多个网格模型的 ...
- Spark性能优化指南——基础篇
本文转自:http://tech.meituan.com/spark-tuning-basic.html 感谢原作者 前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一 ...
- H5活动产品设计指南基础版
本文来自 网易云社区 . H5一般页面不会很多,看似简单,实际上会有很多细节需要注意,我自己在做过了几个H5之后,发现了一些常犯的问题,做了小结,希望给新开始做H5的产品相关的同学提供一些帮助. 首 ...
- Spark性能优化指南——基础篇(转)
[转]Spark性能优化指南——基础篇 http://mp.weixin.qq.com/s?__biz=MjM5NDMwNjMzNA==&mid=2651805828&idx=1&am ...
- 0803-PyTorch的Debug指南
0803-PyTorch的Debug指南 目录 一.ipdb 介绍 二.ipdb 的使用 三.在 PyTorch 中 Debug 四. 通过PyTorch实现项目中容易遇到的问题 五.第八章总结 py ...
- 【转载】 Spark性能优化指南——基础篇
转自:http://tech.meituan.com/spark-tuning-basic.html?from=timeline 前言 开发调优 调优概述 原则一:避免创建重复的RDD 原则二:尽可能 ...
- Spark性能优化指南——基础篇(转载)
前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...
- Spark性能优化指南——基础篇转
前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...
- Spark性能优化指南--基础篇
前言 开发调优 调优概述 原则一:避免创建重复的RDD 原则二:尽可能复用同一个RDD 原则三:对多次使用的RDD进行持久化 原则四:尽量避免使用shuffle类算子 原则五:使用map-side预聚 ...
随机推荐
- [nRF24L01+] 3. Radio Control 无线电控制
3. Radio Control 无线电控制 nRF24L01+可以配置为:power down, standby, Rx/Tx mode 3.1. 无线控制状态图 当VDD电压大于1.9V时,进入上 ...
- 为什么使用#define 而不是用enum定义常量
typedef enum { IOTAG_PORT__A = (0), IOTAG_PORT__B, IOTAG_PORT__C, IOTAG_PORT__F, IOTAG_PORT__ITEMS } ...
- 手把手教你ubuntu下移植MJPG-streamer
一.嵌入式视频图像开源库 在嵌入式系统中,常用的视频图像处理开源系统有:luvcview.cheese.motion.mjpg-streamer或者ffmpeg,其中: • luvcview: 基于V ...
- 零基础学习人工智能—Python—Pytorch学习(八)
前言 本文介绍卷积神经网络的上半部分. 其实,学习还是需要老师的,因为我自己写文章的时候,就会想当然,比如下面的滑动窗口,我就会想当然的认为所有人都能理解,而实际上,我们在学习的过程中之所以卡顿的点多 ...
- 学习真DDD的最佳路径
本文书接上回<DDD是软件工程的第一性原理?>,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新: DDD框架源码(.NET.Java双平台): 加群畅聊,建模分析.技术实现交流: ...
- 【测试平台开发】——02Vue前端框架实战—router路由设计(登录页面)
一.安装vue-cli Mac系统: sudo npm install -g vue-cli 检查是否安装好: vue -V 二.创建新项目 1.打开Vue项目管理器 输入命令: vue ui 但是没 ...
- 基于PaddleNLP信息抽取,uie微调打造自己专属的信息抽取模型
基于PaddleNLP信息抽取,uie微调打造自己专属的信息抽取模型 UIE模型简介 UIE优势 应用示例 UIE开箱即用 UIE适用抽取示例 命名实体识别(Named Entity Recognit ...
- SpringMVC获取请求参数
目录 通过ServletAPI获取 通过控制器方法的形参获取请求参数 @RequestParam @RequestHeader @CookieValue 通过POJO获取请求参数 解决获取请求参数的乱 ...
- .net core 负载均衡取客户端真实IP
一个网关代码(.net core 3.1),部署到负载均衡器有故障,发现获取到的客户端IP都是内网IP了,负载均衡用的是阿里云的SLB . 记录一下修改过程 在Strup.cs 中的 Configur ...
- 鸿蒙(Harmony) NEXT - AlphabetIndexer实现联系人字母索引
鸿蒙(Harmony) NEXT 9月份就要正式上架了,并且不会再兼容安卓平台,于是我也赶紧给App开发鸿蒙版本,接下来会写一系列的Harmony开发教程. 今天使用AlphabetIndexer实现 ...