1. 程式人生 > 實用技巧 >6.4.3 拓撲排序 番茄炒蛋工程

6.4.3 拓撲排序 番茄炒蛋工程

Q(`⌒´Q)վ'ᴗ' ի⊂(˃̶͈̀ε ˂̶͈́ ⊂ )加油

我們來學習圖的第3個應用叫做兔排序,兔排序它常常用作在工程當中,它描述了工程當中每一個工程的活動之間的存在的這樣一個傳遞性的關係,可能某一個活動只有在另一個活動結束之後才可以開始這樣一種邏輯性的關係,那麼我們來舉一個小例子,例如我們學習課程的這個例子,我們在學習計算機基礎課程之後,才可以開始成為攝影語言的學習,我們掌握了計算機基礎和程式式語言才可以開始啊資料結構這門課的學習,那麼我們只要學習了資料結構以及程式設計語言才可以去開始演算法分析這門課程學習,那麼這4門課程當中存在著這樣的一個前序後續的這樣傳遞性的關係,那麼我們就利用了一個有向圖的結構描述了這4種課程之間的傳遞性關係,我們如果按照他們可以發生順序對它們進行程式的話。利用了一個有向圖的結構,描述了這4種課程之間的垂線關係,我們如果按照它們可以發生順序對它們進行程式的話,得到的這個序列其實就是我們今天所要講述的這個不排序的序列噢,那麼知道了兔排序大致描述的是什麼?我們細緻的看一下兔排序的相關定義,那麼首先我們要了解有向無緩吐的,這個定義非常簡單,其實啊不存在還的一個有效圖,我們把它簡稱為da這一圖,那麼接著我們來看下一個定義叫做aov網差什麼呢?它是用一個有效無環圖表示一個工程起頂點,表示的是工程的活動,用這樣一個有效邊vI=g表示活動備案,先於活動為j進行的一個傳遞性關係,那麼就例如我們剛剛所講述的,只有學習了計算機基礎才可以去學習程式設計語言這樣傳遞性的關係這種。傳遞性關係,那麼就比如我們剛剛所講說的,只有學習了學習基礎才可以去學習,寫成這個世界語言這樣傳遞性的關係,則將各種DNA稱為頂點,表示我的網路那麼記為aov網這裡的aov,其實是一個英文縮寫的,作者聽一聽啊,我探測那麼是活動在節點上在頂點上的這麼一個網,雖然它叫做網,但是我們發現了它邊是沒有權重的,那麼它只是這樣一種方式,之後我們還會學習一個叫做aoe網,只是我們把每個活動每個邊。在酒店上的這麼一個網,雖然它叫做網,但是我們發現了它邊事沒有權重的,那麼它只是這樣一種描述方式,之後我們還會學習一個叫做aoe網,則是我們把每個活動一個邊來表示的這麼一個網,然後本節課拓開虛假說的是有關aov的這樣的一個網,那麼什麼是做培訓呢?就是對daj所有頂點的一種排序,若存在一條從頂點a到頂點,b的路徑,在排序中,b要排在a的後面,如何滿足這樣的條件,我們就稱它為拓撲排序,大家注意的一點是,拓牌式的大前提一定是對daj這樣一個有效無關圖的一種排序,如果它是有環的或者它是5項的,都不存在對應到兔排序,然後這就是有關兔排序的幾個概念,那接下來我們再來看一下,這樣對一個圖進行完序,它的演算法思想演算法步驟是什麼一步。土排序,然後這就是有關土排區的基本概念好,接下來我們就來看一下這一個圖進行培訓,那演算法思想演算法步驟是什麼,第1步是從DJ圖中選擇一個,沒有前確定點並輸出,也就是找出一個入度為0的一個頂點把它輸出,然後從開頭中刪除該節點,並且所與它為起點的相變,也就是刪除該零點,並且刪除他所有的出邊,那麼對於如果我們是連線表儲存的話,則刪除它的邊邊好,這是第2步,然後第3步則是重複12成過程,直到當前DNA圖為空,或者當前圖中不存在無淺區的頂點位置什麼意思啊第一個所有的邊和丁點b了,什麼意思啊?第1個解除條件是DJ圖為空,它非常好理解,其實是我們把所有的邊和頂點都刪除完畢了,所有定點都訪問完畢了。也為止什麼意思啊?第1個結束條件是DJ圖為空,它非常好理解,其實我們把所有的邊和頂點都刪除完畢了,所有頂點都訪問完畢了,那麼第2種情況是什麼意思呢?第2種情況是如果DJ圖不為空,且當前圖中不存在無前屈的頂點,就說明了該圖中一定存在著環,它不是一個DJ圖好,這就是思想思想非常簡單好,接下來我們就來看一個小例子,幫助大家瞭解一下這樣的演算法實行過程,那麼首先呢,我們知道每一次我們要刪除的是頂點入度為0的哪一個頂點,那麼我們所用了一個輔助陣列來標記來儲存了每個頂點當前的祿蠹,我們把它初始化為你的釘釘,一開始在郵箱圖當中的露肚所以我們花了一幫他們然後。今天當前的路途,我們把它初始化為每個頂點,一開始在有象圖當中的錄度好,因為它有4個頂點,所以我們初始化了一個大小為4個數組,並把它們進行復制好,然後我們要在該陣列當中找出為0的那一個下標,我們發現夏威威給我們的紙是不是wap啊?表示的姿勢比釘釘點是沒有入編的,此時我們則執行演算法刪除命令點輸出,它並且還要刪除噢,它對應到所有的初編,他伸出了兩條邊之後,我們發現我們對應的速度是不是要進行修改了,然後這就是修改之後的數字,我們依舊重複上述的過程,找說沒領到的一個景點,發現一丁點是不是為零啊,所以依舊說出一點點,並且刪除所有有關他的初變之後。他倒是出點,然後刪除之後我們依舊要修改陣列修改陣列,我們發現二下標下的程是不是v02,所以然後我們要輸出20點,並且與它相關的所有的出邊好,你就要修改對應的陣列,最後還剩3這個經典它對應的值為0,所以依舊要刪除給頂點並且輸出他,然後這樣我們就得到了對應這個有向無環圖的客戶排序的排序序列0123我們利用了剛好我們所講述的演算法,實現了這兩處排序的過程,好,這是一個DJ圖的例子,其中沒有環,那我們接下來我們來看一個存在款的例子,我們把蓋子上圖做出一定的修改,將從一指向三的這條腿相邊修改為從三指向一,這樣我們就得到了一個新的有效圖,其中存在著123這樣一個環狀的一個結構。連線所有的出邊,然後我們對陣列當中值進行修改,我們發現此時是不是沒有頂點,它的入度為點2,也就是我們所說的演算法描述當中第3個步驟後一種結束的情況沒有頂點不存在前驅,頂點沒有頂點它的入度為0,那麼此時我們就有這樣的結論,若演算法結束時,沒有訪問所有的頂點,則存在以剩下頂點組成的環,因為我們在剛剛舉的這個例子當中,我們剩下了123這樣三個頂點,那麼我們則存在從一隻像2×2×3再從三指向一打這樣一個環,然後這就是兩種意思,好接下來我們來看第3個小例子,也就是這樣一個有香無緩圖的例子,第1步也就是初始化對於每個頂點的入度。我們在第二故事先輸出了第一頂點,那麼第2種則是0213,我們在第2步時先輸出了,二點點發現兔排序,它的結果是不是不一定唯一的呀?對於某一些有相關圖,它的吐牌的序列可能有很多種好,這就是第3個小例子以及想要記錄掉的一個點托盤式結果不一定為一好,接下來我們來看一下如何用語言來編寫圖排序的演算法,這就是它的程式碼實現,我們來看一下每一個語句它有什麼樣的作用,首先我們要初始化一個佔s,這樣這樣有什麼作用呢?我們回憶第3個例子,在第3個例子當中,是不是它可能出現有兩個錄度為0的頂點啊?那麼我們每次只能訪問一個頂點,所以我們要通過這樣一個戰s來儲存所有入度為0的頂點操作作用然後是一個迴圈語句操作作用然後是一個迴圈語句這個。第4檔進行演算法操作好,這就是展s的作用,然後是一個放迴圈語句,這個放迴圈語句子,是我們找出那個入度為點到那些頂點的過程,我們用一個放聲環迴圈了,以頂個位陣列這個以的剛剛用的那一個輔助陣列,它儲存了所有頂點,當前的入度,如果它的入度為l,我們所要把它進行壓站操作,然後這就是第1個風迴圈的作用,接下來我們初始化了一個輔助變數,一個整形變樣的探討,它記錄了當前我們訪問的頂點的個數,然後這就是初始化的過程,接下來while迴圈語句則是迴圈我們之前所講述的二三步驟,我們來看它的迴圈條件是判斷該站是否為空,如果它為空的話,則我們要退出迴圈如果滿足。速度為0,那停電了,然後如果滿足該迴圈的條件,我們要執行迴圈體當中的內容,首先第1步是彈出陣地元素,彈出一個路途為0的頂點,然後我們要print數字來儲存該廳店的編號,這樣朋友的陣列,它的作用則是儲存後排序的排序序列,我們可以將它輸出也可以用這樣的陣列來對它進行儲存好,這就是第2條語句,然後則是一個放迴圈的過程,這個for迴圈其實是我們電力編表過程,那麼我們在演算法描述當中描述的是我們刪除該定點以及它的編表,其實在我們具體的實驗過程當中,我們並沒有對它進行刪除,只是遍歷了編表,找出了所有的另一個端點,然後對它進行入讀和修改首先想到一個變數我們這樣對眼的他的頭指標然後。那我們這樣對應頂點的它的頭指標,然後我們判斷該節點是否為空,如果為空的話則表示便利便票結束,如果非空的話,則繼續我們執行迴圈的過程,然後每次迴圈結束,我們要將p複製為下一個節點,在迴圈點當中則是有這樣的過程,我們要用一個輔助變數,v儲存當前bmail節點,它的內容也就是改編的電流端點,然後下面一個條件判斷語句是什麼意思呢?這個條件判斷語句,我們實現了兩個過程,我們來看,首先在條件判斷當中有一個簡簡單單點塌落度陣列儲存的值,我們要對應將該值進行節點操作,因為我們相當於刪除了他的這樣一條路邊然後什麼過程的然後的值進行操作這樣操作有什麼作用呢該是後邊的話,然後我們執行什麼樣的過程呢?然後我們對減減後的值進行取非操作這樣操作有什麼樣的作用呢?若開始減1之後變為0的話,取非之後是不是就變為1了。這樣操作有什麼樣的作用呢?若開始簡易之後變為給人的話,取飛之後是不是就變為伊朗,那麼變為一則表示判斷條件為真,我們執行護士操作,也就是說如果該頂點的入舵為0的話,我們則要對它進行壓站操作,把它壓入到我們儲存路途為零頂點的那個s站當中,好,這就是這樣一個條件判斷語句,其實我們實現了兩個過程,第1步是修改對應integrate入度導陣列的過程,第2步則是如果入度為0的話,我們想要把它壓入到佔中,還有這就是迴圈體,這樣的內容我們對它執行,這樣的迴圈過程就可以實現我們對引導圖排序的演算法。然後最後我們有一個條件判斷語句,判斷的則是結束的第2個條件,如果抗著時也就是訪問點點數量小於該圖當中點點數量並沒有進行訪問表示成了。並且並沒有進行訪問表示剩下頂點組成了一個合狀結構,我們要為它是false的表示圖排序失敗,沒有得到托盤學的序列,那麼否則如果訪問了所有頂點的話,所有者它是錯的,表示我們得到了一個排序的序列,然後這就是怎麼演算法的過程,其實非常簡單的調理也非常的清楚,就是將我們對演算法描述的那幾個步驟進行語言的實現,好,我們來分析一下它的時間複雜度,那麼它的時間法則作為節儉的收養加上邊的收養,為什麼呢?因為我們要訪問每一個頂點,然後訪問每個頂點時,我們是不是要對它所有的邊它的邊表進行一個訪問啊,因為我們修改對應的陣列,所以它到實現複雜度為dov加e好,這就是托盤序的時間程式碼,那麼托盤序其實也可以用dldfs來實現,它與df的實現程式碼非常的相似,只需要做出一些小的修改就可以了。去實現一下,然後這就是排序的實現程式碼號,那麼最後我們再來了解一個有關注排序的小特點,就是落地接近正為三角區戰的話,則存在土排序,反之不一定成立是給三角區站,指的是上下角或者是下線的去掙都是可以的,我們來看為什麼有這樣一個小結論的手相三小學上的例子,如果有一個這樣的上司,他舉證他是某一個有相同的鄰接矩陣的話,則對應在該組當中每一條有相邊都滿足這樣的條件,它的出示頂點的編號,a一定比中指的頂點編號j要小,因為在臨街矩陣當中,是不是每一條出邊的編號都要小於它路邊的編號,所以說在代理程式當中,每一套相片都滿足這樣的特點,那麼每一個路徑當中的其實短點是不是也都要比它的終止短點的編號要小啊所以說一定沒有。那麼每一個路徑當中的起始端點,是不是也都要比它的重視端點的編號要小啊,所以說在這個過程當中,肯定沒有某一條路徑是從編號大的頂點到編號小的頂點到,那麼在幹什麼當中一定不存在魂狀結構,所以它一定要拓撲排序的排序序列,這就是為什麼我們有這樣的特點,那麼對應的下三角矩陣也存在著相同道理則是某一小組相變,它所有的其實頂點的編號一定都要比它的中式經典的變化要大,那麼它所有的路徑其實端點都要比它中式端點的變化要大,不存在環狀的這樣一個結構,所以它也已經存在錯誤排序的序列,那麼為什麼反之不一定成立呢?我們簡單的舉個小例子大家就明白了,那麼大家在腦海當中簡單的構造一個圍牆圖就可以了,比如說一個非常簡單的例子,我們從零0點指向20點存在著這樣一條有向邊。比如說一個非常簡單的例子,我們從明明點指向20點存在著這樣一條有向邊,然後從二零點指向一定點也存在著,這樣交易層邊,它是不是可以得到對應的topic是這樣的,它是一個類似的線性的結構,那麼在這裡它對應的鄰接矩陣是不是並不是一個三角矩陣啊?那麼我們通過這個簡單的小例子就知道為什麼反之不一定成立了耗,這就是一個小的特點,一個小的結論,還有這就是本節課的全部內容。