數據結構(嚴蔚敏)算法3.7理解

提要

算法3.7表達:銀行業務模擬,獲取客戶平均等待時間

算法重點思路理解

算法模擬銀行業務運用的主要思路:事件驅動。

由於該算法運用了事件驅動的設計思路,故算法中佔據中心地位的是事件隊列,整個算法的核心驅動力源自於對於事件隊列的處理。其他的四個隊列只是用於顧客堆棧,存儲客戶符號。

算法的假設

算法源自於對於銀行事務的理解:

  1. 開門第一時間,第一位顧客到達,即刻辦理業務;
  2. 客戶辦理業務所需時間是隨機的,生成客戶符號之後,便已經確定下來;
  3. 接下來的客戶到達與本客戶到達事件之間的間隔是隨機的,算法中提前確定下來;
  4. 一位客戶業務辦理完成,離開銀行,另一位客戶開始辦理業務;
  5. 耗時=客戶離開時間-客戶到達時間

算法的運行過程分析

第一步,首先在事件隊列中存儲一個到達事件,這個事件代表第一位顧客進入銀行辦理業務。

由於算法核心是事件驅動,因此這只是爲後續處理過程添加了一個驅動事件,並不意味着第一位顧客相關事件的處理全部完成了,即使客戶的到達事件也並沒有處理。

第二步,抽取事件隊列的事件符號,開始處理該事件,利用處理到達事件的子過程處理事件。

首先抽取事件隊列到達事件,生成一個客戶符號,將客戶符號存入其中一個客戶隊列,如果這個隊列中只有一個客戶,那麼即刻生成一個離開事件存入事件隊列。

  • 整個算法中產生離開事件的位置有兩個:一個是到達事件處理程序的結尾,另一個是離開事件處理程序的結尾。如果隊列中只有一個客戶,那麼他的離開事件產生於到達事件處理程序,如果隊列中不只有一個客戶,那麼這些客戶的離開事件產生於離開事件處理程序的結尾。

其次,獲取一個隨機間隔,計算下一位客戶的到達時間,如果到達時間在營業時間範圍內,那麼在事件隊列中生成一個新的到達事件。

第三步,循環處理事件隊列中的事件。

循環抽取事件隊列中的事件進行處理,遇到事件調用相應的事件處理程序進行處理。
調用離開事件處理程序的時候,在事件隊列中移除該事件並在客戶隊列中移除該事件所關聯的客戶,如果該隊列不爲空,生成下一個元素的離開事件存儲到事件隊列中。
處理離開事件的過程中計算客戶所消耗的時間。

  • 由於事件隊列中的所有事件是嚴格按照時間的先後順序進行排序的,客戶業務消耗的時間也是隨機的,因此,事件隊列的客戶的排序必定是無序的。在事件隊列中堆棧的事件是隨機的。當遭遇到達事件時候,調用到達事件處理程序,遭遇離開事件,調用離開事件處理程序。由於初期只有到達事件存儲在事件隊列中,如果不在到達事件處理程序中拋出離開事件,很有可能算法永遠不會調用離開事件處理程序。

摒棄該算法的思考

按照一般人的思考模式,肯定不是事件驅動而是時間驅動。
時間驅動的算法也可以設計出來,但是比較複雜。
首先是顧客到達時間和離開時間的確定。每一位客戶到達時間是確定的,利用前一位客戶的到達時間和間隔時間確定。那麼需要維持一個時間隊列,在時間隊列中的元素是事件,按照發生的時間點排序。
其次,算法的運行過程每到達一位客戶,調用一次時間計算程序,計算每個客戶隊列中隊首客戶的離開事件,存儲到時間隊列中。
再次,算法運行過程中,首先計算每一位客戶的到達時間,並與時間隊列中的下一個時間點進行比較,如果下一個時間點更靠前,先處理下一個事件,然後將客戶符號壓入客戶隊列。
如此多做了不少事情,不斷的程序調用,進棧出棧會佔用很大開銷:頻繁調用時間計算程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章