拓?fù)渑判蛩惴?你為什么要學(xué)算法?
你為什么要學(xué)算法?算法,其實(shí)就是解決問題的方法。學(xué)習(xí)算法是學(xué)習(xí)前人解決問題的方法。為什么要學(xué)習(xí)算法?想要在編程道路上走得更遠(yuǎn)的程序員可能需要學(xué)習(xí)算法。我記得在軟件工程中,程序是數(shù)據(jù)結(jié)構(gòu)算法,這說明了算
你為什么要學(xué)算法?
算法,其實(shí)就是解決問題的方法。學(xué)習(xí)算法是學(xué)習(xí)前人解決問題的方法。為什么要學(xué)習(xí)算法?想要在編程道路上走得更遠(yuǎn)的程序員可能需要學(xué)習(xí)算法。我記得在軟件工程中,程序是數(shù)據(jù)結(jié)構(gòu)算法,這說明了算法對(duì)程序的重要性。
許多初級(jí)業(yè)務(wù)系統(tǒng)程序員可能不會(huì)使用很多數(shù)學(xué)公式,但這并不意味著他們不使用算法。算法代表了數(shù)學(xué)對(duì)于計(jì)算機(jī)的重要性,對(duì)于圖形和圖像、人工智能等方面來說,數(shù)學(xué)基礎(chǔ)不好,不懂的算法可以說是很難的。
即使你不是程序員,你也應(yīng)該學(xué)習(xí)更多關(guān)于算法的知識(shí)。一方面有助于思維訓(xùn)練,另一方面也有助于解決生活中的實(shí)際問題。例如:用矩陣解方程。
每個(gè)人學(xué)習(xí)算法的目的可能不同,但算法對(duì)學(xué)習(xí)者的實(shí)際好處是相同的。
拓?fù)渑判蚝完P(guān)鍵路徑是如何實(shí)現(xiàn)的?
拓?fù)渑判虻膶?shí)現(xiàn)步驟:AOV網(wǎng)構(gòu)造拓?fù)湫蛄械耐負(fù)渑判蛩惴ㄖ饕茄h(huán)執(zhí)行以下三個(gè)步驟,直到?jīng)]有度為0的頂點(diǎn)為止;(1)選擇度為0的頂點(diǎn)并輸出;(2)刪除網(wǎng)絡(luò)中的頂點(diǎn)和所有外邊緣;(3) 循環(huán)后,如果輸出頂點(diǎn)的個(gè)數(shù)小于網(wǎng)絡(luò)中的頂點(diǎn)個(gè)數(shù),則輸出“循環(huán)”,否則,輸出頂點(diǎn)序列為拓?fù)湫蛄小ふ谊P(guān)鍵路徑的算法:(1)輸入e弧<J,K>建立AOE網(wǎng)絡(luò)的存儲(chǔ)結(jié)構(gòu)。(2) 從震源點(diǎn)V1開始,設(shè)ve(1)=0,求ve(J)2<=J<=n。(3)從交匯點(diǎn)VN開始,設(shè)VL(n)=ve(n),求VL(I)1<=I<=n-1。(4) 根據(jù)每個(gè)頂點(diǎn)的VE和VL值,計(jì)算每個(gè)弧s(activity)的最早開始時(shí)間e(s)和最晚開始時(shí)間l(s),其中e(s)=l(s)是關(guān)鍵activity。
拓?fù)渑判蚝完P(guān)鍵路徑是如何實(shí)現(xiàn)的?
拓?fù)渑判虻膶?shí)現(xiàn)步驟如下:
AOV網(wǎng)構(gòu)造拓?fù)湫蛄械耐負(fù)渑判蛩惴ㄖ饕茄h(huán)執(zhí)行以下三個(gè)步驟,直到?jīng)]有度為0的頂點(diǎn);
(1)選擇度為0的頂點(diǎn)并輸出;
(2)刪除頂點(diǎn)從網(wǎng)絡(luò)中選擇度為0的頂點(diǎn),在循環(huán)的末尾輸出,如果輸出的頂點(diǎn)數(shù)小于網(wǎng)絡(luò)中的頂點(diǎn)數(shù),則輸出“循環(huán)”信息,否則輸出的頂點(diǎn)序列是拓?fù)湫蛄小?/p>
尋找關(guān)鍵路徑的算法:
(1)輸入e弧
(2)從源點(diǎn)V1開始,設(shè)ve(1)=0,求ve(J)2
(3)從匯點(diǎn)VN開始,設(shè)VL(n)=ve(n),求VL(I)1
(4)根據(jù)每個(gè)頂點(diǎn)的ve和VL值,找出每個(gè)弧s(活動(dòng))的最早開始時(shí)間e(s)和最晚開始時(shí)間l(s),其中e(s)=l(s)是關(guān)鍵活動(dòng)。
采用鄰接表存儲(chǔ),拓?fù)渑判蛩惴ǖ臅r(shí)間復(fù)雜度為多少?
要查看要使用哪種拓?fù)渑判?,最好的方法是輸出DFS的逆序。該算法的復(fù)雜度為O(vl),V為頂點(diǎn)數(shù),L為邊數(shù)。