基本算法——第一单元 模拟

第一单元 模拟

一、定义

官方定义:模拟整个过程,通过改变数学中模型的各种参数,进而观察变更这些参数所引起过程状态的变化。

通俗理解:程序完全按照题目所叙述的方式运行。

 

二、算法复杂度和优化

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)等题目自行体会。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值