算法分析与设计

 

一、递归与分治策略

1、递归

直接或间接地调用自身的算法称为递归算法。

用函数自身给出定义的函数称为递归函数。

2、分治法

分治法的基本思想是讲一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。

2.1 二分搜索技术

二分搜索算法是使用分治策略的典型例子。

二分搜索算法的基本思想是将n个元素分成个数大致相同的两半,取[n/2]与x进行比较。如果x=a[n/2],则找到x,算法终止。如果x

最坏情况下,时间复杂度:O(logn)。

算法如下:

2.2 大整数的乘法

2.3 Strassen 矩阵乘法

2.4 棋盘覆盖

用分治策略,可设计出解棋盘覆盖问题的简介方法。

当n>0时,将\small 2^{k}x2^{k}棋盘分割为4个\small 2^{k-1}x2^{k-1}子棋盘。特殊方格必须位于4个较小子棋盘之一中,其余3个子棋盘中午特殊方格。

算法如下:

public void chessBoard(int tr,int tc,int dr,int dc,int size){

}

2.5 合并排序

合并排序的算法是用分治策略实现对n个元素进行排序的算法。其基本思想是:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。

算法如下:

public static void mergeSort(Comparable a[],int left,int right){

}

2.6 快速排序

快速排序算法是基于分支策略的一个排序算法。其基本思想是:对于输入的子数组a[p:r],按以下3个步骤进行排序。

(1)、分解

(2)、递归求解

(3)、合并

算法如下:

2.7 线性时间选择

元素选择问题

2.8 最接近点对问题

最接近点对问题对问题的提法是:给定平面上n个点,找其中的一对点,使得在n个点组成的所有电对中,该点对间的距离最小。

用分治法解的思想是:将所给的平面上n个点的集合S分成2个子集S1和S2,每个子集中约有n/2个点。然后在每个子集中递归地求其最接近的点对。

2.9 循环赛日程表

二、动态规划

动态规划算法与分治法类似,其基本思想也是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划法求解的问题,经过分解得到的子问题往往不是相互独立的。

用一个表来记录所有已解决的子问题的答案。

动态规划法的基本要素:

1、最优子结构

2、重叠子问题

动态规划法变形:

备忘录方法

1、矩阵连乘问题

问题描述:给定n个矩阵(A1,A2,A3.....An},其中Ai与Ai+1是可乘的,i=1,2,...n-1。考察n个矩阵的连乘积A1A2A3,....An。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。加括号的方式决定了整个计算量(指的是乘法调用的次数)。所以自然会提出矩阵连乘积的最优计算次序问题。

用动态规划法解举证连乘问题的最优计算次序问题步骤:

1、分析左右解的结构

2、建立递归关系

3、计算最优解

4、构造最优解

2、最长公共子序列

1、最长公共子序列的结构

2、子问题的递归结构

3、计算最优值

4、构造最长公共子序列

5、算法改进

3、凸多边形最优三角剖分

4、多边形游戏

5、图像压缩

6、电路布线

7、流水作业调度

8、0-1背包问题

0-1背包问题:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C,问:应该如何选择装入背包的物品,使得装入背包的物品中物品的总价值最大?

在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或者不装入背包。不能将物品i转入背包多次,也不能只装入部分的物品i;因此,该问题称为0-1背包问题。

1、最优子结构性质

2、递归关系

3、算法描述

4、计算复杂性分析

9、最优二叉搜索树

 

三、贪心算法

贪心算法总是做出在当前看来最好的选择。

贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。

1、活动安排问题

2、最优装载

3、哈夫曼编码

4、单源最短路径

5、最小生成树

6、多机调度问题

 

四、回溯法

在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。

1、装载问题

2、批处理作业调度

3、复好三角形问题

4、n后问题

5、0-1背包问题

6、最大团问题

7、图的m着色问题

8、旅行售货员问题

9、圆排列问题

10、电路板排版问题

11、连续邮资问题

 

五、分支界限法

1、单源最短路径问题

2、装载问题

3、布线问题

4、0-1背包问题

5、最大团问题

6、旅行售货员问题

7、电路板排列问题

8、批处理作业调度问题

六、概率算法

七、NP完全性理论

八、近似算法

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(算法设计与分析)