基本的算法设计技术

来源:互联网 发布:淘宝卖水果只做本地 编辑:程序博客网 时间:2024/06/05 06:39

1.蛮力法(穷举法或枚举法)

    所依赖的基本技术是遍历,即采用一定的策略依次处理待求解问题的所有元素,从而找出问题的解。

蛮力法可以作为某类问题时间的下界,来衡量同样问题的其他算法是否具有更高的效率。

    蛮力法解题的经典习题


2.分治法

                                                 
                                                                                                               1  分治法的典型情况

    将一个难以直接解决的大问题划分成一些规模较小的子问题,分别求解各个子问题,再合并子问题的解得到原问题的解。

   a.划分:把规模为n的原问题划分为k个(通常k>=2)规模较小的子问题。 平衡子问题

   b.求解子问题:各个子问题的解法与原问题的解法通常是相同的,可以用递归处理,也可以用循环来实现。

   c.合并:吧各个子问题的解合并起来,合并的代价因情况的不同有很大的差异,分治算法的效率很大程度上依赖子合并的实现。


一个重要的技术——递归函数的执行过程

    递归——就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。递归必须具备以下两个基本要素,才能在有限次计算后得出结果。

    a.边界条件:确定递归到何时终止,即递归出口。

    b.递归模式:大问题是如何分解为小问题的,也成为递归体。

     只有深刻理解了递归函数的运行过程,才能真正理解递归技术,从而设计递归程序。采用图示方法描述递归函数的执行过程。从中可以直观地了解到递归函数的执行情况,具体方法如下:

   a.顺序写出函数执行的各语句,并用有向弧表示语句的执行次序;

   b.对函数的每个递归调用,写出对应的函数调用,从调用处画一条有向弧指向被调用函数入口,表调用路线,从被调用函数末尾处画一条有向弧指向调用语句的下面,表示返回路线。

   c.在返回路线上标出本次调用所得的函数值。

   分治法解题的经典习题


3.减至法

   分治法与减治法对比——减治法是一种退化的分治法。

                             

                                                                                2   减治法的典型情况


   减治法将原问题分解为若干个子问题,并且原问题(规模为n)的解与子问题(规模通常是n/2n-1)的解之间存在某种确定的关系,这种关系通常表现为:

a.原问题的解只存在于其中一个较小规模的子问题中;

b.原问题的解与其中一个较小规模的解之间存在某种对应关系。

     减治法解题的经典习题


4.动态规化法

    动态规划法是通过组合子问题的解而解决整个问题的,但是与分治法不同,动态规划适用于子问题不是独立的情况,也就是各子问题包含公共子问题的情况。在这种情况下,若重复地求解公共子问题,则会做许多不必要的工作。因此,动态规划法对每一个子问题子求解一次,其结果保存在一张表里面,避免不必要的重复计算。

    通常,动态规划法应用于最优化问题。此类问题,有很多可行解。每个解只有一个值,而我们是要找到具有最优解(最大或者最小)的值,这样的问题,我们叫做最优化问题。

    动态规化法将待求解问题分解成若干个相互重叠子问题,每个子问题对应决策过程的一个阶段,一般来说,子问题的重叠关系表现在对给定问题求解的递推关系(称为动态规化函数)中,将子问题的解求解一次并填入表中,当需要再次求解此子问题时,可以通过查表获得该子问题的解,从而避免了大量重复计算。具体的动态规化法多种多样,但都具有相同的填表形式,一般由三个阶段组成:

A.划分子问题:将原问题分解为若干子问题,每个子问题对应一个决策阶段,并且子问题之间具有重叠关系;

B.确定动态规划函数:根据子问题之间的重叠关系划到子问题满足的递推关系式(即动态规化函数),这是动态规化法的关键;

C.填表:设计表格(一般是数组),以自底向上的方式计算各个子问题的解并填表,实现动态规化过程。        

  动态规划法解题的经典习题


5.贪心法

    贪心法是最直观的算法设计范式之一。

利用贪心法求解方式与递归调用函数极为相似,都是把问题分割为几个子问题,并在每个阶段生成一部分答案,贪心法会在每个阶段找出当期的最优解。

但是贪心法在很多情况都无法解出最优解。因此贪心法的适用范围会限制在如下两种情况。   

    A.即使使用贪心法也能求解出最优解。贪心法比动态规划法具有具有更快的解题速度,因此在这种情况下会非常有用。  

    B.因时间或者空间限制而无法利用其它算法求出最优解的时候,可以利用近似解代替最优解。虽然不是最优的,但是比其他的算法更接近答案。

   然后呢,贪心的选择策略不同也会影响程序的执行效率。

    贪心法解题的经典习题

0 0
原创粉丝点击