Go的数据结构与实现【Graph】

介绍

图是网络结构的表示。现实世界中有大量图谱示例,互联网和社交图谱就是经典示例。图基本上是一组由边连接的节点。

实现

实现思路

图形数据结构将实现这些方法:

AddNode():添加一个节点到图里
AddEdge():添加一条边到图里
Print():打印图结构
图结构定义为:


type Graph struct {sync.RWMutexnodes []*Nodeedges map[Node][]*Node
}

节点定义为:

import "fmt"type T stringtype Node struct {value T
}// Print a node
func (n *Node) Print() string {return fmt.Sprintf("%v", n.value)
}

这里将实现一个无向图,这意味着从A到B添加一条边也会从B到A添加一条边。

func NewGraph() *Graph {g := &Graph{nodes: []*Node{},edges: make(map[Node][]*Node),}return g
}// AddNode adds a node to the graph
func (g *Graph) AddNode(n *Node) {g.Lock()g.nodes = append(g.nodes, n)g.Unlock()
}// AddEdge adds an edge to the graph
func (g *Graph) AddEdge(n1, n2 *Node) {g.Lock()defer g.Unlock()if g.edges == nil {g.edges = make(map[Node][]*Node)}g.edges[*n1] = append(g.edges[*n1], n2)g.edges[*n2] = append(g.edges[*n2], n1)
}// Print whole graph
func (g *Graph) Print() {g.Lock()defer g.Unlock()ret := ""for i := 0; i < len(g.nodes); i++ {ret += g.nodes[i].Print() + " -> "neighborhood := g.edges[*g.nodes[i]]for j := 0; j < len(neighborhood); j++ {ret += neighborhood[j].Print() + " "}ret += "\n"}fmt.Println(ret)
}

单元测试

这是一个测试,运行时将填充图结构并打印:

import "testing"var (nA = &Node{"A"}nB = &Node{"B"}nC = &Node{"C"}nD = &Node{"D"}nE = &Node{"E"}nF = &Node{"F"}
)func InitGraph() *Graph {g := NewGraph()g.AddNode(nA)g.AddNode(nB)g.AddNode(nC)g.AddNode(nD)g.AddNode(nE)g.AddNode(nF)g.AddEdge(nA, nB)g.AddEdge(nA, nC)g.AddEdge(nB, nE)g.AddEdge(nC, nE)g.AddEdge(nE, nF)g.AddEdge(nD, nA)return g
}func TestGraph_Print(t *testing.T) {g := InitGraph()g.Print()
}

输出:

A -> B C D 
B -> A E 
C -> A E 
D -> A 
E -> B C F 
F -> E --- PASS: TestGraph_Print (0.00s)
PASS

遍历

BFS(广度优先搜索)是最广为人知的遍历图的算法之一。从一个节点开始,它首先遍历其所有直接链接的节点,然后处理链接到这些节点的节点,依此类推。

它是使用队列实现的,我们可以用之前实现的队列数据结构来辅助完成这个算法:

// Traverse implements the BFS traversing algorithm
func (g *Graph) Traverse(f func(*Node)) {g.RLock()q := NewNodeQueue()n := g.nodes[0]q.Enqueue(n)visited := make(map[*Node]bool)for {if q.IsEmpty() {break}node, _ := q.Dequeue()visited[node] = truenear := g.edges[*node]for i := 0; i < len(near); i++ {j := near[i]if !visited[j] {q.Enqueue(j)visited[j] = true}}if f != nil {f(node)}}g.RUnlock()
}

我们对算法进行测试:

func TestGraph_Traverse(t *testing.T) {g := InitGraph()g.Traverse(func(n *Node) {fmt.Printf("%v\n", n.value)})
}

输出结果:

A
B
C
D
E
F
--- PASS: TestGraph_Traverse (0.00s)
PASS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++庖丁解牛】自平衡二叉搜索树--AVL树

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言1 AVL树的概念2. AVL…

探索未来的视觉智能:AI视频分析系统的崭新时代

随着人工智能技术的飞速发展&#xff0c;AI视频分析系统正逐渐成为各行业的关注焦点。这些系统不仅可以帮助安防领域实现更智能化的监控&#xff0c;还能在零售、交通、医疗等领域发挥重要作用。本文将深入探讨AI视频分析系统的崭新时代&#xff0c;揭示其未来发展的无限可能。…

曼哈顿距离转化为切比雪夫距离

目录 1 介绍2 训练3 参考 1 介绍 本专题介绍曼哈顿距离如何转化为切比雪夫距离。 A点 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​)和B点 ( x 2 , y 2 ) (x_2,y_2) (x2​,y2​)的曼哈顿距离定义为它们的坐标差绝对值之和&#xff0c;即 ∣ x 1 − x 2 ∣ ∣ y 1 − y 2 ∣ |x_1-x_…

2-HDFS常用命令及上传下载流程

HDFS NameNode 安全模式(safemode) 当NameNode被重启的时候&#xff0c;自动进入安全模式 在安全模式中&#xff0c;NameNode首先会触发edits_inprogress文件的滚动。滚动完成之后&#xff0c;更新fsimage文件 更新完成之后&#xff0c;NameNode会将fsimage文件中的元数据加…

