数据结构----算法--五大基本算法(这里没有写分支限界法)和银行家算法

news2024/11/16 15:52:50

数据结构----算法–五大基本算法(这里没有写分支限界法)和银行家算法

一.贪心算法

1.什么是贪心算法

在有多个选择的时候不考虑长远的情况,只考虑眼前的这一步,在眼前这一步选择当前的最好的方案

二.分治法

1.分治的概念

分治法:分而治之

将一个问题拆解成若干个解决方式完全相同的问题

满足分治的四个条件

1.问题难度随着数据规模缩小而降低

2.问题可拆分

3.子问题间相互独立

4.子问题的解可合并

2.典型的分治:二分查找(折半搜索) BinaryChop

前提:有序
时间复杂度O(log2的n次方)
1.循环实现二分查找
//循环
int BinaryChop1(int a[], int begin, int end ,int find) {
	if (a == nullptr || begin > end) return -1;
	while (begin<= end) {
		int mid = begin+(end- begin)/2 ;
		if (a[mid] == find) {
			cout << "找到了,返回在数组中的下标" << endl;
			return mid;
		}
		else if (a[mid] < find) {
			begin = mid + 1;
		}
		else if (a[mid] > find) {
			end = mid - 1;
		}
		
	}
	return -1;
}
2.递归实现二分查找
//递归
int BinaryChop2(int a[], int begin, int end, int find) {
	
	if (a == nullptr || begin > end) return -1;
	int mid = begin+(end- begin)/2;
	if (a[mid] == find) {
		cout << "找到了,返回数组下标" << endl;
		return mid;
	}
	else if (a[mid] < find) {
		begin = mid + 1;
	}
	else if (a[mid] > find) {
		end = mid - 1;
	}

	

	return BinaryChop2(a, begin, end, find);

}

三.回溯法

1.回溯法解决的问题

1.求子集的问题

2.求排列的问题

3.求集合的问题

4.求棋盘的问题

2.回溯常见的写法

循环嵌套递归

