6+栈和队列(三队列的应用)+作业
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 第五至第七个元素与第一、第三或第四有冲突(当前 newr[4~6]!=0),故不归入。 • 考察第八个元素,由于与第一、三或四个元素无冲突(当前 newr[7]=0),故归入该组,将R第八行元素加到newr上。 • 第九个元素与元素一、三、四、八有冲突(当前newr[8]!=0),故 不能归入该组。
– 如何计算平均逗留时间
• 实际服务系统 • 服务系统模拟
– 服务系统模拟的要求
• 用户到达 • 用户接受服务 • 用户离开
– 计算平均逗留时间,则必须记录客户的到达时间和离开时间。
• 用户逗留时间=用户离开时间-用户到达时间 • 用户逗留时间=用户等待时间+用户服务时间 • 由于用户要求的服务是确定的,其服务时间在到达时就可确定!
• newr {0, 1, 0, 0, 0, 0, 0, 0, 0} {0, 1, 0, 0, 0, 0, 0, 0, 0}
1
2
3
• 考察第三个元素。由于它与第一个元素无冲突(当前 newr[2]=0), {0, 1, 0, 0, 0, 1, 1, 0, 0} 将其归入group=1的组,将R第三行元素加到newr上。 • 考察第四个元素。由于它与第一、第三个元素均无冲突(当前 newr[3]=0),故将其归入该组,将R第四行元素加到newr上。
0 1 1 1 0 0
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集工作过程
• 划分子集的工作过程
初始状 态
• 集合 A中的元素放入 cq中,Result和 newr置零,设组号 group=1。 • 第一个元素出队,将 R中的第一行元素拷入newr中的对应位置,得 到: • 考察第二个元素。因为第二个元素与第一个元素有冲突(当前 newr[1]!=0),不能将 R中的第二行加到newr中去。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集问题的提出
• 划分子集问题
– 已知集合A={a1,a2,...an},并已知集合上的关系 R={(ai,aj)|ai,aj属于A,i不等于j},其中(ai,aj)表示ai与 aj之间的 冲突关系。 – 现要求将集合A划分成互不相交的子集A1,A2...Am(m≤n),使 任何子集上的元素均无冲突关系,同时要求划分的子集个数 较少。 – 这类问题可以有各种各样的实际应用背景。
Xidian University
1
2
3
4
5
6
6. 队列的应用——离散事件仿真问题描述 • 离散事件仿真问题描述
– 具体问题——服务系统描述
• 假设服务系统有四个窗口对外接待客户,在营业时间内不断 有客户进入并要求服务。 • 由于每个窗口只能接待一个客户,因此进入该服务系统的客 户需在某一窗口前排队。
注:教材第3章
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
回顾
• 上两次次课介绍了运算受限的线性表——栈和队列的概念和基本运算 – 栈的基本概念和基本运算。 – 栈的存储结构——顺序栈和链栈 – 队列的基本概念和基本运算 – 队列的基本存储结构——顺序队列、循环队列和栈队列 • 介绍了栈的应用—— – 过程递归调用; – “回溯”问题的求解(地图染色); – 表达式求值 • 则队列的应用?
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集问题解决算法思想
• 划分子集算法思想
– 采用循环筛选法: – 以第一个元素开始,凡与第一个元素无冲突且与该组中的其 它元素也无冲突的元素划归一组作为一个子集A1; – 再将 A中剩余元素按同样的方法找出互不冲突的元素划归第 二组,即子集A2; – 以此类推,直到A中所有元素都划归不同的组(子集)。
2
(a)初始状态,把集合中元素拷入 cq 中
5
6
7
9 rear 5 6 9 rear front
(b)第一次筛选结果
1
1
1
1
•
重复上述过程即可完成分 组,即子集的划分。 其最后结果为: A1={1,3,4,8}, A2={2,7}, A3={5}, A4={6,9}。
1
2 1
1
2
1
•
front 9 rear front
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集算法的数据结构
• R的矩阵表示R={(2,8),(9,4),(2,9),(2,1),(2,5),(6,2),(5,9),(5,6),(5,4), (7,5),(7,6),(3,7),(6,3)}的矩阵表示
• 例如在安排运动会比赛项目的日程时,需要考虑如何安排比赛 项目,才能使同一运动员参加的不同项目不在同一日进行,同 时又使比赛日程较短。 • 其他?
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集问题的实例 • 划分子集问题
(c)第二次筛选结果
6
1
2 1
1
3
2
1
(d)第三次筛选结果
1 rear front
SCHOOL OF TELECOMMUNICATIONS ENGINEERING (e)第四次筛选结果
2 1
1
3
4
2
1
4
Xidian University
1
2
3
4
5
6
void divideIntoGroup(int n, int R[n][n], int cq[n], int result[n]) { front=n-1;rear=n-1; for (i=0;i<n;i++) { newr[i]=0; cq[i]=i+1; } group=1; /* 以上是初始化过程 */ pre=0; /* 前一个出队元素的编号 */ front =(front+1)% n; while (front!=rear) { I=cq[front]; front=(front+1) % n; if (I<pre) /* 开始下一次筛选的准备 */ { group=group+1; result[I-1]=group; for (i=0;i<n;i++) newr[i]=R[I-1][i]; } else if (newr[I-1]!=0) /*发生冲突的元素重新入队*/ { rear=(rear+1)% n; cq[rear]=I; } else{ result[I-1]=group; /*不冲突,归入一组*/ for (i=0; i<n; i++) newr[i]+=R[I-1][i]; } pre=I; /*下一次筛选*/ }/* while(front!=rear)*/ } SCHOOL OF TELECOMMUNICATIONS ENGINEERING } /* divideIntoGroup */ Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集问题回顾
• 划分子集问题
– 事实上,地图染色问题,也可以视为划分子集问题,且子集 个数理想情况下为不多于4个!(能保证吗?) – ——相同的问题,从不同视角来看,可以有不同的解决方法 – 则,划分子集问题还有什么解决方法?
C B
D
A
E
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
4
{0, 1, 0, 0, 1, 1, 1, 0, 1} {0, 1, 0, 0, 1, 1, 1, 0, 1}
5
6
{0, 2, 0, 0, 1, 1, 1, 0, 1} {0, 2, 0, 0, 1, 1, 1, 0, 1}
7
– 故第一组的元素应是 {1, 3, 4,8}=A1。 SCHOOL OF TELECOMMUNICATIONS ENGINEERING
– 影响系统队列变化的原因有两种: • 新客户进入服务系统,该客户加入到队列最短的窗口队列 中( 0) • 四个队列中有客户服务完毕而撤离。(1,2,3,4) – 这两种原因共有五种情况,我们把这五种情况称为事件。由 于这些事件是离散发生的,故称为离散事件。这些事件的发 生是有先后顺序的,依此构成事件表。 – 在该服务系统中,某一时刻有且仅有一个事件 (五种事件中的 一个 )发生。一旦某一事件发生,则需改变系统状态 (队列状 态 ),因此,整个服务系统的模拟就是按事件表的次序,依次 根据事件来确定系统状态的变化, 即事件驱动模拟。
– 我们就运动会比赛日程安排来说明解决这类问题的方法。 – 设共有9个比赛项目,则A={1,2,3,4,5,6,7,8,9}。项目报名 汇总后得到有冲突的项目如下: R={(2,8),(9,4),(2,9),(2,1),(2,5),(6,2),(5,9),(5,6), (5,4),(7,5),(7,6),(3,7),(6,3)} – 问题是如何划分A,使A的子集Ai中的项目不冲突且子集数较少, 即比赛天数较少。
用计算机解决实际问题的学问
数据结构与算法分析
任课教师:马彦卓
yzma@mail.xidian.edu.cn
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
内容
栈的基本概念及常用运算 栈的存储结构
3 栈和队列
栈的应用 队列的基本概念及常用运算 队列的存储结构 队列的应用
• 如果窗口的服务员忙则进入的客户需排队等待,闲则可立即 服务,服务结束则从队列中撤离。
• 计算一天中用户在此逗留的平均时间。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——离散事件仿真问题分析 • 离散事件仿真问题分析
R[q][q]: 1 2 3 4 5 6 7 8 9 1 0 1 0 0 0 0 0 0 0 2 1 0 0 0 1 1 3 0 0 0 0 0 1 4 0 0 0 0 1 0 0 0 1 5 0 1 0 1 0 1 1 0 1 6 0 1 1 0 1 0 1 0 0 7 0 0 1 0 1 1 0 0 0 8 0 1 0 0 0 0 0 0 0 9 0 1 0 1 1 0 0 0 0
– 用户进入服务系统的模拟
• 模拟用户进入系统后的实际过程是排队过程 • 采用队列来模拟用户的排队过程 • 队列如何模拟?
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——离散事件仿真问题分析
• 离散事件仿真问题分析
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集算法使用的数据结构
• 划分子集算法的数据结构
– 采用有空/满标志的循环队列cq[n],存放集合A的元素; – 数组 Result[n]用来存放每个元素的分组号; – newr[n]为工作数组,用于分配过程中检测冲突。 – 集合中元素的冲突关系设置一个冲突关系矩阵,由一个二维数组 R[n][n]表示,若第i个元素与第j个元素有冲突则R[i][j]=1,否则 R[i][j]=0。 – R={(2,8),(9,4),(2,9),(2,1),(2,5),(6,2),(5,9),(5,6), (5,4),(7,5),(7,6),(3,7),(6,3)}的矩阵表示如下页:
Xidian University
1
2
3
4
来自百度文库
5
6
6. 队列的应用——划分子集工作过程
cq[9] 0 1 2 2 3 3 4 4 5 5 6 6 7 7 8 front 8 9 rear Result[9] 0 1 2 3 4 5 6 7 8
•
分完第 1组后,划分子集的 1 数据结构发生变化:
– 设 group=2, newr清零, 此时 cq变为: cq[]={2, 5, 6, 7, 9}
– 如何计算平均逗留时间
• 实际服务系统 • 服务系统模拟
– 服务系统模拟的要求
• 用户到达 • 用户接受服务 • 用户离开
– 计算平均逗留时间,则必须记录客户的到达时间和离开时间。
• 用户逗留时间=用户离开时间-用户到达时间 • 用户逗留时间=用户等待时间+用户服务时间 • 由于用户要求的服务是确定的,其服务时间在到达时就可确定!
• newr {0, 1, 0, 0, 0, 0, 0, 0, 0} {0, 1, 0, 0, 0, 0, 0, 0, 0}
1
2
3
• 考察第三个元素。由于它与第一个元素无冲突(当前 newr[2]=0), {0, 1, 0, 0, 0, 1, 1, 0, 0} 将其归入group=1的组,将R第三行元素加到newr上。 • 考察第四个元素。由于它与第一、第三个元素均无冲突(当前 newr[3]=0),故将其归入该组,将R第四行元素加到newr上。
0 1 1 1 0 0
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集工作过程
• 划分子集的工作过程
初始状 态
• 集合 A中的元素放入 cq中,Result和 newr置零,设组号 group=1。 • 第一个元素出队,将 R中的第一行元素拷入newr中的对应位置,得 到: • 考察第二个元素。因为第二个元素与第一个元素有冲突(当前 newr[1]!=0),不能将 R中的第二行加到newr中去。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集问题的提出
• 划分子集问题
– 已知集合A={a1,a2,...an},并已知集合上的关系 R={(ai,aj)|ai,aj属于A,i不等于j},其中(ai,aj)表示ai与 aj之间的 冲突关系。 – 现要求将集合A划分成互不相交的子集A1,A2...Am(m≤n),使 任何子集上的元素均无冲突关系,同时要求划分的子集个数 较少。 – 这类问题可以有各种各样的实际应用背景。
Xidian University
1
2
3
4
5
6
6. 队列的应用——离散事件仿真问题描述 • 离散事件仿真问题描述
– 具体问题——服务系统描述
• 假设服务系统有四个窗口对外接待客户,在营业时间内不断 有客户进入并要求服务。 • 由于每个窗口只能接待一个客户,因此进入该服务系统的客 户需在某一窗口前排队。
注:教材第3章
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
回顾
• 上两次次课介绍了运算受限的线性表——栈和队列的概念和基本运算 – 栈的基本概念和基本运算。 – 栈的存储结构——顺序栈和链栈 – 队列的基本概念和基本运算 – 队列的基本存储结构——顺序队列、循环队列和栈队列 • 介绍了栈的应用—— – 过程递归调用; – “回溯”问题的求解(地图染色); – 表达式求值 • 则队列的应用?
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集问题解决算法思想
• 划分子集算法思想
– 采用循环筛选法: – 以第一个元素开始,凡与第一个元素无冲突且与该组中的其 它元素也无冲突的元素划归一组作为一个子集A1; – 再将 A中剩余元素按同样的方法找出互不冲突的元素划归第 二组,即子集A2; – 以此类推,直到A中所有元素都划归不同的组(子集)。
2
(a)初始状态,把集合中元素拷入 cq 中
5
6
7
9 rear 5 6 9 rear front
(b)第一次筛选结果
1
1
1
1
•
重复上述过程即可完成分 组,即子集的划分。 其最后结果为: A1={1,3,4,8}, A2={2,7}, A3={5}, A4={6,9}。
1
2 1
1
2
1
•
front 9 rear front
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集算法的数据结构
• R的矩阵表示R={(2,8),(9,4),(2,9),(2,1),(2,5),(6,2),(5,9),(5,6),(5,4), (7,5),(7,6),(3,7),(6,3)}的矩阵表示
• 例如在安排运动会比赛项目的日程时,需要考虑如何安排比赛 项目,才能使同一运动员参加的不同项目不在同一日进行,同 时又使比赛日程较短。 • 其他?
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集问题的实例 • 划分子集问题
(c)第二次筛选结果
6
1
2 1
1
3
2
1
(d)第三次筛选结果
1 rear front
SCHOOL OF TELECOMMUNICATIONS ENGINEERING (e)第四次筛选结果
2 1
1
3
4
2
1
4
Xidian University
1
2
3
4
5
6
void divideIntoGroup(int n, int R[n][n], int cq[n], int result[n]) { front=n-1;rear=n-1; for (i=0;i<n;i++) { newr[i]=0; cq[i]=i+1; } group=1; /* 以上是初始化过程 */ pre=0; /* 前一个出队元素的编号 */ front =(front+1)% n; while (front!=rear) { I=cq[front]; front=(front+1) % n; if (I<pre) /* 开始下一次筛选的准备 */ { group=group+1; result[I-1]=group; for (i=0;i<n;i++) newr[i]=R[I-1][i]; } else if (newr[I-1]!=0) /*发生冲突的元素重新入队*/ { rear=(rear+1)% n; cq[rear]=I; } else{ result[I-1]=group; /*不冲突,归入一组*/ for (i=0; i<n; i++) newr[i]+=R[I-1][i]; } pre=I; /*下一次筛选*/ }/* while(front!=rear)*/ } SCHOOL OF TELECOMMUNICATIONS ENGINEERING } /* divideIntoGroup */ Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集问题回顾
• 划分子集问题
– 事实上,地图染色问题,也可以视为划分子集问题,且子集 个数理想情况下为不多于4个!(能保证吗?) – ——相同的问题,从不同视角来看,可以有不同的解决方法 – 则,划分子集问题还有什么解决方法?
C B
D
A
E
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
4
{0, 1, 0, 0, 1, 1, 1, 0, 1} {0, 1, 0, 0, 1, 1, 1, 0, 1}
5
6
{0, 2, 0, 0, 1, 1, 1, 0, 1} {0, 2, 0, 0, 1, 1, 1, 0, 1}
7
– 故第一组的元素应是 {1, 3, 4,8}=A1。 SCHOOL OF TELECOMMUNICATIONS ENGINEERING
– 影响系统队列变化的原因有两种: • 新客户进入服务系统,该客户加入到队列最短的窗口队列 中( 0) • 四个队列中有客户服务完毕而撤离。(1,2,3,4) – 这两种原因共有五种情况,我们把这五种情况称为事件。由 于这些事件是离散发生的,故称为离散事件。这些事件的发 生是有先后顺序的,依此构成事件表。 – 在该服务系统中,某一时刻有且仅有一个事件 (五种事件中的 一个 )发生。一旦某一事件发生,则需改变系统状态 (队列状 态 ),因此,整个服务系统的模拟就是按事件表的次序,依次 根据事件来确定系统状态的变化, 即事件驱动模拟。
– 我们就运动会比赛日程安排来说明解决这类问题的方法。 – 设共有9个比赛项目,则A={1,2,3,4,5,6,7,8,9}。项目报名 汇总后得到有冲突的项目如下: R={(2,8),(9,4),(2,9),(2,1),(2,5),(6,2),(5,9),(5,6), (5,4),(7,5),(7,6),(3,7),(6,3)} – 问题是如何划分A,使A的子集Ai中的项目不冲突且子集数较少, 即比赛天数较少。
用计算机解决实际问题的学问
数据结构与算法分析
任课教师:马彦卓
yzma@mail.xidian.edu.cn
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
内容
栈的基本概念及常用运算 栈的存储结构
3 栈和队列
栈的应用 队列的基本概念及常用运算 队列的存储结构 队列的应用
• 如果窗口的服务员忙则进入的客户需排队等待,闲则可立即 服务,服务结束则从队列中撤离。
• 计算一天中用户在此逗留的平均时间。
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——离散事件仿真问题分析 • 离散事件仿真问题分析
R[q][q]: 1 2 3 4 5 6 7 8 9 1 0 1 0 0 0 0 0 0 0 2 1 0 0 0 1 1 3 0 0 0 0 0 1 4 0 0 0 0 1 0 0 0 1 5 0 1 0 1 0 1 1 0 1 6 0 1 1 0 1 0 1 0 0 7 0 0 1 0 1 1 0 0 0 8 0 1 0 0 0 0 0 0 0 9 0 1 0 1 1 0 0 0 0
– 用户进入服务系统的模拟
• 模拟用户进入系统后的实际过程是排队过程 • 采用队列来模拟用户的排队过程 • 队列如何模拟?
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——离散事件仿真问题分析
• 离散事件仿真问题分析
SCHOOL OF TELECOMMUNICATIONS ENGINEERING
Xidian University
1
2
3
4
5
6
6. 队列的应用——划分子集算法使用的数据结构
• 划分子集算法的数据结构
– 采用有空/满标志的循环队列cq[n],存放集合A的元素; – 数组 Result[n]用来存放每个元素的分组号; – newr[n]为工作数组,用于分配过程中检测冲突。 – 集合中元素的冲突关系设置一个冲突关系矩阵,由一个二维数组 R[n][n]表示,若第i个元素与第j个元素有冲突则R[i][j]=1,否则 R[i][j]=0。 – R={(2,8),(9,4),(2,9),(2,1),(2,5),(6,2),(5,9),(5,6), (5,4),(7,5),(7,6),(3,7),(6,3)}的矩阵表示如下页:
Xidian University
1
2
3
4
来自百度文库
5
6
6. 队列的应用——划分子集工作过程
cq[9] 0 1 2 2 3 3 4 4 5 5 6 6 7 7 8 front 8 9 rear Result[9] 0 1 2 3 4 5 6 7 8
•
分完第 1组后,划分子集的 1 数据结构发生变化:
– 设 group=2, newr清零, 此时 cq变为: cq[]={2, 5, 6, 7, 9}