常用算法设计和优化策略(本蒟蒻不定期更新)
下面是紫书上讲的常用算法设计策略和优化策略:
分治法:将问题分成相同的独立子问题求解。拆分出的问题必须有最优子结构性质(子问题求出的是最优解)
动态规划。本质是:对于一个问题,通过划分阶段,定义状态与状态间的关系,来分解问题。利用单阶段问题之间的联系,或者同一阶段状态之间的联系,一个一个阶段往下决策,最终解决问题。
拆分出的问题必须满足最优子结构性质和无后效性(当前阶段以前的状态不会影响以后的状态,只与当前阶段有关)。动归的目的是避免重叠子问题。递推和递归(记忆化搜索)是实现动归的手段。
注:DAG上的动归也是有阶段的。当前阶段的唯一状态就是这个点,上一阶段的状态是这个点的儿子(们)。不要以为有些动态规划是没有阶段的。
贪心法:动态规划的一种,每个阶段只有一种状态。
构造法:最朴素的方法。
中途相遇法:一种枚举的方法。通常比多个相遇法还要优秀。
问题分解:将两个不相关的问题剥离开来分别求解。
等价转换:化繁为简。
假设法:对于有对称性的问题,利用对称性避免讨论。
使用数据结构:在不改变主算法的情况下加速算法。
数形结合:将代数的关系转化成几何的关系。
二分答案:将求某个最优值转化为判定最优值,也算在策略内。
扫描法:带有顺序的枚举法,通常维护一些重要的量从而简化计算。
枚举基准:寻找基于当前基准的最优值,再取所有基准的最值。
滑动窗口:通过某个数据结构维护单调性,高效去除冗余状态。
各位dalao有什么想吐槽的请尽情砸向评论区~~