【算法设计zxd】第6章 回溯法

目录

6.1 回溯法的设计技术 :

四皇后问题

回溯法:

算法框架:

思考题:

回溯算法的适用条件

【例6-1】求满足下列不等式的所有整数解:

6.2回溯算法的经典例题

【例6-2】装载问题

 问题分析

 计算模型

 算法设计与描述

算法分析:

代码:

【例6-3】n皇后问题。

 问题分析 算法思想详见开篇。

 计算模型

 算法设计与描述

 算法分析

另一种:随机算法

【例6-4】 0-1背包问题。

 问题分析

 数学模型

 计算模型

 算法设计与描述

 算法分析

代码:

【例6-5】旅行商问题(Traveling Salesman Problem,简称TSP)。

 问题分析

 计算模型

算法设计与描述:

小结

分支限界法的设计技术

分支限界法:

 约束条件

 剪枝

 分支限界法的设计步骤

思考题:

【例6-6】装载问题。

 计算模型

【例6-7】背包

 问题分析

 问题分析

计算模型

 计算模型

 算法设计与描述

【例6-8】旅行商问题(Traveling Salesman Problem,TSP):

 问题分析

 计算模型

 算法设计与描述


6.1 回溯法的设计技术 :

活结点:可以生成子节点
扩展结点:
死结点:不能再进行子节点生成的

回溯法:

约束条件下对解空间树进行深度优先搜索的过程,
并在搜索过程中去那些不满足条件的分支。
问题的解
为n元组(X 1 ,…,X i ,…X n ),其中X i 选自有限集S ·
当选出一组值X=(x 1 ,…,x i ,…x n )能够使评价函数P(x 1 ,…,x i ,…x n ) 满足问题的某种约束条件或到达极值。
基本策略
每次只考虑一个分量,逐次扩大建立n元组,
并随时用评价函数P i (X 1 ,…,X i ,…X n)去判断正在形成的n元组是否有成功的希望,
一旦确定部分元组(X 1 , … ,X i)不能求出解时,则立即停止这种搜索,“剪掉”以当前结点为
根的分枝,
并逐次向上一个分量回溯,
然后向其它分支继续探索

算法框架:

(1) 开始结点 是一个活结点,也是一个 扩展结点
(2) 如果能从当前的扩展结点移动到一个新的结点,那么这
个新结点将变成一个活结点和可扩展结点,旧的扩展结点
仍是一个活结点。
(3) 如果不能移动到一个新结点(已经找到一个解或违反约
束的情况),当前的扩展结点就变成了一个 死结点 ,便只能
返回到最近被考察的活结点(回溯),这个活结点就变成了新
的扩展结点。
(4) 当找到了最优解或者没有活结点的时候(回溯尽了所有的活结点),搜索过程结束
回溯的递归框架回溯的非递归模式
输入:n
输出:所有的解x[]

int x[n],i=1;
search(int i)
{
    if(i>n)//递归出口

       输出结果;
    else//枚举所有可能的路径 
    { 
        for(j=下界;j<=上界;j=j+1)//当前结点的子节点的同一层
        {
            //满足 界限函数和约束条件
            if(P(j))//
            {//深度 下一层
                x[i]=j;//将符合要求的结点的编号,存储到解的数组里
                ...//其他操作
                search(i+1);
                回溯前的清理工作;//再进行for循环 下一个结点
            } 
        } 
    } 
}


int x[n],i=1;
//还未回溯到头, i为真 表示有路可走 
while(i&&(未达到目标) )
{
    if(i>n)//搜索到叶节点 
        搜索到一个解,输出;
    else//处理第i个元素 
    { 
        x[i]第一个可能的值;
        //x[i]不满足约束条件,但在搜索空间内
        while( !P(x[i]) && x[i]在搜索空间内 ) 
            x[i]下一个可能的值;
            
        if( x[i]在搜索空间内)
        {
            标识占用的资源;
            i=i+1;//扩展下一个结点 
        }
        else
        {
            清理所占的状态空间;
            i=i-1;//回溯 
        } 
        
    } 
}

思考题1:

(1)不是唯一, n元组 

