您的位置:首页 > 编程语言

编程之美电梯调度问题

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

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

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

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

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

此问题实际上是

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)的带权中位数算法见前一篇文章。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: