电梯调度问题:亚洲微软研究院所在的希格玛大厦一共有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)的带权中位数算法见前一篇文章。