3、复杂度与竞赛

 

一、课程目标

  1. 数据范围与算法复杂度

二、目标详解

1、数据范围与算法复杂度

在noi竞赛环境,一般规定每个试题要在1秒内运行通过,而测评机每秒大概运行10^7-10^8次指令左右,因此对于给定的数据范围,与算法复杂度的对比关系大致如下:

数据范围算法复杂度
>10^7O(logn)
10^7O(n)
10^5 ~5*10^5O(nlogn)
1000 ~ 5000O(n^2)
200 ~ 500O(n^3)
20 ~ 24O(2^n)
12O(n!)

用上表做参考,可以用来:

  • 在看到数据范围的时候,就知道大概需要选择什么算法了。
  • 选择一个算法实现后,大概知道能通过多少测试点。

例如:一个排序的试题,30%数据<1000,50%数据<3000,100%数据<300000,则:

  • 如果想AC(100分),需要用O(nlogn)的算法,例如快速排序。
  • 如果只会冒泡排序(O(n^2)),能拿到50分。

2、竞赛策略

2.1 解题

仔细阅读试题,通过小数据模拟理解试题,大致明白试题的输入->输出之间的逻辑。

要求-在模拟、理解试题之后:

  • 能提炼出试题对应的问题(去掉试题里的业务描述)
  • 能自己生成更多的输入和输出样例。

2.2 朴素算法

实现一种朴素算法,通过所有的样例,先不考虑性能。

要求:通过所有的测试样例,包括自己设计的样例,确保结果无误。

2.3 优化和复杂度理解

根据数据的范围,分析出复杂度分级,并对朴素算法进行优化,大致划分出不同优化方案对应的复杂度分级,以及得分范围。

要求:

  • 根据自己的能力积累,尽可能设计出更大得分范围的优化算法。
  • 用所有测试样例对优化算法进行测试,确保结果无误。

2.4 分支和对拍

对拍是指用脚本来调用朴素算法和优化算法两个程序,对所有输入数据做运算,比较其输出是否一致。

对拍被用来确保优化程序不会出现结果错误的情况,因为优化程序往往用到比较复杂的思路,难免编码出错。

不会对拍的情况,也可以通过对不同的数据范围实现分支控制,比如小数据调用朴素算法,大数据调用对应的优化算法,各施其责。

2.5 测试数据

为确保代码正确及性能测试通过,需要编写程序生成符合数据范围的各级测试数据,以便对优化算法进行性能测试,以及对拍所用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值