3.用回溯法解决一道全排列的问题(此题的网址为https://leetcode.cn/problems/permutations/)

此题在之前的博客中具体分析过(博客的网址如下https://blog.csdn.net/m0_73483024/article/details/133589061?spm=1001.2014.3001.5502)

题目:

四.动态规划(Dynamic Programming)

1.动态规划可以解决的问题

动态规划可以用来求最优解(最大、最小、最多等)的问题

2.动态规划操作对象所要满足的性质

大问题可以拆解成解决方案完全相同的子问题,并且要满足以下两个性质

1.满足最优子结构性质(子问题的最优解构成当前问题的最优解)

2.无后效性(一旦某一状态被确定,那么过去这个状态如何求得的我们就再也不关注了)

3.动态规划的求解过程

1.拆分

2.定状态(子问题的最优解)

3.做决策

4.求状态转移方程

4.动态规划的实现手段

1.自顶向下带备忘的解法(大到小)

2.自底向上的解法(小到大)

注意:动态规划的空间消耗是用来换时间了

5.关于动态规划的问题

1.凑钱问题
题目:

有1元,3元,5元面额的钞票,想要凑到n元钱

解决方法:

创建一个f数组

f(n)表示想要凑到n元钱所需要的最小的钞票数

我们观察下面式子,找出规律

f(0)=0

f(1)=f(1-1)+1=1

f(2)=f(2-1)+1=2

f(3)=min{f(3-3)+1=1,f(3-1)+1=3}=1

f(4)=min{f(4-3)+1=2,f(4-1)+1=2}=2

f(5)=min{f(5-5)+1=1,f(5-3)+1=3,f(5-1)+1=3}=1

推导出动态转移方程得

f(i)=min{f(i-v[j])}+1(v[j]<=i)

这里v是一个存1元,3元,5元面额的钞票的数组,j是遍历v数组的变量

2.一维的动态划分问题:最长递增子序列(LIS)
题目:

有一个数组中有6、3、9、8、4、7、2、5、10、1这些元素,找到这个数组中的最长递增子序列

解决方法:
方法一

创建一个f数组

f(n)表示n下标与前序元素构成的LIS的长度

我们观察下面式子,找出规律

f(0)=1

f(1)=1

f(2)=max{9>3 f(1)+1=2

​ 9>6 f(0)+1=2

​ 1(只有自己本身,长度为1)

​ }=2

f(3)=max{8>3 f(1)+1=2

​ 8>6 f(0)+1=2

​ 1(只有自己本身,长度为1)

​ }=2

f(4)=max{4>3 f(1)+1=2

​ 1(只有自己本身,长度为1)

​ }=2

f(5)=max{7>4 f(4)+1=3

​ 7>3 f(1)+1=2

​ 7>6 f(0)+1=2

​ 1(只有自己本身,长度为1)

​ }=3

推导出动态转移方程得

f(i)=max(f(j)+1,1) (v[j]<v[i],0<=j<i)

这里v是数组,i和j是遍历v数组的变量

方法二(相较于方法一优化)

创建一个数组用来存等长LIS右边界的最小值(下标当作长度)

从左到右遍历数组,对创建的数组进行更新,最后数组的使用量就是最长递增子序列的长度

看下面进行理解

f(0)=1

在这里插入图片描述

f(1)=1

在这里插入图片描述

f(2)=2

在这里插入图片描述

f(3)=2

在这里插入图片描述

f(4)=2

在这里插入图片描述

f(5)=3

在这里插入图片描述

下面的过程就不再写了

方法三(在方法二的基础上,进行二分搜索,在进行数组的更新时使用二分搜索)
3.二维的动态规划问题:捡苹果
题目:

有一个m*n的格子,每个格子中有数量不一的苹果,一个小机器人(只能往右或者往下走)从左上角走到它不能再走了,求它最多能捡到多少个苹果

解决:

状态转移方程为 c[i] [j]=max{c[i-1] [j],c[i] [j-1]}+A[i] [j]

c数组存的是到每个位置所能捡到的最大苹果数量,A数组存的是每个位置的苹果数量

4.二维的动态规划问题且带附加条件的:最长公共子序列(LCS)
题目:

求X数组{A,B,B,D,C,B,C}与Y数组{B,C,D,B,A,C}的最长公共子序列

解决:

状态转移方程为 c[i] [j]={c[i-1] [j-1]+1 xi==yi

​ max{c[i-1] [j],c[i] [j-1]}} xi!=yi

​ }

c数组存的是x数组走到数组中的某个元素和y数组走到数组中的某个元素时,二者所构成的LCS的长度

c[i] [j]存的是x数组走到第i个元素,y数组走到第j个元素,二者所构成的LCS的长度

四.博弈树

1.博弈树(Game Tree)

棋类中用到的博弈树满足的条件

1.二者零和

2.全信息

3.非偶然

注意:博弈树要在时间消耗和结果准确度中做一个平衡

2.极大极小搜索树(是在原有博弈树的基础上实现的)

看下面这张图理解博弈树

甲是自己要选择尽量大的

乙是对手要使我们最小,所以乙选择尽量小的

在这里插入图片描述

3.α-β剪枝(对极大极小树的优化)

看下面图片(都是部分图,不是完整的)理解α-β剪枝

图片一

注意:这是一个深搜过程(图中数字表示处理的步骤)

在这里插入图片描述

当此图第4步得到的值小于第3步得到的值,那么第5步就不用处理了

图片二

在这里插入图片描述

注意:这是一个深搜过程(图中数字表示处理的步骤)

当此图第9步得到的值大于第7步得到的值,那么第11步和第12步就不用处理了

五.银行家算法

1.使用银行家算法要满足的条件

1.固定数量的进程共享固定数量的资源

2.进程最大请求资源数

3.单次申请的资源数不能超出可分配资源数

4.不是一次性全部申请,分批次进行

5.进程等待资源的时间是有限的(不会无休止等待)

6.当满足进程的最大资源需求,进程应该在有限时间内归还资源

2.银行家算法的操作步骤

A:总资产

B:所需的最大资源数

C:已经分配的资源数

D:仍然需要的资源数

E:每次请求的资源数

F:可分配的资源数

1.看E<=F是否满足

​ 如果不满足就等待

​ 如果满足就进行下一步

2.看E<=D是否满足

​ 如果不满足,失败

​ 如果满足就进行下一步

3.假装分配,更新各个值

​ C=C+E

​ D=D-E

​ F=F-E

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6-8 舞伴问题 分数 15

void DancePartner(DataType dancer[], int num) {LinkQueue maleQueue SetNullQueue_Link();LinkQueue femaleQueue SetNullQueue_Link();// 将男士和女士的信息分别加入对应的队列for (int i 0; i < num; i) {if (dancer[i].sex M){EnQueue_link(maleQueue, dancer[i]…

Vue跨域配置

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 配置详情 请在项目的vue.config.js中通过proxy的配置&#xff0c;解决Vue跨域&#xff1b;代码如下&#xff1a; const { defineConfig } require(vue/cli-service) modu…

用JavaScript输出0-9的两种方法、以及setTimeout的三个参数的意义

方法一&#xff1a; for (let i 0; i < 10; i) {setTimeout(() > {console.log(i);}, 1000) } 方法二&#xff1a;利用 setTimeout 函数的第三个参数&#xff0c;会作为回调函数的第一个参数传入 for (var i 0; i < 10; i) {setTimeout(i > {console.log(i);…

canvas画布中beginPath和closePath的作用要点

1.画笔画完一个图案后&#xff0c;立即又回到了原点&#xff0c;所以下次如果没有beginPath&#xff0c;就会从原点重新开始 2.beginPath相当于让画笔从原点抬起&#xff0c;重新开始一个新路径&#xff0c;不重复走之前的路径&#xff0c;所以不会覆盖之前的路径 3.closePat…

通过IP地址查询避免电子招投标串标的方法

随着电子招投标的广泛应用&#xff0c;诚实和公平的竞争变得至关重要。然而&#xff0c;一些不道德的投标者可能试图串通以获取不正当的竞争优势。为了解决这个问题&#xff0c;可以利用IP地址查控技术&#xff0c;确保电子招投标的公平性和透明性。本文将介绍如何通过IP地址查…

XCode15与iOS17/17.1 真机测试问题处理

XCode15与iOS17/17.1 真机测试问题处理&#xff0c;网上相关博客很多&#xff0c;摘录了如下实践后能起作用的地址如下&#xff1a;Xcode 15 报错处理 - 简书iOS17版本适配-CSDN博客 Xcode15适配-六虎 主要介绍下&#xff1a;Assertion failure in void _UIGraphicsBeginImag…

【AI视野·今日Sound 声学论文速览 第二十六期】Mon, 16 Oct 2023

AI视野今日CS.Sound 声学论文速览 Mon, 16 Oct 2023 Totally 7 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Low-latency Speech Enhancement via Speech Token Generation Authors Huaying Xue, Xiulian Peng, Yan Lu现有的基于深度学习的语音增强…

VirtualBox安装时提示失败(未解决)

似乎是升级6.1.48的时候&#xff0c;提示签名有问题。重启后就这样了。 卸载1&#xff1a; 卸载2 修复式安装

【AI视野·今日Robot 机器人论文速览 第五十五期】Mon, 16 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 16 Oct 2023 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;***AcTExplore, 对于未知物体的主动触觉感知。基于强化学习自动探索物体的表面形貌&#xff0c;增量式重建。(from 马里兰…

Linear、Logistic回归

线性回归 线性回归的目标是找到最佳拟合线&#xff0c;以使观测数据点与该线的残差&#xff08;实际值与预测值之间的差异&#xff09;最小化。线性回归通常用于探索变量之间的趋势、预测未来数值&#xff0c;或者用于发现因果关系。 简单实例&#xff08;波士顿房价&#xff…

文创品经营商城小程序的作用是什么

如今私域流量运营成为各商家增加的新方式&#xff0c;而在转化链路中&#xff0c;私域商城是重要的节点。 通过【雨科】平台搭建文创品小程序商城全面展示产品&#xff0c;赋能客户随时购物需求&#xff0c;摆脱第三方限制&#xff0c;自营增强生意、拓展品牌&#xff0c;分类式…

中断:Zynq Uart中断的流程和例程~UG585的CH.19

Zynq里的uart UART 控制器是全双工异步接收器和发送器&#xff0c;支持多种可编程波特率和 I/O 信号格式。该控制器可以适应自动奇偶校验生成和多主机检测模式。 UART 操作由配置和模式寄存器控制。使用状态、中断状态和调制解调器状态寄存器读取 FIFO、调制解调器信号…

10.18作业

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…

在ts中val is Map是什么意思呢?

最近在学习vue3的源码&#xff0c;顺便也在学习ts&#xff0c;就记录一下自己学习中的困惑吧 export const isArray Array.isArray export const isMap (val: unknown): val is Map<any, any> >toTypeString(val) [object Map] export const isSet (val: unknow…

【极速发表】2-4区SCI (含CCF),平均录用周期仅2个月,最快11天见刊!

一、计算机科学类SCI (11.30截稿) 【期刊概况】IF:4.0-5.0, JCR2区&#xff0c;中科院3区&#xff1b; 【检索情况】SCI在检&#xff0c;正刊&#xff1b; 【国人占比】10.58%&#xff1b; 【自引率】7.50%&#xff1b; 【年发文量】100篇以下&#xff1b; 【预警情况】无…

微服务负载均衡实践

概述 本文介绍微服务的服务调用和负载均衡&#xff0c;使用spring cloud的loadbalancer及openfeign两种技术来实现。 本文的操作是在微服务的初步使用的基础上进行。 环境说明 jdk1.8 maven3.6.3 mysql8 spring cloud2021.0.8 spring boot2.7.12 idea2022 步骤 改造Eu…

华为Atlas 200I DK A2开发者套件--基础使用配置

文章目录 前言一、快速开始二、通过路由器联网三、USB相机总结 前言 Atlas 200I DK A2基础使用配置方法。准备好键鼠、显示器、网线、USB拓展器。 一、快速开始 下载最新官方Windows版本昇腾开发者套件一键制卡工具&#xff1a; https://ascend-repo.obs.cn-east-2.myhuaweic…

消除隐患 防患未然|AIRIOT智慧消防管理解决方案

随着科技的飞速发展和城市化进程的不断推进&#xff0c;消防安全问题逐渐凸显。传统消防手段在应对现代复杂多变的火灾事故时显得力不从心&#xff0c;面临着许多挑战和弊端&#xff1a; 监控能力不足&#xff1a;传统消防手段通常依赖于人力监控和报警系统&#xff0c;如消防员…

SpringBoot前后端分离jar包nginx配置https访问

背景&#xff1a;做微信支付回调需要用到https域名&#xff0c;服务器是linux系统&#xff0c;用nginx做反向代理 准备&#xff1a;阿里云、腾讯云或者自己生成的SSL证书&#xff0c;java是8086端口 一&#xff1a;安装nginx&#xff0c;以前博客有记录 二&#xff1a;安装SS…

MySQL学习路线

1 学习路线图 2 参考的文档&#xff1a; 民工哥技术之路菜鸟教程