分治法
核心思想将难以解决的问题 依照相同的概念 分割成来给两个或者更多的子问题(分而治之)
如: 快速排序法,递归算法
递归实现N!
public class ch01 {
public static void main(String[] args) {
System.out.println("5!="+fact(5));
}
public static int fact( int n){
if(n==0)
return 1;
else
return n*fact(n-1);
}
}
递归实现斐波那契数列
package com.alg.divide;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ch02 {
public static void main(String[] args) throws IOException {
int num;
String str;
BufferedReader buff;
buff = new BufferedReader(new InputStreamReader(System.in));
System.out.println("use recursion calculate to fibonacci ");
System.out.println("int put integer");
str = buff.readLine();
num=Integer.parseInt(str);
if (num<0){
System.out.println("need enter the integer over zero");
}
else {
System.out.println("Fibonacci="+Fibonacci(num));
}
}
public static int Fibonacci(int n) {
if (n==0)
return 0;
else if(n==1)
return 1;
else
return (Fibonacci(n-1)+Fibonacci(n-2));
}
}
贪心算法(greed Method)
方法从从某一起点开始,在每一个解决问题的步骤中使用贪心原则,即在当前状态下最有利或最优化的选择,不断进行解答,持续在每一步骤选择最佳方法。并且逐步逼近给定目标,当某一步骤无法进行时停止。
缺点: 贪心算法容易过早做决定,只能满足某些约束条件下可行解的范围
适用贪心算法–> 求解图的最小生成树(MST),最短路径和哈夫曼编码
动态规划(Dynamic Programming Algorithm)
如果一个问题答案与子问题答案相关的话 就能将大问题拆分成小问题–》动态和分治的不同是可以让每一个子问题的答案被存储起来,以供下一次使用
package com.alg.Dynamic;
public class Fibonacci {
public static int output[]=new int[1000];
public static void main(String[] args) {
int fib = fib(10);
for (int i:output
) {
System.out.println(output[i]);
}
System.out.println(fib);
}
public static int fib(int n){
if(n == 0 || n == 1){
output[n] =n;
return n; }
if(n > 1)
{
output[n]= fib(n-1) + fib(n-2);
return output[n];
}
return 0;
}
}
debug的结果 一个一个的计算 将子问题算出来之后 一个一个累加计算出结果
迭代法
无法用公式一次求解,而需要使用更多的迭代 例如循环
如果确定循环次数可定 可以用if 实现 不确定建议用while(1.变量初始值2.循环条件判别式3.调整变量增减)
枚举法
常见的数学方法,列举所有的可能。根据问题要求,注意列举问题的解答,或者为了便于解决问题,把问题分为不重复,不遗漏的两种情况,逐一列举各种情况,并加以解决,最终达到解决问题的目的。 枚举算法缺点手机速度太慢。(回溯也是枚举法的一种,对于某些问题而言,回溯法是一种可以找出所有(或一部分)姐的是一般算法——————>避免无效算法)
程序开发流程
1.需求认识:了解程序所需要解决的问题是什么,有哪些输入及输出
2.设计规划:根据需求选择合适的数据结构,并已明确无误的表示写一个算法以解决问题
3.分析讨论:思考其他可能适合的算法和数据结构,最后选出最适合的目标
4.编写程序:把分析的结论写成初步的程序代码
5.测试检验:最后必须确认程序的输出是够符合需求,这个步骤分步地执行程序并进行过许多相关测试