常用算法:贪心&分治

1 贪心算法

贪心算法一般解决在给定限制值和期望值的前提下,在满足限制值的情况下,期望值最大的问题。其思路很简单,每次优先选择期望值/限制值最大的选项,然后一步步往下进行选择,直至达到限制值的约束上限。

贪心算法的难点不在算法本身,而是如何证明一个问题是能够用贪心算法解决的。想要严格地证明贪心算法的正确性,是非常复杂的,需要涉及复杂的数学推理。通常我们会凭认知或者举例来判断其正确性,如果不信,那还是用其它的算法吧。

由于贪心算法本身并不复杂,编码也比较简单就不展开了。

2.分治算法

分治算法的核心思想就是分而治之 ,就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,从而得到原问题的解。

一般的步骤如下:

  • 分解:将原问题分解成一系列子问题。
  • 解决:递归地求解各个子问题,若子问题足够小,则直接求解。
  • 合并:将子问题的结果合并成原问题的结果。

能使用分治算法的问题一般需要满足以下条件:

  • 原问题与分解成子问题有相同的模式。
  • 原问题分解成的子问题可以独立求解,子问题之间没有相关性,即子问题分解后不含重复的子问题。
  • 有分解终止条件,即当问题足够小时,可以直接求解。
  • 分解问题和合并子问题结果的复杂度不能太高。

个人对分治算法定性的理解如下:

某些时间复杂度较高的问题,当任务规模足够小的时候时间复杂度会降低,比如可以直接求解(常量级)。那么问题的关键就在如何快速的分解任务和合并任务结果上。当这两项任务的时间复杂度之和比原有直接解决问题的时间复杂度低的时候,分治算法就是能起作用的。