【数据结构】简短的新bank题思路分享
关于如何利用ppt上给出的主要算法设计在没读懂题的情况下高效地写出bank题,又名究竟什么时候要更新窗口 什么时候要入队 什么时候出队我完全搞不懂,所以还是当成ppt修改题来写吧。也就是说,本文主打一个浑水摸鱼不求甚解,如果你想要真正搞懂bank题,建议去看看学长学姐们写的数据结构debug手册的4.2和ghgg的博客
1 PPT上的旧bank和作业的新bank有何不同
唯一的区别:新bank中每个客户的办业务时间不同。
这代表着可能先来的人后办完业务,也就是说不能出队一个客户就输出一个客户,需要等到办完所有业务再统一输出。
同时这代表着新bank的输入发生了变化,需要修改主要算法。
如何修改?
首先,原算法是在每一周期内读入本周期入队人数,但由于新bank先输入每一周期入队人数,再输入每个客户的业务时长,故不如改为直接读入每一周期的客户人数即每一位客户的业务时长,再进行主要算法的处理。
旧bank主要算法:
for(clock=1; ; clock++) //在每个时间周期内
{
If 客户等待队列非空
将每个客户的等待时间增加一个时间单元;
If(clock <= simulationtime)
2.1 如果有新客户到来(从输入中读入本周期内新来客户数),将其入队;
2.2 根据等待服务客户数重新计算服务窗口数;
If 客户等待队列非空
3.1 从客户队列中取(出队)相应数目(按实际服务窗口数)客户获得服务;
3.2 然后根据等待服务客户数重新计算服务窗口数;
Else 结束模拟
}
新bank主要算法:
一 读入
二 改改旧bank(正式处理)
for(clock=1; ; clock++) //在每个时间周期内
{
If 客户等待队列非空
将每个客户的等待时间增加一个时间单元;
If(clock <= simulationtime)
2.1 如果有新客户到来,更新已经到来的人数和等待人数;
2.2 根据等待服务客户数重新计算服务窗口数;(只有可能增加)
If 客户等待队列非空
3.1 从客户队列中取相应数目(按实际服务窗口数)客户获得服务;
3.2 然后根据等待服务客户数重新计算服务窗口数;(只有可能减少)
Else 结束模拟
}
三 输出
2 一些注意事项
可以考虑用一个指针数组来指向正在办业务的客户们
客户结构体包括:
id
(第几个客户)difficulty
(业务难度)wtime
(等待时间)在3.1中将正在办业务的客户的
difficulty
--,当difficulty == 0
时客户办完业务,让下一个人来办业务3.2中更新窗口数时小心出现下面情况:
原来开了4个窗口,分别是
win[0] win[1] win[2] win[3]
,窗口减少后只需要3个窗口。但空出的窗口是win[0]
,即win[0] == NULL
。此时运用指针数组的优势就出现了,你可以从
win[3]
一直往下(0)遍历,找到值为NULL
的指针时将其与win[3]
进行交换,这样现在在办业务的窗口就还是win[0] win[1] win[2]
了。