算法复杂度估算经验

算法复杂度:算法

复杂度计算出来后有什么用?网络

估计程序可否在规定时间内处理题目指定规模的数据数据结构

ACM有时间限制1s函数

“规模”的举例优化

1.给N个数排序  规模:N编码

2.判断字符串P是不是字符串T的子串  规模:串的长度|P|和|T|spa

3.判断一个整数是否属于整数集合S  规模:|S| 要判断多少次(查询次数)设计

4.图中某两个点的最短路径/求连通图的最小生成树 规模:顶点数 边数排序

5.给一个整数集合S,问是否存在S的一个非空子集T,知足T中全部元素的和为零  规模:|S|递归

算法运算次算:

当代计算机1s内可作10^7左右次计算,配置好的机器可到k*10^7~10^8

在这个限制下时间复杂度必定的算法存在能处理的规模上限

 

转载:

OJ和正式的比赛必定会写明评测机各参数的,若是只是想比较准确的知道实际评测的效率,能够搞一些无聊的大递归交上去试试(好比1e8次求mod),最多不过几个TLE/WA而已。好在你们的机器基本上差很少,除非碰到恶意卡常数的状况,不然凭借通常人的常识足够了(好比1e4^2脸没洗好不要试,几e6的规模nlgn多半能赌一下常数和数据放水,1e8线性算法交以前看好本身的常数,再大就想一想sqrt和log)。

本身代码的话:
有个好方法:随便来个极限数据,拿本身的机器跑一下(若是你以为本身的机器太快,能够将自机的0.5s当成1s)。

若是数据很差构造,算法复杂度一眼看不出怎么办?(我感受下面这部分全是跑题)
一个完整的题目可能由好几个步骤构成,咱们分类来看一下各类小的状况~

DP:
DP的分析通常比较简单,状态和转移都是本身设计的,复杂度基本没什么悬念,若是你用了复杂的结构来搞各类优化,多想一想平摊分析通常仍是没什么压力的。

图结构、数据结构:
这类题经典模板用的比较多,将几层经典算法组合在一块儿也很常见,分析有压力的话(通常不会)加起来就行了,平摊分析有时候也很给力的。

贪心:
贪心可以超时可很少见……若是你使用了某些复杂的估价方法,一步步分析吧(哦有些时候也许能够平摊)。

网络流(这个单独说):
网络流超时通常只有三种状况:
你建图建傻了 or 这个模型的一些特性使得它能够被优化成其余算法 or 你写错了
不要去考虑什么O(V^2E),那是每次都考虑不好状况分析出来的。通常来讲比赛中分析网络流的复杂度毫无心义……

字符串:
嗯……C/C++的各类函数速度仍是不错的,常数没有有些时候咱们相信的那样可怕。通常来讲,匹配算法等等经典模板分析不动直接记住就能够了,复杂的串处理通常都是卡编码时间而不是执行时间。(若是真的遇到了须要分析的状况,说不定平摊分析还能够救命)

模拟:
……好像没什么值得说的,复杂的模拟通常仍是卡编码时间而不是执行时间。

数学:
不管是组合、数论、仍是数位统计你多半的思考时间是在压缩和合并各类信息上面。看看你要处理的信息和输入是什么关系,你能合并多少信息。

搜索:
在我心中赛场上能把启发搜索分析清楚的都是大神。疯狂剪枝不必定有好效果(数据多是特殊的),搜索题不多见的,多交交……

相关文章
相关标签/搜索