当前位置: 首页 > news >正文

Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心

场景

1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解,

然后综合各个小问题,得到最终答案。

2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。

3、迭代法(Iterative Method) 无法使用公式一次求解,而需要使用重复结构(即循环)重复执行

一段代码来得到答案。

4、递归调用是一个方法在其方法体内调用其自身方法。

5、递推算法是一种理性思维模式的代表,其根据已有的数据和关系,逐步推导而得到结果。

6、动态规划法(Dynamic Programming Algorithm,DPA)类似于分治法,动态规划法的主要做法:

如果一个问题的答案与子问题相关,就能将大问题拆解成各个小问题,

其中与分治法最大的不同是可以让每一个子问题的答案被存储起来,以供下次求解时直接取用。

这样的做法不仅可以减少再次计算的时间,而且可以将这些解组合成大问题的解,可以解决重复计算的问题。

7、回溯法也是枚举法的一种,它的特点就是在搜索过程中寻找问题的解,当发现不满足求解条件时就回溯(返回),

尝试别的路径,避免无效搜索。

8、贪心法(Greed Method)又称贪婪算法,从某一起点开始,在每一个解决问题的步骤使用贪心原则,

即采用在当前状态下最有利或最优化的选择,不断地改进该解答,持续在每一个步骤中选择最佳的方法,

并且逐步逼近给定的目标,当达到某一个步骤不能再继续前进时,算法就停止,以尽可能快的方法求得更好的解。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

实现

1、分治算法

举个例子:要以人工的方式将散落在地上的打印纸从第一个排序整理到第100页,一种方式是逐一捡起稿纸,

按照页码顺序插入到正确的位置。这样的排序和整理的过程比较复杂且浪费时间,可以采用分治法的原理,

先将页码1到10放在一起,页码11到20放到一起,以此列推,将原来的100页分类成10个页码区间,

然后对10堆页码进行整理,最后从页码小到大的分组合并。

