算法策略 1)递推策略:“递推法”和贪心算法一样也是由当前问题的逐步解决从而得到整个问题的解,只是依赖的是信息间本身的递推关系,每一步不需要策略参与到算法中,它们更多地用于计算。 2)递归策略:递归法是利用大问题与其子问题间的递归关系来解决问题的。每次找出大问题与小的子问题之间的关系,直到小的子问题很容易解决,再由小的子问题的解导出大问题的解。。例如:汉诺塔问题 3)穷举策略:对所有可能的解逐一尝试。 4)递归回溯策略:类似于穷举法的思想,递归回朔法通过递归尝试遍问题各个可能解的通路,发现此路不通时回朔到上一步继续尝试别的通路。 5)分治策略:求解的则是较复杂的问题,这类问题是可以被分解成独立的子问题来解决的,将两个或两个以上的独立子问题的解“合成”,就得到较大的子问题的解,最后合成为总问题的解。(注意一定是可以分解成独立子问题,否则会重复计算公共子问题) 6)动态规划策略:动态规划法与贪心法类似,要求问题具有最优子结构(即最优解包含子问题的最优解),是一种自底向上的求解思路,与递归正好相反,每次求解到一个阶段时,该阶段求解所依赖的子问题已经完全求解完毕,因此每一步的求解都是在直到全部所需信息的情况下进行的,因此可以得到全局最优解。 7)贪心策略:如果想要得到最优解,需要对问题性质有更严格的要求,除了要有最优子结构外,还要求问题具有贪婪选择性质。具体来说就是:贪心是一种策略,即每一步都要选择当前看来最好的,做完此选择后便将问题化为一个(仅仅一个)子问题,这是一个顺序的求解过程,每一步都是单独考虑,只考虑局部最优,因为并没有完成对之后子问题的求解,所以贪心算法不能完成对整个解空间的搜索,因此通常不能得到最优解。除非问题具有贪婪选择性质。所谓贪婪选择性质就是问题经过一次贪婪选择后只能形成一个子问题,这样求解空间实际上就是一个线性的空间,贪心算法可以得到最优解。是一种自顶向下求解思路。 算法策略之间关系 1)“分治法”与“动态规划法” 都是递归思想的应用,找出大问题与小的子问题之间的关系,直到小的子问题很容易解决,再由小的子问题的解导出大问题的解。 分治法的特征之一是所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 动态规划的实质是分治思想和解决冗余。 2)全面逐一尝试、比较“穷举法”、“枚举法”、“递归回溯法” 若问题中不易找到信息间的相互关系,也不能分解为独立的子问题,似乎只有把各种可能情况都考虑到,并把全部解都列出来之后,才能判定和得到最优解。 枚举法算法的实现依赖于循环,通过循环嵌套枚举问题中各种可能的情况。 对于规模不固定的问题就无法用固定重数的循环嵌套来枚举了,有的问题可能通过变换枚举对象也能用循环嵌套枚举实现,但更多的任意指定规模的问题是靠递归回朔法来“枚举”或“遍历”各种可能的情况。 3)回溯与分支限界策略 回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。 一般情况下,回溯法的求解目标是找出解空间树中满足约束条件的所有解的方案,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。 4)深度优先与广度优先 深度优先:通常深度优先搜索法不全部保留结点,扩展完的结点从数据存储结构栈中弹出删去,一般在数据栈中存储的结点数就是解空间树的深度,因此它占用空间较少。所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索是一种有效的求解方法。 广度优先:一般需存储产生的所有结点,占用的存储空间要比深度优先搜索大得多,因此,程序设计中,必须考虑溢出和节省内存空间的问题。但广度优先搜索法一般无回溯操作,即入栈和出栈的操作,所以运行速度比深度优先搜索要快。 5)动态规划与搜索算法 搜索算法:在解决最优化问题的算法中,搜索可以说是“万能”的。所以动态规划可以解决的问题,搜索也一定可以解决。动态规划要求阶段决策具有无后向性,而搜索算法没有此限止。 动态规划算法在时间效率上的优势是搜索无法比拟的,但动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。 动态规划是自底向上的递推求解,而无论深度优先搜索或广度优先搜索都是自顶向下求解。 转自:疯狂软件 |