GO语言实现拓扑排序-2

本次主要利用BFS实现拓扑排序

在上一篇文章中,主要是利用BFS实现了拓扑排序。与DFS实现拓扑排序不一样的是,DFS主要采用递归的方式实现拓扑排序,而BFS则无需引入递归,其核心思想是对一个有向(有环)图的各个节点入度的判断与分析。

核心代码

func findOrder(numCourses int, prerequisites [][]int) []int {
     
    var (
    	//描述有向图
        edges = make([][]int, numCourses)
        //描述有向图中各个节点的入度
        indeg = make([]int, numCourses)
        //返回最后的拓扑排序结果
        result []int
    )

    for _, info := range prerequisites {
     
    //这里主要是需要对给的数据结构进行处理:
    //预先给的数据结构是[3,0]、[2,1]、[0,1]...每一个数组的前一个元素均需要后一个元素。或者说前一个元素代表的课程,均需要先修后一个元素。
    //这里所建立的数据结构关系就是:edges[i]表示所有需要以edges[i]为先修课程的课程集合。
        edges[info[1]] = append(edges[info[1]], info[0])
    //增加课程入度
        indeg[info[0]]++
    }

    q := []int{
     }
    for i := 0; i < numCourses; i++ {
     
        if indeg[i] == 0 {
     
            q = append(q, i)
        }
    }

    for len(q) > 0 {
     
        u := q[0]
        q = q[1:]
        //入度为0,才能进入到最后的结果队列中
        result = append(result, u)
        for _, v := range edges[u] {
     
            indeg[v]--
            if indeg[v] == 0 {
     
                q = append(q, v)
            }
        }
    }
    //如果结果队列的长度与课程数并不相等,说明有环
    if len(result) != numCourses {
     
        return []int{
     }
    }
    return result
}

在我看来,BFS因为省去了递归流程,效率应优于DFS。

你可能感兴趣的:(go,算法,数据结构,数据结构,队列,算法)