百度面試題——組件依賴性問題

問題描述

一個典型的大型項目,通常由衆多組件構成,這些組件之間複雜的編譯依賴於在構建整個系統時,是最讓人頭疼的地方之一。現在就有這樣的一個大型項目,由N(N>1000)個組件構成,每個組件都是可以編譯的,但組件之間存在着編譯依賴,如組件N1依賴N2,即編譯N1時N2必須已經先編譯完成,否則N1不能完成編譯,但組件之間沒有循環依賴的問題。請設計一種快速算法,能完成整個項目的編譯構建過程,並給出算法的時間複雜度。

解題思路:

根據題意,可將組建間的依賴關係構造爲一個有向無環圖(DAG),然後再根據該圖對組件進行拓撲排序。根據拓撲排序的原理:G所有頂點排成一個線性序列,使得任意一對頂點u和v,若<u, v> ∈E(G),則u在線性序列中出現在v前。所以,進過拓撲排序後的序列可讓有被依賴的組件在依賴性組件之前。

拓撲排序思想:

(1)從有向圖中選擇一個沒有前驅(即入度爲0)的頂點並且輸出它.  

(2)從網中刪去該頂點,並且刪去從該頂點發出的全部有向邊.  

(3)重複上述兩步,直到剩餘的網中不再存在沒有前趨的頂點爲止.

其中,DAG圖可採用鄰接矩陣或鄰接表來構造,構造其時間複雜度爲O(e)(e邊的個數),拓撲排序過程中,有向圖無環,則每個頂點進一次棧、出一次棧,入度減1的操作在while語句中總共執行e次,所以總的時間複雜度爲O(n+e)

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