编程之美电梯调度问题

电梯调度问题:亚洲微软研究院所在的希格玛大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯每层都停。实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法:

由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则计算出应停的楼层。

问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?

电梯调度问题本质上等同于一维邮局问题。

如果记上到楼层1,2,3,4….N的人数分别为a[1],a[2],  a[3], a[4]… a[N]

此问题实际上是

                                             MIN(sigma{ a[i]  |i-x|}  )

sigma为和函数, x为电梯停的楼层。

那么由带权中位数算法可以快速求出最优楼层x。算法复杂度为O(N)

如果数据记录是楼层和人数的数组,而且数据中的不同楼层数目为n, 而且数组中权重为0(人数为0)的楼层我们可以删除,比如总共有5层楼,1,2,3,4,5 楼的人数分别为4,2,0,0,3

那么我们可以删除数组中权重为0的楼层3和4,得到的新数组为[1,2,5],对应的权重数组为[4,2,3], 那么此时的N=5,n=3

由选择带权中位数算法复杂度可知,此复杂度为O(n)

如果n比N小很多,算法的性能O(n)将大大优于编程之美上给出的复杂度为O(N)的算法。

复杂度为O(n)的带权中位数算法见前一篇文章。

    原文作者:leisurelycxf
    原文地址: https://blog.csdn.net/leisurelycxf/article/details/47728519
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