(3)剪枝:判断是否满足约束条件。执行:将结点标为死结点。

回溯算法的适用条件

多米诺性质
设向量X i =<x 1 , x 2 ,…,x i >,X i \subseteq X,X = < x 1 , x 2 ,…,x i ,…,x n >,
将X i 输入评价函数P,可以得到X i 的一组 特征值P(X i ),
取X i+1 =<x 1 , x 2 ,…,x i , x i+1 >【增加一个元素】,Xi+1 \subseteq X,则P(Xi+1) 真蕴涵P(X i ),即

 P(Xi+1) ->  P(Xi)   i∈(0,n) ,其中,n代表解向量的维数。

【子集,否则可能丢解】

【例6-1】求满足下列不等式的所有整数解:

解:令X i =<x 1 , x 2 ,…,x i >,P(X i )为对X i 的评估,判断其Xi是否满
足不等式,即P(X i ) ≤10。依据题目可知,本例中向量为一个三元
组< x 1 , x 2 , x 3 >

【丢解】

 当x1=1、x2=2时, P(x1 ,x2 )= 5x1+4x2=5*1+4*2=13>10 不满足约束条件,分支x2=2将被剪去

然而,当x 1 =1、x 2 =2、x 3=3时, P(x 1 ,x 2 ,x 3 )= 5x 1 +4x 2 - x 3=5*1+4*2 - 3=10 满足约束条件,即<1, 2, 3>是不等式的解,
显然,此例中P(X 3 )不真蕴涵P(X 2),违反了多米诺性质,从而丢解了。

【解决】

如果令x’3=4-x3 ,将原不等式变换为:5x1+4x2+x’3≤14 1≤xi , x’3≤3 i=1, 2

则该不等式满足多米诺性质,可以使用回溯法,对所得到的解x 1 、x 2 、x’ 3
换成原不等式的解x 1 、x 2 、x 3 即可。

代码:

#include<iostream>
using namespace std;//
int n=3;
int x[3]={1,1,1};void show(int a[]) 
{for(int i=0;i<n;i++)cout<<a[i]<<"\t";cout<<endl<<endl;
}//约束条件
bool P(int x[],int i)//表示第几层 
{switch(i){case 0: if(5*x[0]<=14)return true;else return false;case 1:if(5*x[0]+4*x[1]<=14)return true;else return false;case 2:if(5*x[0]+4*x[1]+x[2]<=14)return true;else return false;}} void fun(int i)
{
//	cout<<i<<"c"<<endl;
//	show(x);if(i>n-1)//已经结束了最后一个数 {
//		cout<<"结果:";show(x);return;//结束最后一层,回溯到上一层 }//若不变 if(P(x,i)&&x[i]<4)//符合约束条件 {x[i]=1;fun(i+1); //下一层 }//若2if(P(x,i)&&x[i]<4)//符合约束条件 {int t=x[i];x[i]=2;fun(i+1); //下一层 x[i]=t;//回复 }//若3if(P(x,i)&&x[i]<4)//符合约束条件 {int t=x[i];x[i]=3; fun(i+1); //下一层 x[i]=t;//回溯后,本层尝试下一个可能 } 
}int main()
{fun(0);return 0;} 
/*
1       1       11       1       21       1       31       2       11       2       21       2       3
*/

6.2回溯算法的经典例题

【例6-2】装载问题

有n个集装箱要装上一艘载重量为c的轮船,其中,集装箱i的重量为w i 。找出一种最优装载方案,让轮船尽可能多装集装箱,即在装载体积不受限制的情况下,尽可能使轮船满载

 问题分析

设集装箱数量n=5,轮船载重c=10,集装箱的重量w={7,2,6,5,4}

对于n个集装箱的装载问题,可将该问题的解定义为一个n元组
(x 1 ,…,x i ,…x n ), i∈Z, 1≤i≤n, x i ∈{0,1},
x i =1表示装入集装箱i,x i=0表 示不装入集装箱i。

 其中,wi 表示第i个集装箱的重量。

满足多米诺条件

 计算模型

1. 数据结构定义
 静态数据结构:
