排队模拟问题分析

排队模拟问题,是建立在实际叫号排队问题基础上的,算法分析问题。

本质上是一种随时间变动的queue问题。

拿到这个问题一开始博主也是懵逼的,

第一个问题,我们从什么角度复现这个过程,到底是时间还是什么?

首先变量很多,顾客到达时间,窗口数,队列数,顾客办业务花费时间,等待时间, 看起来要考虑的要素很多。 但我们仔细分析,所有事件都是基于时间在变化的基础上进行的, 从 8 点开始,随着时间的推进,顾客做相应的进队,出队操作。 但是如何使用时间判断是否可以进队、出队。好像很困难。

可以换一种思路,所有事件的发生是时间变化导致的, 但同时也是一个个客户导致的, 一个客户办完业务,下一个才能补上,才有进队、出队这种变化。 想明白这一点之后,问题就简单多了,我们可以利用遍历客户来实现整个问题的复现。 对于 1014 问题可以先遍历队列区,再遍历叫号区。 对于 1017 问题,队列长度只有一,可以通过依次遍历来访客户,来实现复现。

第二个问题,怎么确定最佳补队方案?

当队首客户办完业务的时候,叫号区队首的客户就可以进入该队,该队最早有空位,故该队是最佳选择。 这种想法,是从队列出发,通过遍历队首元素结束时间来实现。 实际操作过程中可以通过设立窗口队列数组 vector node 中存放相应的队首结束时间,利用 sort 函数来实现队首最早出队的遍历。

第三个问题:如何确定排队是否还有希望完成业务办理?

这个问题好像很现实,也是我们日常生活中经常会碰到的问题。 借助问题二的思路,遍历队首可以找到最佳选队策略。 遍历队伍结束时间,那么就可以得到新入队用户有无希望完成任务的判断。 在实际操作过程中,可以通过在问题二队首出队的同时,对队伍有无希望进行判断。

解决了这三个问题,排队模拟问题基本上就解决了, 虽然具体操作过程中,用到的数组会多的让人心烦,momo

具体 code 可以参见 本博客的PAT A 1026, PAT A 1014PAT A 1017 github 地址:https://github.com/iofu728/PAT-A-by-iofu728

You can use this BibTex to reference this blog if you find it useful and want to quote it.