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、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解, 然后综合各个小问题,得到最终答案。 2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。 3、迭代法(Iterative Method) 无法使用公式一次…...
2个 windows 下的网络测试工具
环境windows 10 64bittcpingtcproute简介TCPing 和 TCProute 都是 windows 下的用于测试 TCP 连接的工具,它们可以帮助用户确定网络连接的可用性和响应时间。TCPing下载地址: https://elifulkerson.com/projects/tcping.phpTCPing 通过向目标主机发送 TC…...
HDU - 4734 -- F(x)
题目如下: For a decimal number x with n digits (AnAn−1An−2...A2A1)(A_nA_{n-1}A_{n-2} ... A_2A_1)(AnAn−1An−2...A2A1), 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算法一脸懵。看一看英文版的,找一找感觉。 目录Abstract1. Introduction1.1 Mathematical notation conventions2. System model3.Fe…...

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

使用国密SSL证书,实现SSL/TLS传输层国密改造
密码是保障网络空间安全可信的核心技术和基础支撑,通过自主可控的国产密码技术保护重要数据的安全,是有效提升我国信息安全保障水平的重要举措。因此,我国高度重视商用密码算法的应用并出台相关政策法规,大力推动国产商用密码算法…...
Oracle之增删改(六)
1、插入语句 insert into 表名(列名1,列名2,…) values(值,值,…) insert into 关键字 列名(要插入数据的列),可以省略,省略时表示给表中的每个字段都插入数据 value 赋值关键字 使用这种语法一…...
OJ练习第81题——岛屿数量
岛屿数量 力扣链接:200. 岛屿数量 题目描述 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向…...
remote gdb 操作流程
进行gdb调试时,tui可以方便地显示源代码、汇编和寄存器文本窗口。在进入gdb界面后,使用TUI快捷键(ctrlXA)可以打开/关闭tui。 出现"找不到源码"的提示时,可以通过dir加源码路径来设置源码查找路径ÿ…...

STM32基础代码学习G070CB串口透传调试(出厂默认)代码
先下载 一定记得回车换行勾选 可以参考“Quectel_BC260Y-CN_AT命令手册_V1.0.pdf” ATCGMI 查询制造商信息 ATCGMM 查询模块型号 ATCSQ 上报信号质量 ATCGATT? PS 域附着或去附着查看板子是否正常 再激活 ATQIACT1,最后查询ATQIACT? 配置阿里云mqtt atqmtc…...

介绍一款idea神级插件【Bito-ChatGPT】
什么是Bito? Bito是一款在IntelliJ IDEA编辑器中的插件,Bito插件是由ChatGPT团队开发的,它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队,他们开发了一款基于GPT的自然语言处理…...
pycharm 2021.2.2 版本之前试用期过了怎么办
pycharm 2021.2.2 版本之前试用期过了怎么办 虽然 jetbrains 的产品是商业收费,而且价格不菲,但官方还是为免费使用留下的空间,实在良心。 收费版可以免费试用30天,问题是30天试用期过后,怎么办,可以再次试…...

【通世智库】宁晓红:医疗更完整的样子
2022年的10月,北京协和医院缓和医学中心成立了,这是巨大的好消息!北京协和医院连续13年蝉联中国医院排行榜榜首,它率先成立了缓和医学中心,可见缓和医疗在医学领域的重要地位和不可估量的价值。【作者:宁晓…...

AD20打开PCB后找不到
如出现下图情况 方法1 长按ctrl且滚轮下滑 方法2 依次点击视图 适合文件...
RTC 基础
简单的一个框架 一、上行 1.音频 音频采集->3A处理->混合(麦克风bgm自定义音频)->编码->fec->打网络包(UDT/QUIC/SRT)->加密->socket发送 2.视频 视频采集->编码->切片->fec->打网络包(UDT/QUIC/SRC)->加密->socket发送 二、下行…...
Quaternion插值方法
介绍 unity,四元数Quaternion插值方法介绍 方法 线性插值(Lerp): 适用范围:适用于需要简单平滑地过渡的情况,比如物体的位置、大小等。 优点:计算简单,效率高。 缺点:不…...
如何配置Stash以便与4EVERLAND一起使用
What is Stash? AppsCode的Stash是一个可靠的工具,用于备份和恢复Kubernetes卷和应用程序。有了Stash,你可以通过定期备份和在数据丢失或系统故障时恢复这些数据来轻松保护你的宝贵数据。Stash功能多样,可用于备份各种Kubernetes资源的数据…...

webpack plugin源码解析(四) HashedModuleIdsPlugin
文章目录作用涉及 webpack API获取chunkGraph获取当前编译过程中被使用过的 module id:compilation.usedModuleIds获取当前编译过程中所有的模块对象:compilation.modules判断 module 是否需要生成 id:module.needId获取指定module 的 module…...
pytorch | 使用vmap对自定义函数进行并行化/ 向量化的执行
0. 参考 pytorch官方文档:https://pytorch.org/docs/stable/generated/torch.func.vmap.html#torch-func-vmap关于if语句如何执行:https://github.com/pytorch/functorch/issues/257 1. 问题背景 笔者现在需要执行如下的功能: root_ls [fu…...

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

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...