代码实例-求最大值

    public static int getMax(int[] a,int begin,int end){//元素小于2个,直接找出最大值if(end -begin <=1){if(a[begin]>a[end])return a[begin];elsereturn a[end];//否则进入递归}else {int center = (begin+end)/2;int left = getMax(a,begin,center);int right = getMax(a,center,end);return  left>right?left:right;}}public static void main(String[] args) {int[] a = new int[]{2,5,8,45,65,2,44,532,33};System.out.println("最大值:"+getMax(a,0,a.length-1));}

2、穷举实例-鸡兔同笼

    static int chichen; //鸡的个数static int habbit; //兔的个数public static int qiongju(int head,int foot){int re,i,j;re= 0;for(i=0;i<=head;i++){j = head - i;if(i*2 + j*4 == foot){re = 1;chichen = i;habbit = j;}}return re;}public static void main(String[] args) {int re,head,foot;System.out.print("输入头数:");Scanner input = new Scanner(System.in);head = input.nextInt();System.out.print("输入脚数:");foot = input.nextInt();re = qiongju(head,foot);if (re ==1){System.out.println("鸡有"+chichen+"只,兔有"+habbit+"只。");}else {System.out.println("无法求解");}}

3、迭代实例-for循环计算n!

    public static void main(String[] args) {int sum =1;for(int i =1;i<8;i++){for(int j =i;j>0;j--){sum = sum * j;}System.out.println(i+"!="+sum);sum =1;}}

4、递归调用

    static long fact(int n){if(n<=1)return 1;elsereturn n*fact(n-1);}public static void main(String[] args) {int i;System.out.print("请输入一个要阶乘的数:");Scanner input = new Scanner(System.in);i = input.nextInt();System.out.println(i+"的阶乘结果为:"+fact(i));}

5、递推算法

    1、根据已知结果和关系,求解中间结果。
    2、判断是否达到要求,如果没有达到,则继续根据已知结果和关系求解中间结果;如果满足要求,则表示寻找到一个正确的答案
    数学里面的斐波那契数列是使用递推算法的经典例子
    兔子产仔问题:如果一对两个月大的兔子以后每一个月都可以生一对小兔子,而一对新生的兔子出生两个月后才可以生小兔子。
    也就是说,1月份出生,3月份才可产仔。那么假定一年内没有发生兔子死亡事件,那么一年后共有多少对兔子?

    第一个月:1对兔子
    第二个月:1对兔子
    第三个月:2对兔子
    第四个月:3对兔子
    第五个月:5对兔子

    从第三个月开始,每个月的兔子总对数等于前两个月兔子数的综合

    public static int fibonacci(int n){int t1,t2;if(n==1 || n ==2){return 1;}else{t1 = fibonacci(n-1);//递归调用t2 = fibonacci(n-2);return t1+t2;}}public static void main(String[] args) {System.out.print("请先输入时间:");Scanner input = new Scanner(System.in);int n = input.nextInt();int num = fibonacci(n);System.out.println("经过"+n+"月的时间,共繁殖成"+num+"对兔子");}

6、动态规划-斐波那契优化

    public static int output[] = new int[1000];public static int fib(int n){int result;result = output[n];if(result==0){if(n==0)return 0;if(n==1)return 1;elsereturn (fib(n-1)+fib(n-2));}output[n] = result;return result;}public static void main(String[] args) {int fib = fib(8);System.out.println(fib);}

7、回溯法示例-老鼠走迷宫

老鼠走迷宫,采用尝试错误的方法找到出口,在走错路时就退回来并把走过的路记下来,避免下次走重复的路,就这样找到出口为止。

老鼠需要遵守以下三个原则:

1、一次只能走一格。

2、遇到墙无法往前走则退回一步,寻找其它路。

3、走过的路不再走第二次。

使用二维数组代表地图,值为1则代表不能通行,值为0则代表可以通行。

假设老鼠从左上角[1][1]进入,从右下角[8][10]出来。

可以使用链表来记录走过的位置,并且将走过的位置所对应的数组元素内容标记为2,然后将这个位置放入堆栈,再进行下一个方向

或路的选择。如果走到死胡同并且还没有抵达终点,就退回到上一个位置,再选择其他的路。由于每次新加入的位置必定会在堆栈的

顶端,因此堆栈顶端指针所指向的方格编号就是当前老鼠的位置,如此重复直至走到迷宫出口为止。

public class HuiSu {// 记录老鼠迷宫的行进路径public static int ExitX= 8;			//定义出口的X坐标在第8列public static int ExitY= 10;		//定义出口的Y坐标在第10行public static int [][] MAZE= {//声明迷宫数组{1,1,1,1,1,1,1,1,1,1,1,1},{1,0,0,0,1,1,1,1,1,1,1,1},{1,1,1,0,1,1,0,0,0,0,1,1},{1,1,1,0,1,1,0,1,1,0,1,1},{1,1,1,0,0,0,0,1,1,0,1,1},{1,1,1,0,1,1,0,1,1,0,1,1},{1,1,1,0,1,1,0,1,1,0,1,1},{1,1,1,1,1,1,0,1,1,0,1,1},{1,1,0,0,0,0,0,0,1,0,0,1},{1,1,1,1,1,1,1,1,1,1,1,1}};public static void main(String args[]) throws IOException{int i,j,x,y;TraceRecord path=new TraceRecord();x=1;y=1;System.out.print("[迷宫的路径(0的部分)]\n");for(i=0;i<10;i++){for(j=0;j<12;j++)System.out.print(MAZE[i][j]);System.out.print("\n");}while(x<=ExitX&&y<=ExitY){MAZE[x][y]=2;if(MAZE[x-1][y]==0){x -= 1;path.insert(x,y);}else if(MAZE[x+1][y]==0){x+=1;path.insert(x,y);}else if(MAZE[x][y-1]==0){y-=1;path.insert(x,y);}else if(MAZE[x][y+1]==0){y+=1;path.insert(x,y);}else if(chkExit(x,y,ExitX,ExitY)==1)break;else{MAZE[x][y]=2;path.delete();x=path.last.x;y=path.last.y;}}System.out.print("[老鼠走过的路径(2的部分)]\n");for(i=0;i<10;i++){for(j=0;j<12;j++)System.out.print(MAZE[i][j]);System.out.print("\n");}}public static int chkExit(int x,int y,int ex,int ey){if(x==ex&&y==ey){if(MAZE[x-1][y]==1||MAZE[x+1][y]==1||MAZE[x][y-1] ==1||MAZE[x][y+1]==2)return 1;if(MAZE[x-1][y]==1||MAZE[x+1][y]==1||MAZE[x][y-1] ==2||MAZE[x][y+1]==1)return 1;if(MAZE[x-1][y]==1||MAZE[x+1][y]==2||MAZE[x][y-1] ==1||MAZE[x][y+1]==1)return 1;if(MAZE[x-1][y]==2||MAZE[x+1][y]==1||MAZE[x][y-1] ==1||MAZE[x][y+1]==1)return 1;}return 0;}static class Node{int x;int y;Node next;public Node(int x,int y){this.x=x;this.y=y;this.next=null;}}static class TraceRecord{public Node first;public Node last;public boolean isEmpty(){return first==null;}public void insert(int x,int y){Node newNode=new Node(x,y);if(this.isEmpty()){first=newNode;last=newNode;}else{last.next=newNode;last=newNode;}}void delete(){Node newNode;if(this.isEmpty()){System.out.print("[队列已经空了]\n");return;}newNode=first;while(newNode.next!=last)newNode=newNode.next;newNode.next=last.next;last=newNode;}}
}

即迷宫路线如下

运行结果

8、贪心算法示例-零钱最少找零

    public static void greedMoney(int money){System.out.println("需要找零:"+money);int[] moneyLevel = {1,5,10,20,50,100};for(int i =moneyLevel.length -1;i>=0;i--){int num = money/moneyLevel[i];int mod = money % moneyLevel[i];money = mod;if(num>0)System.out.println("需要"+num+"张"+moneyLevel[i]+"块");}}public static void main(String[] args) {greedMoney(1562);}

    //输出结果:
    //需要找零:1562
    //需要15张100块
    //需要1张50块
    //需要1张10块
    //需要2张1块

如果不限制纸币的金额,那这种情况还适合用贪心算法么。

 比如1元,2元,3元,4元,8元,15元的纸币,用来支付K元,至少多少张纸币?

经我们分析,这种情况是不适合用贪心算法的,因为我们上面提供的贪心策略不是最优解。

比如,纸币1元,5元,6元,要支付10元的话,按照上面的算法,至少需要1张6元的,4张1元的,而实际上最优的应该是2张5元的。

所以贪心算法是一种在某种范围内,局部最优的算法。

相关文章:

Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心

场景 1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解&#xff0c; 然后综合各个小问题&#xff0c;得到最终答案。 2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。 3、迭代法(Iterative Method) 无法使用公式一次…...

2个 windows 下的网络测试工具

环境windows 10 64bittcpingtcproute简介TCPing 和 TCProute 都是 windows 下的用于测试 TCP 连接的工具&#xff0c;它们可以帮助用户确定网络连接的可用性和响应时间。TCPing下载地址&#xff1a; https://elifulkerson.com/projects/tcping.phpTCPing 通过向目标主机发送 TC…...

HDU - 4734 -- F(x)

题目如下&#xff1a; For a decimal number x with n digits (AnAn−1An−2...A2A1)(A_nA_{n-1}A_{n-2} ... A_2A_1)(An​An−1​An−2​...A2​A1​), we define its weight as F(x)An∗2n−1An−1∗2n−2...A2∗2A1∗1.F(x) A_n * 2^{n-1} A_{n-1} * 2^{n-2} ... A_2 *…...

【音视频第10天】GCC论文阅读(1)

A Google Congestion Control Algorithm for Real-Time Communication draft-alvestrand-rmcat-congestion-03论文理解 看中文的GCC算法一脸懵。看一看英文版的&#xff0c;找一找感觉。 目录Abstract1. Introduction1.1 Mathematical notation conventions2. System model3.Fe…...

如何进行移动设备资产管理

随着越来越多的移动设备进入和访问组织的企业资源&#xff0c;管理员必须监视和控制对企业数据的访问。与传统工作站不同&#xff0c;传统工作站位于企业的物理工作区内&#xff0c;移动设备从多个位置使用&#xff0c;从而使移动资产管理过程更加复杂。 什么是移动资产管理 …...

使用国密SSL证书,实现SSL/TLS传输层国密改造

密码是保障网络空间安全可信的核心技术和基础支撑&#xff0c;通过自主可控的国产密码技术保护重要数据的安全&#xff0c;是有效提升我国信息安全保障水平的重要举措。因此&#xff0c;我国高度重视商用密码算法的应用并出台相关政策法规&#xff0c;大力推动国产商用密码算法…...

Oracle之增删改(六)

1、插入语句 insert into 表名(列名1&#xff0c;列名2,…&#xff09; values(值&#xff0c;值,…) insert into 关键字 列名&#xff08;要插入数据的列&#xff09;&#xff0c;可以省略&#xff0c;省略时表示给表中的每个字段都插入数据 value 赋值关键字 使用这种语法一…...

OJ练习第81题——岛屿数量

岛屿数量 力扣链接&#xff1a;200. 岛屿数量 题目描述 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向…...

remote gdb 操作流程

进行gdb调试时&#xff0c;tui可以方便地显示源代码、汇编和寄存器文本窗口。在进入gdb界面后&#xff0c;使用TUI快捷键&#xff08;ctrlXA&#xff09;可以打开/关闭tui。 出现"找不到源码"的提示时&#xff0c;可以通过dir加源码路径来设置源码查找路径&#xff…...

STM32基础代码学习G070CB串口透传调试(出厂默认)代码

先下载 一定记得回车换行勾选 可以参考“Quectel_BC260Y-CN_AT命令手册_V1.0.pdf” ATCGMI 查询制造商信息 ATCGMM 查询模块型号 ATCSQ 上报信号质量 ATCGATT? PS 域附着或去附着查看板子是否正常 再激活 ATQIACT1&#xff0c;最后查询ATQIACT? 配置阿里云mqtt atqmtc…...

介绍一款idea神级插件【Bito-ChatGPT】

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…...

pycharm 2021.2.2 版本之前试用期过了怎么办

pycharm 2021.2.2 版本之前试用期过了怎么办 虽然 jetbrains 的产品是商业收费&#xff0c;而且价格不菲&#xff0c;但官方还是为免费使用留下的空间&#xff0c;实在良心。 收费版可以免费试用30天&#xff0c;问题是30天试用期过后&#xff0c;怎么办&#xff0c;可以再次试…...

【通世智库】宁晓红:医疗更完整的样子

2022年的10月&#xff0c;北京协和医院缓和医学中心成立了&#xff0c;这是巨大的好消息&#xff01;北京协和医院连续13年蝉联中国医院排行榜榜首&#xff0c;它率先成立了缓和医学中心&#xff0c;可见缓和医疗在医学领域的重要地位和不可估量的价值。【作者&#xff1a;宁晓…...

AD20打开PCB后找不到

如出现下图情况 方法1 长按ctrl且滚轮下滑 方法2 依次点击视图 适合文件...

RTC 基础

简单的一个框架 一、上行 1.音频 音频采集->3A处理->混合(麦克风bgm自定义音频)->编码->fec->打网络包(UDT/QUIC/SRT)->加密->socket发送 2.视频 视频采集->编码->切片->fec->打网络包(UDT/QUIC/SRC)->加密->socket发送 二、下行…...

Quaternion插值方法

介绍 unity&#xff0c;四元数Quaternion插值方法介绍 方法 线性插值&#xff08;Lerp&#xff09;&#xff1a; 适用范围&#xff1a;适用于需要简单平滑地过渡的情况&#xff0c;比如物体的位置、大小等。 优点&#xff1a;计算简单&#xff0c;效率高。 缺点&#xff1a;不…...

如何配置Stash以便与4EVERLAND一起使用

What is Stash? AppsCode的Stash是一个可靠的工具&#xff0c;用于备份和恢复Kubernetes卷和应用程序。有了Stash&#xff0c;你可以通过定期备份和在数据丢失或系统故障时恢复这些数据来轻松保护你的宝贵数据。Stash功能多样&#xff0c;可用于备份各种Kubernetes资源的数据…...

webpack plugin源码解析(四) HashedModuleIdsPlugin

文章目录作用涉及 webpack API获取chunkGraph获取当前编译过程中被使用过的 module id&#xff1a;compilation.usedModuleIds获取当前编译过程中所有的模块对象&#xff1a;compilation.modules判断 module 是否需要生成 id&#xff1a;module.needId获取指定module 的 module…...

pytorch | 使用vmap对自定义函数进行并行化/ 向量化的执行

0. 参考 pytorch官方文档&#xff1a;https://pytorch.org/docs/stable/generated/torch.func.vmap.html#torch-func-vmap关于if语句如何执行&#xff1a;https://github.com/pytorch/functorch/issues/257 1. 问题背景 笔者现在需要执行如下的功能&#xff1a; root_ls [fu…...

Docker部署RabbitMQ(单机,集群,仲裁队列)

RabbitMQ部署指南 1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3-management方式二&#xff1a;从本地加载 在课前资料已经提供了镜像包&#xff1a; 上传到虚拟机中后&#xff0c;使用命令加载镜…...

生活污水处理设备选购指南

生活污水中含有大量的有机物&#xff08;如蛋白质、碳水化合物、脂肪、尿素、氨氮等&#xff09;及大量的病原微生物&#xff0c;可导致传染病蔓延流行。因此&#xff0c;生活污水在排放前&#xff0c;需要进行处理。那么如何正确的选择生活污水处理设备呢&#xff1f; 一、生活…...

奥威BI数据可视化大屏分享|多场景、多风格

数据可视化大屏一般应用在品牌推广展示、商务交流、数据分析决策、数据监控等场景&#xff0c;由此催生出各种不同风格的BI数据可视化大屏设计。下面就从奥威BI软件的BI报表模板中截取几个有着不同风格&#xff0c;起着不同作用的BI数据可视化大屏报表&#xff0c;一起来了解一…...

超越时空:加速预训练语言模型的训练

超越时空&#xff1a;加速预训练语言模型的训练 随着自然语言处理&#xff08;NLP&#xff09;领域的快速发展&#xff0c;预训练语言模型&#xff08;PTLM&#xff09;已成为许多NLP任务的重要基石&#xff0c;如文本生成、情感分析、文本分类等。然而&#xff0c;传统的PTLM…...

数据库管理系统PostgreSQL部署安装完整教程

PostgreSQL是一个开源的关系型数据库管理系统&#xff0c;它支持大量的数据类型和复杂的查询语言&#xff0c;可以用于各种应用程序。它是一个高性能的数据库&#xff0c;可以处理大量的数据&#xff0c;并且具有良好的可扩展性和可靠性。 目录 一.Linux系统安装PostgresSQL&a…...

有学生问我,重构是什么?我应该如何回答?

重构到底是什么&#xff1f;只是代码的推倒重新编码&#xff1f;还是有规则、有方法可寻&#xff1f;当然&#xff0c;结论肯定是有的&#xff0c;本文&#xff0c;我们通过一个简单的实例&#xff0c;来理解一下重构。 1.借助一个实例需求 这是一个影片出租店用的程序&#…...

交际场合---英文单词

目录 前言原文邀请生日和聚会离别探病婚礼新居落成葬礼聚会相关单词婚礼相关单词乔迁相关单词丧礼相关单词前言 加油 原文 邀请 1.invite[ɪnˈvaɪt]vt. 邀请 invitation [ˌɪnvəˈteʃən] n. 邀请;邀请函 invite sb to v. 邀请某人从事…… accept / decline /…...

【网络安全】文件上传漏洞及中国蚁剑安装

文件上传漏洞描述中国蚁剑安装1. 官网下载源码和加载器2.解压至同一目录并3.安装4.可能会出现的错误文件上传过程必要条件代码示例dvwa靶场攻击示例1.书写一句话密码进行上传2. 拼接上传地址3.使用中国蚁剑链接webshell前端js绕过方式服务端校验请求头中content-type黑名单绕过…...

[Java]面向对象高级篇

文章目录包装类包装类层次结构基本类型包装类特殊包装类数组一维数组多维数组可变长参数字符串String类StringBuilder类内部类成员内部类静态内部类局部内部类匿名内部类Lambda表达式方法引用异常机制自定义异常抛出异常异常的处理常用工具类数学工具类随机数数组工具类包装类 …...

苹果应用商店上架流程

上架过程分七个步骤&#xff0c;按步骤一步步来。 仔细看这个流程&#xff0c;少走很多弯路&#xff0c;不用一步步去试错&#xff0c;新手也能快速掌握上架流程。 1、创建APP身份证&#xff08;App IDs&#xff09; 2、申请iOS发布证书 3、申请iOS发布描述文件 4、上传ios证…...

基于Eclipse下使用arm gcc开发GD32调用printf

系列目录 第一章 xxx 目录 系列目录 文章目录 文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结前言 开发环境&#xff1a;Eclipse代替Keil&#xff0c;IAR 开发平台&#xff1a;GD32 开发编译器&#xff1a;arm-none-eabi- …...