第一单元 模拟
一、定义
官方定义:模拟整个过程,通过改变数学中模型的各种参数,进而观察变更这些参数所引起过程状态的变化。
通俗理解:程序完全按照题目所叙述的方式运行。
二、算法复杂度和优化
1.时间复杂度(O)
程序运算所花费的时间,一般由算法的运算次数决定。通常在表示时间复杂度时,我们只保留数量级最大的项,并忽略该项的系数,但如果有多项均对时间复杂度有较大的影响,则都保留。
1s运算次数约为1000000000次,如果运算次数接近或大于1000000000次,就会有超时的危险。
常见时间复杂度:
数量级 | 能承受的大致规模 | 常见算法(可暂忽略) |
O(1) | 任意 | 直接输出结果 |
O(logn) | 任意 | 二分查找、快速幂 |
O(n) | 亿、千万级 | 贪心、遍历 |
O(nlogn) | 百万级 | 分治(二分法) |
O(n2) | 万级 | 枚举、两重动态规划 |
O(n3) | 百级 | 三重动态规划 |
O(2n) | 不超过30 | 暴搜 |
O(n!) | 不超过12 | 全排列 |
O(nn) | 不超过9 | 一般不用 |
2.时间复杂度优化
1)减少循环次数。
2)不要做不必要的运算。
3)不要做重复的运算。
4)提前列举出与输入无关的数据。(例如:提前算出一定范围内的质数。)
5)当数据量很小的时候可以打表。
6)用位运算代替普通计算。
7)用逻辑运算代替普通计算。
8)用整型代替浮点型。
9)尽量不要数组的下标含有另一个数组的值(影响较小)。
10)一般以空间复杂度增多来换取时间复杂度减小。
3.空间复杂度(O)
程序运行过程中临时占用存储空间大小。一般情况内存限制是128MB,大约为30000000个整型,不同题目有所不同。如果超出内存限制会因为内存超限爆0,而且数组太大会导致遍历时间偏长。
4.空间复杂度优化
减小数组大小、维度,覆盖不用的旧数据。空间复杂度在一定范围内影响着时间复杂度,但影响不大。
5.KISS原则
Keep It Simple and Stupid,尽量使程序简单,使程序漏洞少、占时少,方便修改。
三、常见错误及调试方法
1.方法错误:选择正确的方法,重新写。
2.书写错误:仔细检查,可以分区检查。常见情况:字母写错(“i”和“j”)、“&”使用错误、“==”和“=”。
3.忘记初始化:如果输出结果为乱码,一般是忘记初始化,或初始化错误。(初始化勿太大)
4.值溢出:超出变量范围。注意:a*b/c,如果a*b过大,即使a*b/c在理论上不会超出变量范围,但a*b可能会超出变量范围。
5.数组溢出:增大数组大小,在调用数组前判断下标是否太大。
6.变量混淆:尽量不要用相同或相近的变量。
7.浮点型直接判断相等:应该在一定精度下判断。
8.测试系统出错:请选择正确的申述方式申述。
四、测试数据
1.题目给出的测试数据一般都是骗人的。
2.测试数据只是用来判断是否错误,而不是用来改正错误。
3.自己构造测试数据,常见类型:
1)一般数据。
2)极端数据,尽量接近数据范围最大值。
3)“0”、“1”等特殊数据。
4)如果还无法保证,且时间充足的情况下,可以用一种简单的、保证绝对正确的方法编一个程序生成测试数据。
4. 注意陷阱,非明文禁止者,皆无不可能。请根据《侦探推理》(NOIP2013)等题目自行体会。