利用python做模拟数据(测试数据),连接数据库和服务器接口,涉及雪花id服务

import datetime import jsonimport pymysql import requests import snowflake.client from faker import Faker#cmd启动snowflake服务&#xff1a; #snowflake_start_server --addresslocalhost --port8910 --dc1 --worker1 def create_testers():# 创建一个中文Faker实例fak…

Python 判断当前操作系统的几种方法

本文介绍 Python 判断操作系统的3种方法。以下的方法将分为这几部分&#xff1a; Python os.namePython sys.platformPython platform.system() Python os.name Python 判断操作系统的方法可以使用 os.name&#xff0c;这里以 Python 3 为例&#xff0c;os.name 会返回 posi…

基于java+SpringBoot+Vue的网上书城管理系统设计与实现

基于javaSpringBootVue的网上书城管理系统设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 整体功能包含&#xff1a; 网上书城管理系统是一个基于互联网的在线购书平台&#…

文献学习-23-MRM:用于遗传学医学图像预训练的掩码关系建模

MRM: Masked Relation Modeling for Medical Image Pre-Training with Genetics Authors: Qiushi Yang, Wuyang Li, Baopu Li, Yixuan Yuan Source: ICCV 2023 Abstract: 关于自动多模态医疗诊断的 ODERN 深度学习技术依赖于大量的专家注释&#xff0c;这既耗时又令人望而却…

【Spring MVC】快速学习使用Spring MVC的注解及三层架构

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Spring MVC】快速学习使用Spring MVC的注解及三层架构 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 Spring Web MVC一: 什么是Spring Web MVC&#xff1…

何时应用 RAG 与微调

充分发挥 LLM 的潜力需要在检索增强生成&#xff08;RAG&#xff09;和微调之间选择正确的技术。 让我们来看看何时对 LLM、较小的模型和预训练模型使用 RAG 与微调。我们将介绍&#xff1a; LLM 和 RAG 的简要背景RAG 相对于微调 LLM 的优势何时针对不同模型大小对 RAG 进行…

python 贪吃蛇

main.py #!/usr/bin/env python3 # -*- coding: utf-8 -*-import pygame # 导入pygame模块from setting import Setting import startmain as sm from pygame.sprite import Groupdef InitGame():print("InitGame")pygame.init() #初始化pygameai_settings Se…

【图轮】【 最小生成树】【 并集查找】1489. 找到最小生成树里的关键边和伪关键边

本文涉及知识点 图轮 最小生成树 并集查找 关键边 1489. 找到最小生成树里的关键边和伪关键边 给你一个 n 个点的带权无向连通图&#xff0c;节点编号为 0 到 n-1 &#xff0c;同时还有一个数组 edges &#xff0c;其中 edges[i] [fromi, toi, weighti] 表示在 fromi 和 to…

书生·浦语全链路开源开放体系 第二期

文章目录 大模型背景大模型开发流程InternLM 2.0SFT与RLHFInternLM2主要亮点 书生浦语全链路开源开放体系数据-书生万卷InternLM-Train微调 XTuner评测工具 OpenCompass部署 LMDeploy智能体 Lagent智能体工具箱 AgentLego 大模型背景 专用模型&#xff1a;针对特定的任务&…

【Web】NSSCTF Round#20 Basic 个人wp

目录 前言 真亦假&#xff0c;假亦真 CSDN_To_PDF V1.2 前言 感谢17&#x1f474;没让我爆零 真亦假&#xff0c;假亦真 直接getshell不行&#xff0c;那就一波信息搜集呗&#xff0c;先开dirsearch扫一下 扫的过程中先试试常规的robots.txt,www.zip,shell.phps,.git,.sv…

使用Docker Compose一键部署前后端分离项目(图文保姆级教程)

一、安装Docker和docker Compose 1.Docker安装 //下载containerd.io包 yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm //安装依赖项 yum install -y yum-utils device-mapper-persistent-data l…

求整数各个数位上的数字之和 C语言

对于任意输入的整数&#xff0c;计算其各个数位上的数字之和。 输入格式 输入一个正整数 N。 输出格式 输出 N 的各个位上的数字之和。 数据范围 1 < N < 2^31 #include <stdio.h> #include <stdlib.h> int shu(int x){ int sum0; while(x>0)…

百度云加速方法「Cheat Engine」

加速网盘下载 相信经常玩游戏的小伙伴都知道「Cheat Engine」这款游戏内存修改器&#xff0c;它除了能对游戏进行内存扫描、调试、反汇编 之外&#xff0c;还能像变速齿轮那样进行本地加速。 这款专注游戏的修改器&#xff0c;被大神发现竟然还能加速百度网盘资源下载&#xf…

c++前言

目录 1. 什么是 C 2. C 发展史 3. C 的重要性 4. 如何学习 C 5. 关于本门课程 1. 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度的抽象和建模时&#xff0c; C 语言则不合适…

【JavaParser笔记01】JavaParser解析Java源代码中的类信息(javadoc注释、类​​​​​​​名称)

这篇文章,主要介绍如何使用JavaParser解析Java源代码中的类信息(javadoc注释、类名称)。 目录 一、JavaParser依赖库 1.1、引入依赖 1.2、获取类注释信息

【Python进阶(一)】——异常与错误

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…