编程之美电梯调度问题
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)的带权中位数算法见前一篇文章。
由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则计算出应停的楼层。
问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?
电梯调度问题本质上等同于一维邮局问题。
如果记上到楼层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)的带权中位数算法见前一篇文章。
相关文章推荐
- C#查看各种变量的指针地址
- java大话设计模式之一----简单工厂模式
- IIS7.5 + php 解决上传大文件问题!
- 代码格式工具
- eclipse优化之取消eclipse拼写错误检查
- spring mvc 的常用pom文件
- Spring自动检测Bean
- 【转】Java 内存模型及GC原理
- My First GitHub
- Java多线程学习心得
- Google Guava EventBus实例与分析
- Spring注解@Component、@Repository、@Service、@Controller区别
- c++中的点号(.),冒号(:)和双冒号(::)运算符
- [python] python彩色输出
- Java有关数组使用工具
- eclipse名字的由来及各版本的命名
- 黑马程序员-----c语言基础与重点第二篇——进制转换与数组
- JAVA 基本数据的类型转换
- Ubuntu下安装jdk1.8
- STL - 常用关联容器代码 - set & multiset