ACM中算法复杂度估算经验

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

自己代码的话:
有个好方法:随便来个极限数据,拿自己的机器跑一下(如果你觉得自己的机器太快,可以将自机的0.5s当成1s)。

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

DP:
DP的分析一般比较简单,状态和转移都是自己设计的,复杂度基本没什么悬念,如果你用了复杂的结构来搞各种优化,多想想平摊分析一般还是没什么压力的。

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

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

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

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

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

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

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

ACM中算法复杂度估算经验

时间: 2024-12-09 17:16:46

ACM中算法复杂度估算经验的相关文章

算法复杂度估算经验

算法复杂度: 复杂度计算出来后有什么用? 估计程序能否在规定时间内处理题目指定规模的数据 ACM有时间限制1s “规模”的举例 1.给N个数排序  规模:N 2.判断字符串P是否是字符串T的子串  规模:串的长度|P|和|T| 3.判断一个整数是否属于整数集合S  规模:|S| 要判断多少次(查询次数) 4.图中某两个点的最短路径/求连通图的最小生成树 规模:顶点数 边数 5.给一个整数集合S,问是否存在S的一个非空子集T,满足T中所有元素的和为零  规模:|S| 算法运算次算: 当代计算机1s

ACM中常用算法----字符串

ACM中常用算法--字符串 ACM中常用的字符串算法不多,主要有以下几种: Hash 字典树 KMP AC自动机 manacher 后缀数组 EX_KMP SAM(后缀自动机) 回文串自动机 下面来分别介绍一下: 0. Hash 字符串的hash是最简单也最常用的算法,通过某种hash函数将不同的字符串分别对应到不同的数字.进而配合其他数据结构或STL可以做到判重,统计,查询等操作. #### 字符串的hash函数: 一个很简单的hash函数代码如下: ull xp[maxn],hash[max

关于算法复杂度

一.算法复杂度 算法复杂度,即算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源. 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法.一个算法的评价主要从时间复杂度和空间复杂度来考虑. OK!看到此处,我想大家应该简单明白了算法复杂度是怎么一回事.如果你是计算机科班或者数学专业出身恰巧你的成绩又很不错的,那你就不需要继续往下看了.因为作者根本不是学计算机出身的,对于这些高深的知识,在查阅很多资料后也是似懂非懂

算法复杂度

一个算法中的语句执行次数称为语句频度或时间频度.记为T(n).n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化. 算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数.记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度. 一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度 O(1)<O(log 

《ACM/ICPC 算法训练教程》读书笔记一之数据结构(堆)

书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了集训队final的意见买的,感觉还是不错滴. 相对于其他ACM书籍来说,当然如书名所言,这是一本算法训练书,有着大量的算法实战题目和代码,尽管小编还是发现了些许错误= =,有部分注释的语序习惯也有点不太合我的胃口.实战题目较多是比较水的题,但也正因此才能帮助不少新手入门,个人认为还是一本不错的算法书,当然自学还是需要下不少

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

ACM/ICPC算法训练 之 数学很重要-浅谈“排列计数” (DP题-POJ1037)

这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列计数 的方法,虽然排列计数的思路简单,但却是算法中一个数学优化的点睛之笔. Poj1037  A decorative fence 题意:有K组数据(1~100),每组数据给出总木棒数N(1~20)和一个排列数C(64位整型范围内),N个木棒长度各异,按照以下条件排列,并将所有可能结果进行字典序排序 1.每一

ACM中杨辉三角的多种解法

杨辉三角的多种解法 杨辉三角的相信大家很熟悉吧,但是大家能用多少中方法写出来呀,一般人都只会想到两种,递归和二项式.当用递推时,有时在解题是根本没必要需要那么多呀,而只要杨辉三角的某一行,数据小时,我们可以用二项式来计算,但是数据比较大时,二项式算也是很麻烦的,那么还有其它的方法吗?所以下面我就介绍几种计算杨辉三角的方法吧. 主要要记住第四种.... 完整版下载:http://download.csdn.net/detail/u010304217/7750997 博客版下载:http://dow

在软件项目管理中如何把时间估算的靠近真实值?

我们在开发一个软件项目的时候,大老板或者客户经常需要我们给他们某个项目估算的工时,我们一般的做法就是把当前的项目按照WBS进行自上而下,自顶而底,自外而里的进行分解:然后根据一个详细的可个人实施的任务作为一个最低的估算时间的单元,这个时候问题,就来了,如何让这个最低的估算时间的单元逼近它的实际真实值,同时也不让员工太闲或者太累?这里给大家介绍一种我们以前用过的乐观估计,悲观估计和期望估计的算法,供大家参考. 任务最终的估算时间=(乐观估计+悲观估计+期望估计*4)/ 6(中庸), (1)乐观估计