分治算法
思想:
把一个问题分解为几个子问题,这些子问题原问题相似,但问题的规模小.然后递归地求解子问题,如果子问题的规模小到可以用直接的方法求出解,则停止递归.最后把这些子问题的解组合成原问题的解.优点:
它的运行时间往往可以由子问题的运行时间得到.程序
合并算法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24int n=10;
int[] B=new int[n];
public void mergeSort(int[] A,int left,int right){
if(left<right){
int mid=(left+right)/2;
mergeSort(A,left,mid);
mergeSort(A,mid+1,right);
merge(A,left,mid,right);
}
}
private void merge(int[] A,int left,int mid,int right){
for(int i=left;i<=right;i++){
B[i]=A[i];
}
int l=left,r=mid+1,k=left;
while(l<=mid && r<=right){
if(B[l]<B[r])
A[k++]=B[l++];
else
A[k++]=B[r++];
}
while(l<=mid)A[k++]=B[l++];
while(r<=right)A[k++]=B[r++];
}
快速排序算法:
1 | public void quickSort(int[] A,int left,int right){ |
partition的第二种写法:
1 | private int partition1(int[] A,int left,int right){ |
动态规划
思想
采用分治算法的思想,将原问题的解分解为若干子问题,然后分别求解子问题,最后将子问题的解组合起来得到原问题的解.动态规划不是递归地求解各个子问题,而是从简单问题入手,逐步求解,直到求出原问题的解.它的高明之处在于避免重复计算那些重复出现的子问题,即重叠子问题.
步骤
- 1.找出最优解的结构
- 2.递归定义一个最优解的值
- 3.以自底向上的方式(从最简单的问题开始入手)计算出最优值的解
- 4.根据计算最优解的信息,构造一个最优解
斐波那契数列
1 | public static int fibonacci(int num){ |
装配线调度问题
1 | public static void dpFastestWay(int[][] a,int[][] t,int[] e,int[] x,int n) { |
矩阵链乘法问题
1 | public static void matrixChain(int[] p){ |
最长公共子序列
1 | public static void lCSlength(char[] X,char[] Y,int m,int n){ |
0-1背包问题
1 | public static void knapsack(int[][] S,int W){ |
最优二叉搜索树
1 | public static void optimalBST(double[] p,double[] q){ |
贪心算法:
思想
总是在每一步骤中做最优的决策,希望通过这一系列的局部最优决策,获得问题的全局最优解.
任务选择问题
1 | public static List<Integer> taskSelect(int[] S,int[] F){ |
背包问题
1 | public static void knapsack(int[][] S,int W){ |
缓存维护问题
1 | public static void caching(int[] pages,int cacheCapocity){ |