国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

有向無環(huán)圖的拓撲排序理解和算法

這篇具有很好參考價值的文章主要介紹了有向無環(huán)圖的拓撲排序理解和算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

有向無環(huán)圖的拓撲排序理解和算法

  1. 有向無環(huán)圖(DAG)定義

引用子維基百科的DAG定義, 在數(shù)學(xué)中,尤其是圖論和計算機科學(xué)中,DAG是一類不含環(huán)的有向圖(In mathematics, particularly graph theory, and computer science, a directed acyclic graph (DAG) is a directed graph with no directed cycles). 對比之前的有向圖的強連通分量,凡是在圖中能能夠找到強連通分量的有向圖(單個頂點除外),都排除在DAG之外。對于有向無環(huán)圖,拓撲排序是其關(guān)鍵的操作,通過拓撲排序,便能把有向無環(huán)圖的先后遍歷順序”線性化“。

  1. DAG的應(yīng)用

現(xiàn)實世界中,很多場合都涉及到DAG的應(yīng)用,最常見的應(yīng)用包括,項目管理中各個事件先后順序排列的可行性,學(xué)校選課系統(tǒng)設(shè)計, 程序設(shè)計的互相依附以及事件的模擬等等。

我們以某高校的選課系統(tǒng)為例進行說明,如果要選擇Class H, 那么選修之前需要完成Class D 和 Class E課程,如果要選擇Class D課程,就需要提前學(xué)習(xí)Class A和 Class B.

有向無環(huán),算法,圖論

選擇Class H的前置條件

有向無環(huán),算法,圖論

  1. 拓撲排序目標(biāo)

在拓撲排序中,我們需要對有向無環(huán)圖每個頂點進行檢查,經(jīng)過拓撲排序后,我們會形成一個類似數(shù)組的線性結(jié)構(gòu)來表示各個頂點的先后順序,Dynamic Programming就需要利用DAG形成某些節(jié)點,對這些節(jié)點進行共用,減少計算事件。值得一提的是,拓撲排序的結(jié)果不一定唯一,同一個DAG圖形可能會有幾個不同的拓撲排序。我們以下圖為例,

有向無環(huán),算法,圖論

最后形成的線性次序關(guān)系如下:
有向無環(huán),算法,圖論

  1. 算法原理

一般實現(xiàn)Topological 排序方法有 Kahn’s 算法和 DFS算法,

  • Kahn’s 算法非常直觀,兩步循環(huán)即可

? (1)在有向圖中選一個沒有前驅(qū)的頂點且輸出之

? (2)在圖中刪除該頂點和所有以它為尾的弧,換言之;對于圖上以此點為弧頭的頂點,其入度減1

? 重復(fù)上述兩步,直至全部頂點均已輸出,或者當(dāng)前圖中不存在無前驅(qū)的頂點為止(存在環(huán))

? 在Kahn’s 算法中:

? (a)可以直接線性搜索 入度為0的頂點(沒有前驅(qū))

? (b) 利用棧或隊列進行保留入度為0的頂點,后面直接出棧,更新相關(guān)頂點的入度值

? 兩類算法的事件復(fù)雜度分別為O(|V|2)和O(|V|+|E|).

  • DFS 算法當(dāng)有向圖中無環(huán)時,也可用DFS進行拓撲排序,因為圖中無環(huán),則由圖中某點出發(fā)進行深度優(yōu)先搜索遍歷時,最先退出DFS函數(shù)的頂點即出度為零的頂點,是拓撲有序序列中的最后一個頂點??梢岳脭?shù)組進行拓撲有序序列中的序號存儲。

    ? ? DFS算法實現(xiàn)

  1. 算法代碼實現(xiàn)

(a)可以直接線性搜索 入度為0的頂點(沒有前驅(qū))

/**
	Use Adajacent list to go through each vertex
	Work out the indegree array based on the traversal
*/
void assign_indegree(ALGraph G, int *indegree)
{
    int i;
    int v;
    int w;

    
    for(v=0;v<G.vexnum;v++)
    {
        for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
        {
            indegree[w]++;
        }
    }    
}

?

