日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Go 分布式学习利器(15) -- Go 实现 深搜和广搜

發布時間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go 分布式学习利器(15) -- Go 实现 深搜和广搜 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

強化語法,回顧算法。

通過Go語言實現 深度優先搜索 和 廣度優先搜索,來查找社交網絡中的三度好友關系(三度指的是一個節點到 其相鄰節點 到 其相鄰節點的節點 ,圖遞增三層好友關系)。

涉及到的Go語言語法:

  1. Go的封裝特性
  2. 空接口和 斷言
  3. 數組的切片特性
  4. Go 實現的雙向鏈表庫 – container/list

實現基本的搜索算法:深搜和廣搜

深度優先搜索 就是沿著一個方向一直走,如果發現最后的結果是失敗的,回溯到上一步,繼續嘗試其他分支。

廣度優先搜索 就是層次搜索,將從當前節點到下一節點所有的步驟都走一遍,并保存走過的節點;到第三步時從保存的節點中取一個再走一步,將這一步所有的可達節點也都保存下來。

算法比較基礎,代碼如下:
圖使用的無向圖演示,并使用鄰接表保存。

package mainimport ("container/list""fmt"
)//adjacency table, 無向圖
type Graph struct {adj []*list.List // double linklist storage the graph edgev   int // storage node's value
}//init graphh according to capacity
func newGraph(v int) *Graph {graphh := &Graph{}graphh.v = vgraphh.adj = make([]*list.List, v)for i := range graphh.adj {graphh.adj[i] = list.New()}return graphh
}//insert as add edge,使用鄰接表構建無向圖
func (self *Graph) addEdge(s int, t int) {self.adj[s].PushBack(t)self.adj[t].PushBack(s)
}// Find the path by bfs
func (g *Graph)bfs(s int, n int) {if s == n {return}visited := make([]bool, g.v)visited[s] = trueprev := make([]int, g.v)for index := range prev{prev[index] = -1}var queue []intqueue = append(queue,s)visited[s] = truefound := falsefor len(queue) > 0 && !found {top := queue[0]queue = queue[1:] // 去掉頭隊頭元素graphlink := g.adj[top]for edge := graphlink.Front(); edge != nil; edge = edge.Next() {k,ok := edge.Value.(int) // turn the nil interface to int 即空接口通過斷言轉為intif ok {if !visited[k] {prev[k] = topif k == n{found = truebreak}queue = append(queue,k)visited[k] = true}}}}if found {printPath(prev,s,n)} else {fmt.Printf("no path found from %d to %d\n",s,n )}}//search by DFS
func (self *Graph) DFS(s int, t int) {prev := make([]int, self.v)for i := range prev {prev[i] = -1}visited := make([]bool, self.v)visited[s] = trueisFound := falseself.recurse(s, t, prev, visited, isFound)printPath(prev, s, t)fmt.Println()
}//recurse find path
func (self *Graph) recurse(s int, t int, prev []int, visited []bool, isFound bool) {if isFound {return}visited[s] = trueif s == t {isFound = truereturn}linkedlist := self.adj[s]for e := linkedlist.Front(); e != nil; e = e.Next() {k := e.Value.(int) // turn the nil interface to intif !visited[k] {prev[k] = sself.recurse(k, t, prev, visited, false)}}}// print path recurse , to keep the visit sequence
func printPath(path []int ,s int ,n int) {if path[n] != -1 && n != s {printPath(path ,s, path[n])}fmt.Printf("%d ", n)
}func main() {graph := newGraph(8)graph.addEdge(0, 1)graph.addEdge(0, 3)graph.addEdge(1, 2)graph.addEdge(1, 4)graph.addEdge(2, 5)graph.addEdge(3, 4)graph.addEdge(4, 5)graph.addEdge(4, 6)graph.addEdge(5, 7)graph.addEdge(6, 7)fmt.Println("BFS find 0-7: ")graph.bfs(0, 7)fmt.Println("BFS find 1-3: ")graph.bfs(1, 3)fmt.Println("DFS find 0-7: ")graph.DFS(0, 7)fmt.Println("DFS find 1-3: ")graph.DFS(1, 3)fmt.Println()
}

結果如下:

BFS find 0-7: 
0 1 2 5 7 BFS find 1-3: 
1 0 3 
DFS find 0-7: 
0 1 2 5 4 6 7 
DFS find 1-3: 
1 0 3 

總結

以上是生活随笔為你收集整理的Go 分布式学习利器(15) -- Go 实现 深搜和广搜的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。