Go 语言

2025年04月19日更新 4 人订阅
原价: ¥ 2 限时优惠
专栏简介 数据结构 in Golang:Hash Tables(哈希表) 算法 in Golang:Quicksort(快速排序) 算法 in Golang:Recursion(递归) 用Go语言构建分布式系统:服务注册、发现与日志管理实践 算法 in Golang:Selection sort(选择排序) Go语言之基本数据类型 深入探索Go语言:从初识到实践 实战:Go语言项目之使用JWT实现用户认证 算法 in Go:Binary Search(二分查找) 算法 in Golang:Breadth-first search(BFS、广度优先搜索) 算法 in Golang:D & C(分而治之) Go语言(Golang)编写最简单的命令行工具 深入探讨 Go 语言中的自定义 Zap 日志 Go语言详解:实现MySQL数据库的增删改查操作 深入解析Go语言Gin框架:路由注册与中间件源码剖析 Go 语言之在 Gin 框架中使用 Zap 实现高效日志管理 Go 语言中 zap 日志库的高效使用指南 Go 语言日志系统自定义:精细化日志管理与应用示例 Go 语言之搭建通用 Web 项目开发脚手架 Go语言结构体(struct)详解:定义、使用与JSON编码 探索 Go 语言的无类设计:从 Struct 到组合的优雅之道 地鼠工厂的秘密:解锁Go语言中goroutine的并发魔法 Go 并发编程实战:从互斥锁到 Goroutine 的优雅之道 用 Go 语言打造高效 TCP 扫描器:从入门到并发优化 gogen:一键生成 Go 项目,开发者的效率利器 深入剖析 Go 接口底层实现:从 eface 到 iface(基于 Go 1.24 源码) Go并发实战:5协程随机数求和 Go 开发必备:解锁 Viper 配置管理的正确姿势

算法 in Golang:Breadth-first search(BFS、广度优先搜索)

算法inGolang:Breadth-firstsearch(BFS、广度优先搜索)最短路径问题Shortest-pathproblem从A到F点有多条路径解决问题的算法Breadth-firstSearch(广度优先搜索)将问题建模为图(Graph)通过B

算法 in Golang:Breadth-first search

(BFS、广度优先搜索)

最短路径问题 Shortest-path problem

  • 从 A 到 F 点有多条路径

解决问题的算法 Breadth-first Search(广度优先搜索)

  1. 将问题建模为图(Graph)
  2. 通过 Breadth-first Search 算法来解决问题

图(Graph)是什么?

图是用来对不同事物间如何关联进行建模的一种方式

图是一种数据结构

Breadth-first Search(BFS)广度优先搜索算法

  1. 作用于图(Graph)
  2. 能够回答两类问题:
    1. 是否能够从节点 A 到节点 B?
    2. 从 A 到 B 的最短路径是什么?

以社交网络为例

  • 直接添加的朋友
    • 朋友的朋友...
    • 第一层没找到再找第二层

数据结构 Queue

  • 先进来的数据先处理(FIFO)先进先出原则
  • 无法随机的访问 Queue 里面的元素
  • 相关操作:
    • enqueue:添加元素
    • dequeue:移除元素

例子

找到名为 Tom 的朋友

  1. 把你所有的朋友都加到 Queue 里面
  2. 把 Queue 里面第一个人找出来
  3. 看他是不是 Tom
    1. 是 结束任务
    2. 否 把他所有的朋友加到 Queue 重复操作

创建项目

~/Code/go via 🐹 v1.20.3 via 🅒 base
➜ mcd breadth_first_search

Code/go/breadth_first_search via 🐹 v1.20.3 via 🅒 base
➜ go mod init breadth_first_search
go: creating new go.mod: module breadth_first_search

Code/go/breadth_first_search via 🐹 v1.20.3 via 🅒 base
➜ c

Code/go/breadth_first_search via 🐹 v1.20.3 via 🅒 base
➜

main.go 代码

package main

import "fmt"

type GraphMap map[string][]string

func main() {
 var graphMap GraphMap = make(GraphMap, 0)
 graphMap["you"] = []string{"alice", "bob", "claire"}
 graphMap["bob"] = []string{"anuj", "peggy"}
 graphMap["alice"] = []string{"peggy"}
 graphMap["claire"] = []string{"tom", "johnny"}
 graphMap["anuj"] = []string{}
 graphMap["peggy"] = []string{}
 graphMap["tom"] = []string{}
 graphMap["johnny"] = []string{}

 search_queue := graphMap["you"]

 for {
  if len(search_queue) > 0 {
   var person string
   person, search_queue = search_queue[0], search_queue[1:]
   if personIsTom(person) {
    fmt.Printf("%s is already in the queue for you.\n", person)
    break
   } else {
    search_queue = append(search_queue, graphMap[person]...)
   }
  } else {
   fmt.Println("Not found in search queue")
   break
  }
 }
}

func personIsTom(p string) bool {
 return p == "tom"
}

运行

Code/go/breadth_first_search via 🐹 v1.20.3 via 🅒 base 
➜ go run main.go
tom is already in the queue for you.

Code/go/breadth_first_search via 🐹 v1.20.3 via 🅒 base took 3.2s 
➜ 
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论