/**
Linear search the indegree array and return the first new zero indegree vertex node
*/
int find_new_zero_indegree_vertex(ALGraph G, int *indegree, int *top_num)
{
    int i;

    for(i=0;i<G.vexnum;i++)
    {
        if(top_num[i]==-1 && indegree[i]==0)
        {
            return i;
        }
    }

    return NOT_A_VERTEX;  //NOT_A_VERTEX=-1;
}
/**
	Find the topological sort of directed graph
*/
Status topological_sort(ALGraph G,void (*visit)(VertexType e))
{
    int counter;
    int indegree[MAX_VERTEX_NUM];
    int top_num[MAX_VERTEX_NUM]; //top_num will store the top order vertex #No.
    int v;
    int w;

    for(counter=0;counter<G.vexnum;counter++)
    {
        *(top_num+counter)=-1;
    }

    memset(indegree,0,sizeof(int)*MAX_VERTEX_NUM);
    assign_indegree(G,indegree);

    for(counter=0;counter<G.vexnum;counter++)
    {
        v=find_new_zero_indegree_vertex(G,indegree,top_num);

        //If v equals to NOT Available VERTEX, 
        //it must contain the cycle in the graph
        //terminate the program
        if(v==NOT_A_VERTEX)
        {
            return ERROR;
        }
		
        
        *(top_num+v)=counter;

        for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
        {
            indegree[w]--;
        }
    }

    dispay_order(G,top_num,visit);
}
/**
Display the topological order based on top_num array list
*/
void dispay_order(ALGraph G, int *top_num, void (*visit)(VertexType e))
{
    int i;

    for(i=0;i<G.vexnum;i++)
    {
        visit(G.vertices[top_num[i]].data);
    }
}

(b) 利用?;蜿犃羞M行保留入度為0的頂點,后面直接出棧,更新相關(guān)頂點的入度值

void assign_indegree(ALGraph G, int *indegree)
{
    int i;
    int v;
    int w;

    
    for(v=0;v<G.vexnum;v++)
    {
        for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
        {
            indegree[w]++;
        }
    }    
}

Status topological_sort(ALGraph G,void (*visit)(VertexType e))
{
    SqStack S;
    int indegree[MAX_VERTEX_NUM];
    int i;
    int v;
    int w;
    int count;

    InitStack_Sq(&S);
    memset(indegree,0,sizeof(int)*MAX_VERTEX_NUM);
    assign_indegree(G,indegree);
    count =0;

    for(i=0;i<G.vexnum;i++)
    {
        if(!indegree[i])
        {
            Push_Sq(&S,i);
        }
    }

    while(!StackEmpty_Sq(S))
    {
        Pop_Sq(&S,&v);
        visit(G.vertices[v].data);
        count++;

        for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
        {
            if(!(--indegree[w]))
            {
                Push_Sq(&S,w);
            }
        }
    }

    if(count<G.vexnum)
    {
        return ERROR;
    }

    return OK;


}

? DFS算法實現(xiàn)

Status find_topological_sort(ALGraph G, int *ordering)
{
    int v;
    int w;
    count =0;
    int index;
    memset(visited,0,sizeof(int)*MAX_VERTEX_NUM);
    index=G.vexnum-1;

    for(v=0;v<G.vexnum;v++)
    {
        if(!visited[v])
        {
            dfs_topological_sort(G,v,index-count,ordering);
        }
    }

    if(count<G.vexnum)
    {
        return ERROR;
    }

    return OK;
}

//----
int dfs_topological_sort(ALGraph G, int v0, int index, int *ordering)
{
    
    int v;
    int w;
    visited[v0]=1;
    count++;

    v=v0;

    for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
    {
         if(!visited[w])
        {
            //index will be kept as the same as DFS deep dive into search
            //when the first recursive call ended, it will be decremented by 1
            //and in the next loop, index will be upated in the recursive call
            index=dfs_topological_sort(G,w,index,ordering);
        }
    }
    
    ordering[index]=v;
    return index-1;
}
//------
void dispay_ordering(int *ordering, ALGraph G, void (*visit)(VertexType e))
{
    int i;

    for(i=0;i<G.vexnum;i++)
    {
        visit(G.vertices[ordering[i]].data);
    }
}

  1. 總結(jié)

