電梯調度算法


  最近一直為2012年09月份找工作做准備,所以在不斷的復習以前學過的知識,當然了也在不斷學習新的知識。談到找工作當然算法是比較重要的一部分了,似乎給我的感覺算法好的童鞋找到一個年薪十萬的工作木有任何的問題,雖然說現在的情況,對於IT行業做技術的人,年薪十萬已經是習以為常的事情了,但是剛畢業的我們能拿到十萬年薪也是不錯了吧,起碼目前是剛畢業的學生嘛!!不說了,說說今天這篇文章要寫的東西吧,今天要寫的是一篇算法的文章。

1.問題定義

  電梯大家對於大家已經是很熟悉了,現在存在這樣的問題,那就是在繁忙的上下班時間,在每層樓電梯都要停。這顯然讓很多辦公室在高層的同志有點受不了。現在要求是這樣:由於這個電梯樓層並不高,所以電梯只在一個樓層停,這樣做電梯的每個人都在這個樓層走到自己想去的樓層。那么怎么知道電梯每次在哪個樓層停下來呢?在一樓的時候每個乘客選擇自己的目的層,電梯可以快速的自動計算出應停的樓層。這個應停的樓層應該保證這次乘坐電梯的所有乘客的爬樓梯層數之和最少(包括上下樓)。

2.問題分析

  題本質上是一個優化問題。首先為這個問題找到一個合適的抽象模型。從問題中可以看出,有兩個因素會影響到最后的結果:乘客的數量及需要停的樓層。因此,我們可以從統計到達各層的乘客數目開始分析。

  假設樓層總共有N層,電梯停在第x層,要去第 i 層的乘客數目總數為total[i],這樣,所爬樓梯的總數就是{total[i]*| i - x|}(i = 1 , 2 , …… , N)。因此我們的任務就是找到一個整數x使得{total[i]*| i - x|}(i = 1 , 2 , …… , N)的值最小。

2.問題解法

2.1解法一

  按照面試的思路是,先考慮最簡單的解決方案,然后優化,那我們也這樣。先來看一個簡單的解法,可以第一層開始枚舉x一直第N層,然后計算如果電梯在第x層停的話所有乘客總共要爬多少層樓。這是最為直接的一個解法。

  很容易想到吧,程序代碼就是兩重循環,找到最大值。對於一個問題的解法是枚舉那么,肯定這個解法基本是最容易想,但同時也是效率不太高的解法。這個算法的時間復雜度O(N^2)。

2.2解法二

  現在我們來更仔細的分析一下這個問題,看看怎么樣優化一下。假設電梯停在第 i 層樓,我們計算出所有乘客總共爬樓梯的層數是Y。如果有N1個乘客想去的樓層在第 i 層之下,有N2個乘客正好想去的樓層是第 i 層,有N3個乘客想去的樓層在第 i 層之上。這個時候,重點來了:如果電梯改停在i-1層,所有目的地在第i - 1層以下的乘客可以少爬1層,總共少爬N1層,所有在i層及以上的乘客要多爬一層,總共多爬N2+N3層,這時總共需要爬Y-N1+N2+N3。

  反之,如果電梯在i+1層停所有目的地在第 i 層以上的乘客可以少爬1層,總共少爬N3層,所有在 i 層及以下的乘客要多爬一層,總共多爬N1+N2層,這時總共需要爬

Y+N1+N2-N3層。

  可見,當N1 > N2+N3 時,電梯在第i-1層樓停更好;當N1+N2 <  N3 時,電梯在i+1層停更好。其他情況在第i層更好。

  如此一來,問題的解法就出來了,從第一層開始考察,計算各位乘客走的樓層的數目,然后根據N1,N2,N3之間的關系進行調整,知道找到最佳樓層,這樣算法時間復雜度優化到了O(N)。

 

小結:其實這是一類問題哦。想一想這種解法和枚舉方法的不同之處在哪里??對於枚舉方法每次進行一次計算,計算完了結果對以后進行其他的計算沒有任何的幫助;而解法二采用的方法先前的計算結果是有用的,對以后的計算有很大的幫助,可以調高效率。事實上,這是比較常見的對枚舉算法常見的優化方式。

 

                        學習中的一點總結,歡迎拍磚哦^^


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM