算法复杂度估算经验

算法复杂度:

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

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

ACM有时间限制1s

“规模”的举例

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

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

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

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

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

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

时间: 2024-10-13 00:01:43

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

ACM中算法复杂度估算经验

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

关于算法复杂度

一.算法复杂度 算法复杂度,即算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源. 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法.一个算法的评价主要从时间复杂度和空间复杂度来考虑. 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 

每个程序员都应该收藏的算法复杂度速查表

算法复杂度这件事 这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 O(Big-O)复杂度.我之前在参加面试前,经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,以便我在面试时不会被问住.最近这几年,我面试了几家硅谷的初创企业和一些更大一些的公司,如 Yahoo.eBay.LinkedIn 和 Google,每次我都需要准备这个,我就在问自己,“为什么没有人创建一个漂亮的大 O 速查表呢?”所以,为了节省大家的时间,我就创建了这个,希望你喜欢! — Eric 图例 绝佳 不错 一般

算法复杂度,及三种主要排序算法的研究

一.时间复杂度 1.时间频度  T(n),n为问题的规模 即--算法中语句的执行次数.又叫语句频度. 2.时间复杂度 记作 O( f(n) ),这里的f(n)是一个T(n)的同数量级函数. 如O(1)表示算法的语句执行次数为一个常数,不随规模n的增长而增长: 又如T(n)=n^2+3n+4与T(n)=4n^2+2n+1它们的频度不同, 但时间复杂度相同,都为O(n^2). 3.算法的性能 主要用算法的 时间复杂度 的数量级来评价一个算法的时间性能. 二.空间复杂度 S(n),包括3方面: 1.算

绪论算法复杂度

常见级数算法复杂度: 1,算数级数:与末项平方同阶 T(n)=1+2+3+...=n(n+1)/2=O(n2) 2,幂方级数:比幂次高出一阶 T2(n)=12+22+32+...n2=n(n+1)(2n+1)/6=O(n3) T3(n)=13+23+33+...n3=n2(n+1)2/4=O(n4) T4(n)=14+24+34+...n4=n(n+1)(2n+1)(3n2+3n-1)/30=O(n5) 3, 几何级数(a>1):与末项同阶 Ta(n)=a0+a1+a2+...an=(an+1-

数据结构基础 算法复杂度分析(一) 概念篇

为什么要进行算法分析? 预测算法所需的资源 计算时间(CPU 消耗) 内存空间(RAM 消耗) 通信时间(带宽消耗) 预测算法的运行时间 在给定输入规模时,所执行的基本操作数量,或者称为算法复杂度(Algorithm Complexity) 如何衡量算法复杂度? 内存(Memory) 时间(Time) 指令的数量(Number of Steps) 特定操作的数量 磁盘访问数量 网络包数量 渐进复杂度(Asymptotic Complexity) 算法的运行时间与什么相关? 取决于输入的数据.(例

数据结构基础 算法复杂度分析(二) 典例篇

示例代码(1) decimal Factorial(int n) { if (n == 0) return 1; else return n * Factorial(n - 1); } [分析] 阶乘(factorial),给定规模 n,算法基本步骤执行的数量为 n,所以算法复杂度为 O(n). 示例代码(2) int FindMaxElement(int[] array) { int max = array[0]; for (int i = 0; i < array.Length; i++)

.NET平台BigO算法复杂度备忘

      之前一篇文章提到BIG O算法复杂度的备忘录, 今天这个是.NET 平台下集合类相关的Big O 算法复杂度   今天先到这儿,希望对您有参考作用, 您可能感兴趣的文章: 数据结构与算法 Big O 备忘录与现实 IT基础架构规划方案一(网络系统规划) 餐饮行业解决方案之客户分析流程 餐饮行业解决方案之采购战略制定与实施流程 餐饮行业解决方案之业务设计流程 供应链需求调研CheckList 企业应用之性能实时度量系统演变 如有想了解更多软件,系统 IT,企业信息化 资讯,请关注我的微