DAG的拓撲排序(全序)建立頂點或元素之間的先后關(guān)系,利用DAG的拓撲排序結(jié)果,可以有效地管理項目中不不同節(jié)點的先后順序,可以更合理地進行選課,抑或?qū)Υ笮统绦蛑g的依附關(guān)系進行羅列,做到邏輯次序先后合理,更好完成具體的應(yīng)用工作。

具體來說,如果對于某個事件或節(jié)點,其沒有任何前置約束,那么此事件或節(jié)點就可以作為當(dāng)前的拓撲有序點。拓撲排序算法一般分為Kahn’s 和經(jīng)典的DFS深度優(yōu)先搜索法,Kahn’s 比較直觀,DFS搜索法代碼簡練,各有千秋。

Reference book and video:

a)《數(shù)據(jù)結(jié)構(gòu)》 嚴(yán)蔚敏

b) Video, Topological Sort Algorithm|Graph Theory, William Fiset文章來源地址http://www.zghlxwxcb.cn/news/detail-766664.html

到了這里,關(guān)于有向無環(huán)圖的拓撲排序理解和算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】有向無環(huán)圖(AOE-網(wǎng))的關(guān)鍵路徑(C語言)

    【數(shù)據(jù)結(jié)構(gòu)】有向無環(huán)圖(AOE-網(wǎng))的關(guān)鍵路徑(C語言)

    把用頂點表示事件,用弧表示活動,弧的權(quán)值表示活動所需要的時間的有向無環(huán)圖稱為 邊表示活動的網(wǎng) ,簡稱 AOE-網(wǎng) 。 在AOE-網(wǎng)中存在唯一的、入度為0的頂點,稱為 源點 ;存在唯一的、出度為0的頂點,稱為 匯點 。從源點到匯點的最長路徑長度即為完成整個工程任務(wù)所需的

    2024年02月07日
    瀏覽(22)
  • (Java)數(shù)據(jù)結(jié)構(gòu)——圖(第八節(jié))有向無環(huán)圖(DAG圖)以及DAG描述表達式

    (Java)數(shù)據(jù)結(jié)構(gòu)——圖(第八節(jié))有向無環(huán)圖(DAG圖)以及DAG描述表達式

    本博客是博主用于復(fù)習(xí)數(shù)據(jù)結(jié)構(gòu)以及算法的博客,如果疏忽出現(xiàn)錯誤,還望各位指正。 昨天復(fù)習(xí)了拓撲排序,打算寫個博客,一翻數(shù)據(jù)結(jié)構(gòu)的書到那,發(fā)現(xiàn)連著概念還有DAG圖以及AOV網(wǎng),于是看了看,這篇博客先來介紹有向無環(huán)圖DAG。 下圖一個無環(huán)的有向圖乘坐有向無環(huán)圖,

    2024年04月12日
    瀏覽(16)
  • 【海量數(shù)據(jù)挖掘/數(shù)據(jù)分析】之 貝葉斯信念網(wǎng)絡(luò)(貝葉斯信念網(wǎng)絡(luò)、有向無環(huán)圖、貝葉斯公式、貝葉斯信念網(wǎng)絡(luò)計算實例)

    【海量數(shù)據(jù)挖掘/數(shù)據(jù)分析】之 貝葉斯信念網(wǎng)絡(luò)(貝葉斯信念網(wǎng)絡(luò)、有向無環(huán)圖、貝葉斯公式、貝葉斯信念網(wǎng)絡(luò)計算實例)

    目錄 【海量數(shù)據(jù)挖掘/數(shù)據(jù)分析】之 貝葉斯信念網(wǎng)絡(luò)(貝葉斯信念網(wǎng)絡(luò)、有向無環(huán)圖、貝葉斯公式、貝葉斯信念網(wǎng)絡(luò)計算實例) 一、貝葉斯信念網(wǎng)絡(luò) 1 . 屬性關(guān)聯(lián) : 貝葉斯信念網(wǎng)絡(luò) 允許數(shù)據(jù)集樣本屬性 之間存在依賴關(guān)系 ; 2 . 貝葉斯信念網(wǎng)絡(luò) 表示方法 : 二、概率圖模型 : 馬爾

    2024年02月12日
    瀏覽(24)
  • 【數(shù)據(jù)結(jié)構(gòu)——有向圖】有環(huán)無環(huán)判定、拓撲排序(DFS、BFS)

    【數(shù)據(jù)結(jié)構(gòu)——有向圖】有環(huán)無環(huán)判定、拓撲排序(DFS、BFS)

    有向圖(Directed Graph),也被稱為有向圖形或方向圖,是一種圖的類型。在有向圖中,圖中的邊具有方向,從一個頂點指向另一個頂點。 在有向圖中,每個頂點表示一個實體,而有向邊則表示實體之間的關(guān)系或連接。這種有方向性的邊表明了連接的起點和終點之間的單向關(guān)系

    2024年02月09日
    瀏覽(16)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】圖的遍歷與拓撲排序

    【數(shù)據(jù)結(jié)構(gòu)與算法】圖的遍歷與拓撲排序

    再上一篇中我們講了樹的兩種存儲方式:【數(shù)據(jù)結(jié)構(gòu)與算法】圖——鄰接表與鄰接矩陣 這一篇我們可以用數(shù)組來模擬鄰接表。 假設(shè)現(xiàn)在我們要進行n次操作,實現(xiàn)無向圖。 首先需要一個 保存是哪個節(jié)點 的數(shù)組 e 然后就是類似指針數(shù)組的 表 h ,每個表都會連一串單鏈表 e,ne

    2024年02月04日
    瀏覽(20)
  • 有向圖的拓撲排序

    拓撲排序 。任意給定一個有向圖,設(shè)計一個算法,對它進行拓撲排序。拓撲排序算法思想:a.在有向圖中任選一個沒有前趨的頂點輸出;b.從圖中刪除該頂點和所有以它為尾的??;c.重復(fù)上述a、b,直到全部頂點都已輸出,此時,頂點輸出序列即為一個拓樸有序序列;或者直到

    2024年02月09日
    瀏覽(20)
  • 2023-8-29 有向圖的拓撲排序

    2023-8-29 有向圖的拓撲排序

    題目鏈接:有向圖的拓撲排序

    2024年02月11日
    瀏覽(20)
  • 教學(xué)計劃編制問題(數(shù)據(jù)結(jié)構(gòu) 有向圖 拓撲排序)

    教學(xué)計劃編制問題(數(shù)據(jù)結(jié)構(gòu) 有向圖 拓撲排序)

    ?本文對以下教學(xué)計劃編制問題的解決作出實現(xiàn),主要使用c語言(帶一點cpp),開發(fā)環(huán)境為codeblocks 17.12,希望對各位讀者有所幫助。(源碼和數(shù)據(jù)文件可在主頁獲取,同時還有使用視頻文件壓縮包,數(shù)據(jù)文件需要和exe在同一目錄下,結(jié)合某讀者的意見同時放到github了?) 地址如下

    2024年02月09日
    瀏覽(16)
  • ?算法進階?圖論::拓撲排序(Topological Sorting)——快速理解到熟練運用

    ?算法進階?圖論::拓撲排序(Topological Sorting)——快速理解到熟練運用

    目錄 ?一、原理 1. 引例:207.課程表 ?2. 應(yīng)用場景 3. 代碼思路 二、代碼模板 三、練習(xí) 1、210.課程表Ⅱ?? 2、2392.給定條件下構(gòu)造舉證?? 3、310.最小高度樹?? 4、 2603.收集樹中金幣 ?? 1. 引例:207.課程表 就如大學(xué)課程安排一樣,如果要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法、機器學(xué)習(xí)這類課程

    2024年02月11日
    瀏覽(21)
  • 17.4:圖的拓撲排序

    17.4:圖的拓撲排序

    拓撲序一定是有向無環(huán)圖。 拓撲排序不唯一 利用入度為零進行排序 思路:誰的入度為0,誰就是開始節(jié)點,將開始節(jié)點打印完之后,將開始節(jié)點的直接鄰居的入度減1,然后重復(fù)。 利用點次進行排序。 點次越大的,排序位置越靠前。 而且我發(fā)現(xiàn)可以使用遞歸進行求點次。我

    2024年02月07日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包