【数据结构】简短的新bank题思路分享

关于如何利用ppt上给出的主要算法设计在没读懂题的情况下高效地写出bank题,又名究竟什么时候要更新窗口 什么时候要入队 什么时候出队我完全搞不懂,所以还是当成ppt修改题来写吧。也就是说,本文主打一个浑水摸鱼不求甚解,如果你想要真正搞懂bank题,建议去看看学长学姐们写的数据结构debug手册的4.2和ghgg的博客

1 PPT上的旧bank和作业的新bank有何不同

唯一的区别:新bank中每个客户的办业务时间不同。

  • 这代表着可能先来的人后办完业务,也就是说不能出队一个客户就输出一个客户,需要等到办完所有业务再统一输出

  • 同时这代表着新bank的输入发生了变化,需要修改主要算法。

    如何修改?

    首先,原算法是在每一周期内读入本周期入队人数,但由于新bank先输入每一周期入队人数,再输入每个客户的业务时长,故不如改为直接读入每一周期的客户人数即每一位客户的业务时长,再进行主要算法的处理。

    旧bank主要算法:

    for(clock=1; ; clock++) //在每个时间周期内

    {

    1. If 客户等待队列非空

      ​ 将每个客户的等待时间增加一个时间单元;

    2. If(clock <= simulationtime)

      ​ 2.1 如果有新客户到来(从输入中读入本周期内新来客户数),将其入队;

      2.2 根据等待服务客户数重新计算服务窗口数;

    3. If 客户等待队列非空

      ​ 3.1 从客户队列中取(出队)相应数目(按实际服务窗口数)客户获得服务;

      3.2 然后根据等待服务客户数重新计算服务窗口数;

    ​ Else 结束模拟

    }

    新bank主要算法:

    一 读入

    二 改改旧bank(正式处理)

    for(clock=1; ; clock++) //在每个时间周期内

    {

    1. If 客户等待队列非空

      ​ 将每个客户的等待时间增加一个时间单元;

    2. If(clock <= simulationtime)

      ​ 2.1 如果有新客户到来,更新已经到来的人数和等待人数;

      2.2 根据等待服务客户数重新计算服务窗口数;(只有可能增加)

    3. If 客户等待队列非空

      ​ 3.1 从客户队列中取相应数目(按实际服务窗口数)客户获得服务;

      3.2 然后根据等待服务客户数重新计算服务窗口数;(只有可能减少)

    ​ Else 结束模拟

    }

    三 输出

2 一些注意事项

  1. 可以考虑用一个指针数组来指向正在办业务的客户们

  2. 客户结构体包括: id(第几个客户) difficulty(业务难度) wtime(等待时间)

  3. 在3.1中将正在办业务的客户的difficulty--,当difficulty == 0时客户办完业务,让下一个人来办业务

  4. 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]了。


【数据结构】简短的新bank题思路分享
http://example.com/2024/04/09/LE-ds4-1/
Author
John Doe
Posted on
April 9, 2024
Licensed under