18910140161

Golang实现拓扑排序(DFS算法版本)

顺晟科技

2021-08-28 09:41:12

58

问题说明:有一系列数字1至5,根据以下顺序要求重新排列和打印。要求如下:2出现在5前,3出现在2前,4出现在1前,1出现在3前。

这是一个非常常见的拓扑排序问题。常见的拓扑排序解决方法是使用DFS-深度优先级算法。我对DFS算法的浅理解是递归。因为拓扑排序问题本身有一些先决条件(本文不详细说明拓扑算法的定义),所以解决这个问题有以下想法:

将排序要求声明为map(map的key,value视为顺序的要求,key必须出现在value之前),重复1-5在map中查找key,如果有的话,在map中单击key,value的关系,然后从map[key]中获取的vey以下是使用Golang实现上述问题的方法。

[py] view plaincopy

Package main

Import(

“Fmt”

' Strconv '

)。

//edge请求顺序

var edge map[string]string=map[string]string {

2': '5 ',

3': '2 ',

4': '1 ',

1': '3 ',

}

Func main() {

//结果阵列

Var q []string=make([]string,0)

//访问的数组

varvisited[]string=make([]string,0)

FOR I :=0;I 5;I {

Tupusort (q,visited,strconv.itoa (I))

}

//fmt . printf(‘visited 3360% v \ n’,visited)

Reverse(q)

fmt . printf(“topusort 3360% v \ n”,q)

}

//拓扑对齐-DFS

Functup usort (q * [] string,visited * [] string,element string) {

If!IsVisited(visited,element) {

* visited=append (* visited,element)

If edge[element]!='' {

Tup usort (q,visited,edge [element])

}

*q=append(*q,element)

}

}

//确认您在访问的数组中

Funcis visited (visited * [] string,element string) bool {

Var isVisited bool=false

For _,item3360=range * visited {

If item==element {

IsVisited=true

布雷克

}

}

Return isVisited

}

//反转阵列顺序

Func reverse(arr []string) {

For i,j :=0,LEN(ARR)-1;I J;I,j=I 1,j-1 {

Arr[i],arr[j]=arr[j],arr[i]

}

}

最终输出如下

topusort 3360[4 1 3 2 5 0]

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航