轮船载重量为c,集装箱数量为n,集装箱重量数组 w[],这些变量在运算中不会发生改变。
 动态数据结构:
i表示搜索的层数,加入一个集装箱后计算出的当前 载重量nowc、当前解x[]、当前最优重量maxc、当前最优解maxx[], 剩余的集装箱重量r(初值为全部集装箱重量),
这些值都是边测试 边生成的,当所有计算全部完成后,maxc和maxx[]就是题目要求的 最优值和最优解。
2. 迭代公式

 算法设计与描述

输入:c, n, w[]
输出:最优值maxc和最优解maxx[]
void search (int i){ /*递归法*/if(i>n){//搜索完if(nowc>maxc){//现在重量值maxc=nowc;for(int j=1;j<=n;j++)maxx[j]=x[j];}return;}//剩余量 r=r-w[i]; //搜索第i层,同时减少可用量//若不装,则岸上重量减去if(nowc+w[i]<=c){ //满足约束,左子树x[i]=1;nowc=nowc+w[i];search(i+1);//递归搜索i+1层nowc=nowc-w[i];//回溯后恢复nowc} /*下面开始搜索右子树*/if(nowc+r>maxc){ /*大于当前最优*/x[i]=0;search(i+1); //递归搜索i+1层}r=r+w[i];//对第i层搜索完毕,恢复r
}

算法分析:

(1)由算法设计与描述推导
T(1) = 2T(1) //集装箱1选择与不选择
2T(1) = 2*2T(1)=2^ 2 T(1)
……
2 ^( n-1) T(1) = 2*2^( n-1) T(1) = 2^ n T(1)
T(n) = T(1)+ 2T(1)+ 2^ 2 T(1)+……+2^ n T(1)
= T(1)*(2^( n+1)  – 1)≤2×2^ n =O(2^ n )
(2) 由选择树推导
结点数为: 1+2+2^ 2 +……+2^ n
=2^( n+1)  - 1≤ 2×2^ n =O(2^ n )

代码:

#include<iostream>
using namespace std;int n=5;//集装箱数量 
int c=10;//轮船载重
int w[]={7,2,6,5,4};//集装箱的重量int nowc=0;//当前载重量 
int x[5];//当前解
int maxc=0;//当前最优重量 
int maxx[5]; //当前最优解
int r=7+2+6+5+4;//剩余集装箱的总重量 void show(int a[]) 
{for(int i=0;i<n;i++)cout<<a[i]<<"\t";cout<<endl<<endl;
}void search (int i){ /*递归法*/if(i>n-1){//搜索完 递归出口 if(nowc>maxc){//现在重量值>当前最优 //更新最优解 maxc=nowc;//记录最优解的路径 for(int j=1;j<=n;j++)maxx[j]=x[j];}return;//结束最后一层的函数,回溯到上一层进行递归调用 }r=r-w[i]; //此时 陆地上集装箱的剩余重量 //若不装,则岸上重量减去if(nowc+w[i]<=c){ //满足约束(小于轮船载重量),左子树x[i]=1;nowc=nowc+w[i];search(i+1);//递归搜索i+1层nowc=nowc-w[i];//回溯后恢复nowc//回到上一层 }/*下面开始搜索右子树 *///右子树是否需要递归if(nowc+r>maxc){ /*上界函数 此时当前轮船已载重量+剩余集装箱重量 > 当前最优*/x[i]=0;search(i+1); //递归搜索i+1层}//否则不进行递归,也就是可以确认为死结点 r=r+w[i];//对第i层搜索完毕,恢复r//陆地上增加 
}int main()
{search(0);//从第1层开始 cout<<maxc<<endl;show(maxx);return 0;
}

【例6-3】n皇后问题。

在n*n的棋盘上放置相互攻击不到的n个皇后。
国际象棋规则:任意两个皇后之间不能处在同一行、同一列和同一斜线上,否则皇后间就可以相互攻击。
请给出满足条件的所有方案。

 问题分析 算法思想详见开篇。

 计算模型

(1)数据结构
        皇后数量为n; sum为可行解的数量。
        x[]记录皇后的摆放位置,下标为皇后所在行,值为列。
/*若数组下标 参与运算,会大大遍历*/
(2)计算模型

其中,式(2)与式(3)共同构成了对式(1)中所取得的值的一个评价,所以可以统称式(2)和式(3)为评价函数P。

 算法设计与描述

输入:皇后的数量n
输出:皇后的摆放位置x[],可以有多组

/*判断当前格局x[1...i],是否符合约束*/
bool ok(int i){for(int j=1;j<i;j++)//值相等 或 在对角线上 if(x[i]==x[j]||(abs(x[i]-x[j])==(i-j)))return false;return true;
}void queen(int i){if(i>n){//找到可行解for(int j=1;j<=n;j++)printf("%-5d",x[j]);printf("\n");sum=sum+1;//可行解数目+1 }for(int j=1;j<=n;j++){//每一层都有n个元素 x[i]=j;if(ok(i))//如果满足约束queen(i+1);//搜索第i+1层//否则就结束在这一层 }
}

 算法分析

由选择树可知:

由ok函数:

时间复杂度为:

另一种:随机算法

程序设计可能很麻烦,实际实现效率非常差。
回溯和随机相结合——更好

【例6-4】 0-1背包问题。

已知有n件物品,物品i的重量为wi、价值为pi。现从 中选取一部分物品装入一个背包内,背包最多可容纳的总重量是m,如何选择才能使得物品的总价值最大

问题分析

物品数量n=3
物品重量w={10,20,30}
物品价值p={60,100,120}
背包承重m=50

 数学模型

pi第i个物品价值>0,xi第i个物品是否被选择[0,1]

 计算模型

1. 数据结构
背包容量m,物品数量n,物品重量数组w[],物品价值数组p[]。
当前背包重量bagw,当前背包总价bagp,当前最优解x[]
当前最优总价值maxp,最优解maxx[],可用的物品价值r。
2. 迭代公式

算法设计与描述

void bag(int i){
        if(i>n){
                if(bagp>maxp){
                        maxp=bagp;
                        for(int j=1;j<=n;j++){
                                maxx[j]=x[j];
                        }
                }
                return;
        }
        r=r-p[i]; //对第i层进行搜索,用r减少
        if(bagw+w[i]<=m){ //满足约束
                x[i]=1;
                bagw=bagw+w[i];
                bagp=bagp+p[i];
                bag(i+1);
                bagw=bagw-w[i]; //回溯后恢复bagw
                bagp=bagp-p[i]; //回溯后恢复bagp
        }
        if(bagp+r>maxp){ //搜索右子树
                x[i]=0;
                bag(i+1);
        }
        r=r+p[i]; //对第i层进行搜索回来,恢复r
}

算法分析

思考题:

蛮力法 回溯法
区别回溯法有对右子树的剪枝
时间渐进复杂度T(n)=O(2^n)T(n)=O(2^n)
区别在实际运算中,同样情况下回溯法的时间复杂度优于蛮力法,回溯法最坏情况下的时间渐进复杂度与蛮力法相同。
原因回溯法存在剪枝操作。

代码:

#include<iostream>using namespace std;int n=3;//物品数量 
int w[]={10,20,30};//物品重量 
int p[]={60,100,120};//物品价值 
int m=50;//背包称重
//使物品总价值最大 int bagw=0;//当前背包重量
int bagp=0;//当前背包价值
int x[3];//当前最优解
int maxp=0;//当前最优总价值
int maxx[3];//最优解
int r=60+100+120;//可用的物品价值,也就是物品总价值剩余量 void show(int a[]) 
{for(int i=0;i<n;i++)cout<<a[i]<<"\t";cout<<endl<<endl;
}void bag(int i)
{if(i>n-1){if(bagp>maxp){maxp=bagp;for(int j=0;j<n;j++){maxx[j]=x[j];}}return ;}//r=r-p[i];//对第i层进行搜索,r 减少if(bagw+w[i]<=m)//小于背包总重量(约束条件) {x[i]=1;bagw=bagw+w[i];//更新当前背包重量bagp=bagp+p[i];//更新价值bag(i+1);//下一层bagw=bagw-w[i];//回溯bagp=bagp-p[i]; } if(bagp+r >maxp)//如果当前价值+剩余价值> 当前最大价值 还有递归的必要//如果是 当前价值+剩余价值 <= 当前最大价值,那么其实就没有递归的必要了 {x[i]=0;//右子树 bag(i+1);}r=r+p[i];//对第i层进行搜索回来,回复r }int main()
{bag(0); cout<<maxp<<endl;show(maxx);return 0;
}

【例6-5】旅行商问题(Traveling Salesman Problem,简称TSP)。

 问题分析

假设城市数量n=4,V={A,B,C,D},城市间的距离如图6-9所示的图结构。
设出发城市为A,问题的解空间为{A→{B,C,D三者的全排列}→A}

计算模型

1. 数据结构
城市数量n,距离矩阵d[][],城市名称city[]。
当前路径距离nowd,当前路径nowx[],最短距离mind,最优路径x[]。
2. 迭代公式

算法设计与描述:

输入:城市数量n,距离d[][],
城市名city[]
输出:最优路径x[],最优值mind
算法分析
对由n个城市形成的全排列树来说,所含的结点数目为:

蛮力法回溯法
区别
时间渐进复杂度O( (n-1)! )O( (n-1)! )

小结

二分查找算法
分治算法策略的设计模式
大整数乘法和Strassen矩阵乘法
棋盘覆盖问题
选择性问题

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全常见问题隐患及其应对措施

随着数字化时代的到来&#xff0c;网络安全已经成为组织和个人面临的严重挑战之一。网络攻击日益普及&#xff0c;黑客和不法分子不断寻找机会侵入系统、窃取敏感信息、破坏服务和网络基础设施。在这种情况下&#xff0c;了解网络安全的常见问题隐患以及如何应对它们至关重要。…

Golang学习:基础知识篇(三)—— Map(集合)

Golang学习&#xff1a;基础知识篇&#xff08;三&#xff09;—— Map集合 前言什么是Golang&#xff1f;Map集合定义 Map综合实例补充 前言 很久之前就想学Go语言了&#xff0c;但是一直有其他东西要学&#xff0c;因为我学的是Java嘛&#xff0c;所以后面学的东西一直是跟J…

机器学习基础之《回归与聚类算法(3)—线性回归优化:岭回归》

一、什么是岭回归 其实岭回归就是带L2正则化的线性回归 岭回归&#xff0c;其实也是一种线性回归。只不过在算法建立回归方程时候&#xff0c;加上L2正则化的限制&#xff0c;从而达到解决过拟合的效果 二、API 1、sklearn.linear_model.Ridge(alpha1.0, fit_interceptTrue…

使用UniApp实现视频数组自动下载与播放功能:一步步指导

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

5分钟内在Linux上安装.NET Core应用程序

作为开源的忠实粉丝&#xff0c;我喜欢 .NET Core 的跨平台特性。它开启了无限的可能性&#xff0c;从业余爱好项目、实验和概念验证&#xff0c;到在具有高安全性和可扩展性的经济高效基础设施上运行的大规模高负载生产应用程序。我通常从任何云平台提供商那里获得最简单、最便…

Java:SpringBoot整合Spring Batch示例

目录 文档基础概念Tasklet方式示例Chunk方式示例参考文章 文档 https://docs.spring.io/spring-batch/docs/4.3.9/reference/html/index.html 基础概念 JobLauncher&#xff1a;作业启动器&#xff0c;启动作业的入口。对应的实现类为SimpleJobLauncher。Job&#xff1a;作业…

上海亚商投顾:沪指震荡调整跌 减肥药、华为概念股持续活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指上个交易日低开后震荡调整&#xff0c;深成指、创业板指盘中跌超1%&#xff0c;宁德时代一度跌超3%&#xff…

apk和小程序渗透

apk和小程序域服务器通信使用的还是http协议&#xff0c;只是使用了加密。只要可以获取到http的请求报文&#xff0c;就可以回归到web渗透的层面。apk和小程序的渗透很复杂&#xff0c;涉及逆向时要进行脱壳&#xff0c;脱壳后反编译了&#xff0c;源代码没做加密就能直接逆向出…

华为eNSP配置专题-NAT的配置

文章目录 华为eNSP配置专题-NAT的配置0、参考文档1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、基本终端构成和连接2.2、各终端基本配置2.2.1、PC1和PC2的配置2.2.2、交换机不做任何配置2.2.3、网关路由器的配置2.2.4、模拟互联网的路由器的配置 3、配置静态NAT…

代码随想录第四十三天|343. 整数拆分 ● 96.不同的二叉搜索树

343.整数拆分 题目&#xff1a; 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: 10 输出: 36 解释: 10 3 3 4, 3 3 4 …

强化学习 | 强化学习基础知识(图解)

强化学习是机器学习的一个领域。它是关于在特定情况下采取适当的行动来最大化奖励。它被各种软件和机器用来找到在特定情况下应该采取的最佳行为或路径。强化学习与监督学习的不同之处在于&#xff0c;在监督学习中&#xff0c;训练数据具有答案键&#xff0c;因此模型本身使用…

RabbitMQ从0到1完整学习笔记一:《基础篇》

目录 启篇 一、初识MQ 1.1 同步调用 1.2异步调用 1.3 技术选型 二、RabbitMQ 架构 2.2 收发消息 2.2.1 交换机 2.2.2 队列 2.2.3 绑定关系 2.2.4 发送消息 2.3 数据隔离 2.3.1 用户管理 2.3.2 virtual host 三、SpringAMQP 3.1 案例入门 3.1.1 导入依赖 3.1.2 消息发送 3.1.2 消…

图像识别-人脸识别与疲劳检测 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…

threejs(2)-Geometry进阶详解

一、全面讲解UV与应用 在本节中&#xff0c;我们将讨论Three.js中的UV映射&#xff0c;包括UV映射的概念、与顶点位置的关系和区别以及如何在Geometry中设置UV坐标。我们将使用BufferGeometry进行示例说明。 颜色对应 什么是UV映射&#xff1f; UV映射是一种将二维纹理映…

Ubuntu系统如何进行网络连接-连接电脑局域网-物联网开发-Ubuntu系统维护

一、前言 在Ubuntu系统的维护中&#xff0c;我们常常需要对VMware中的Ubuntu虚拟机配置网络连接&#xff0c;以连接服务器下载或安装软件包以及进行网络通信等。 基于上述问题&#xff0c;本文将着重分享Ubuntu配置网络链接的若干方法。 二、网络连接模式 打开VM&#xff0c;右…

【Java 进阶篇】JavaScript 动态表格案例

在这篇博客中&#xff0c;我们将深入了解JavaScript如何创建和操作动态表格。我们将从头开始构建一个动态表格&#xff0c;并逐步添加各种功能&#xff0c;使其能够实现数据的添加、删除和编辑。这个示例将有助于理解如何在前端开发中使用JavaScript创建交互性强大的表格。 准…

网站如何优化加速,让网站降低延迟

优化网站架构 精简页面加载过程&#xff1a;通过消除冗余代码和不必要的图像&#xff0c;并采用CDN资源分发&#xff0c;以减少加载时间。 精心规划内容架构&#xff1a;通过使用恰当的标题和描述&#xff0c;使搜索引擎能够快速理解页面的内涵。 选择性能出众的前端框架&…

RT-Thread学习笔记(三):线程管理

线程管理 线程管理相关概念什么是时间片轮转调度器锁线程运行机制线程的五种状态 动态和静态创建线程区别动态和静态创建线程优缺点RT-Thread动态线程管理函数动态创建线程动态删除线程 RT-Thread静态线程管理函数静态创建线程 线程其他操作线程启动线程延时获得当前执行的线程…

Java并发面试题:(六)悲观锁和乐观锁和Java内存模型和CAS原理

悲观锁和乐观锁的区别 什么是悲观锁&#xff1f; 基本上我们理解的操作前对资源加锁&#xff0c;操作完后释放锁。说的都是悲观锁。悲观锁认为所有的资源都是不安全的&#xff0c;随时会被其他线程操作、更改。所以操作资源前一定要加一把锁、防止其他线程访问。 什么是乐观锁&…

【23种设计模式】装饰器模式

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…