算法归类笔记

分治法
核心思想将难以解决的问题 依照相同的概念 分割成来给两个或者更多的子问题(分而治之)
如: 快速排序法,递归算法
递归实现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.测试检验:最后必须确认程序的输出是够符合需求,这个步骤分步地执行程序并进行过许多相关测试

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值