• 算法复杂度估算经验


    算法复杂度:

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

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

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

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

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

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

  • 相关阅读:
    Apex API 请求
    Apex 的 API 简介
    Salesforce 自定义元数据类型
    Apex 中 DML 进阶知识小结
    深度学习中的Attention机制
    从FM推演各深度CTR预估模型(附代码)
    深入浅出Word2Vector原理解析
    GBDT算法用于分类问题
    特征交叉
    方差膨胀因子VIF
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/6918059.html
Copyright © 2020-2023  润新知