首页 > 其他分享 >【数据结构】五分钟带你了解及自定义有向图

【数据结构】五分钟带你了解及自定义有向图

时间:2022-12-23 17:38:43浏览次数:32  
标签:有向图 自定义 self results .__ path 顶点 数据结构

前言

什么是有向图

在数学中,一个(Graph)是表示物件与物件之间的关系的方法,是图论的基本研究对象。一个图看起来是由一些小圆点(称为顶点结点)和连结这些圆点的直线或曲线(称为)组成的。

以下数有向图在数学中的定义:

有向图是一个二元组<V,E>,其中

1.V是非空集合,称为顶点集

2.E是V×V的子集,称为弧集

而图在数据结构中是中一对多的关系,一般分为有向图和无向图。有向图和无向图最大的区别在于每条路径都带有方向性。在有向图中,边是单向的,每条边连接的两个顶点都是一个有序对。假如把无向图看成是双行道,可以任意穿梭的话,有向图就是一座只有单行道的城市,而且这些单行道是杂乱无章的。因此要求解一处到另一处的路径问题就会变得复杂起来。其实在开发的过程中,我们接触过的很多场景都是有向图,比如:任务调度的依赖关系和社交网络的任务关系等。相对应的概念有:孤立点、简单图、完备图、基本图、强连通图、弱连通图、单向连通图、强连通分支、有向通路。。。等。由于篇幅原因,这里仅仅是抛转引玉点到为止,感兴趣的童鞋,可以自行了解这些相关的概念。

无向图:

【数据结构】五分钟带你了解及自定义有向图_图解算法

下面就是一个简单的有向图:

【数据结构】五分钟带你了解及自定义有向图_有向图_02

基本概念

有向图的基本概念概括如下:

  • 有向图:由一组顶点和一组有方向的边组成,每条有方向的边都连接着一组顶点。
  • 顶点的出度:该顶点指出的边的总数。
  • 顶点的入度:指向该顶点的边的总数。
  • 度:顶点的入度+顶点的出度,称为该顶点的度。自环(起点和终点为同一顶点),此时出度算一度,入度也算一度。
  • 有向路径:由一系列顶点组成,其中每个顶点都存在一条有向边,由它指向序列中的下一个顶点
  • 有向环:至少含有一条边,且起点和终点相同的有向路径。虽然有向图中环的数量和大小也是有用的信息,但是在实际应用过程中,我们更多的只关心是否存在有向环。
  • 简单有向环:除了起点和终点外,不含有重复的顶点和边的环。

【数据结构】五分钟带你了解及自定义有向图_数据_03

【数据结构】五分钟带你了解及自定义有向图_图解算法_04

代码实现

实现流程

  1. 自定义有向图,并用邻接表进行储存。实现所有途径和最短路径的求解,通过isinstance() 函数判断数据类型.
  2. 对输入的数据进行存储

如何实现有向图

使用关键字class,创建DirectedGraph类,并且定义__init__()方法,初始化变量,存储输入的数据。代码如下:

class DirectedGraph(object):
def __init__(self,d):
if isinstance(d,dict):
self.__graph = d
else:
self.__graph = dict() #字典
print('发生错误')

在DirectedGraph类中定义生成路径的__generatePath()方法.代码如下:

def __generatePath(self,graph,path,end,results):
curret = path[-1]
if curret == end:
results.append(path)
else:
for n in graph[curret]:
if n not in path:
self.__generatePath(graph,path+[n],end,results)

在DirectedGraph类中定义searchPath()方法,搜寻并展示所有路径:

def searchPath(self,start,end):
self.__results = []
self.__generatePath(self.__graph,[start],end,self.__results)
self.__results.sort(key=lambda x:len(x)) #按路径长度进行排序
print(self.__results[0][0],'到',self.__results[0][-1],'的路径是:')
for path in self.__results:
print(path)

终于到了见证奇迹的时刻,验证代码是否正确:

#输入一个字典
d={'A':['B','C','D'],
'B':['E'],
'C':['D','F'],
'D':['B','E','G'],
'E':['D'],
'F':['D','G'],
'G':['E']}

g=DirectedGraph(d)
#遍历不同顶点的所有路径
g.searchPath('A','D')
g.searchPath('A','G')
g.searchPath('A','F')

执行结果如下:

【数据结构】五分钟带你了解及自定义有向图_数据_05

标签:有向图,自定义,self,results,.__,path,顶点,数据结构
From: https://blog.51cto.com/micai01/5965926

相关文章

  • WPF自定义界面WindowChrome
    默认WPF的界面其实也还行,就是满足不了日渐增长的需求,界面还是需要有更高的自定义程度,包括标题栏也要能够塞下更多的操作控件。默认窗口介绍#新建WPF项目,给里面内容设置......
  • Bash自定义函数numbeep:Cygwin、Mintty窗口重复响铃并闪烁以提示新信息
    概述:有时候会碰到这样的场景,在Cygwin或MSYS2环境下工作,执行一个耗时较长的任务(eg:gcc编译、rsync同步等等...),我们不想长时间保持窗口激活状态在前台苦等任务运行结束,窗口切......
  • SpringBoot2.x系列教程25--整合SpringMVC之欢迎页面与自定义Favicon
    SpringBoot2.x系列教程25--整合SpringMVC之欢迎页面与自定义Favicon作者:一一哥一.SpringBoot设置欢迎页面1.默认欢迎页的源码在SpringBoot中,默认的欢迎界面是index.html,那......
  • 数据结构面试常见问题
    数据结构作为计算机的一门基础学科,它在面试中占有很大的比重,本科阶段,我们也学过数据结构与算法,内容比较多,也比较难,尤其是图的应用以及各类查找和排序算法,这些也都是核心内......
  • SpringBoot2.x系列教程10--小花样之SpringBoot配置自定义Banner
    SpringBoot系列教程10--小花样之SpringBoot配置自定义Banner作者:一一哥一.SpringBoot常用配置本章节主要介绍一下SpringBoot中的一些常用配置,比如:自定义Banner、配......
  • [数据结构]单向链表及其基本操作(C语言)
    单向链表什么是单向链表链表是一种物理储存单元上非连续、非顺序的储存结构。它由一系列结点(链表中每一个元素称为结点)组成,结点可动态生成。每个结点包括两个部分:一个是......
  • FastDFS客户端与自定义文件存储系统
    本文的前提是已经启动FastDFS的tracker和storage安装安装提供给大家的fdfs_client-py-master.zip到虚拟环境中 pipinstallfdfs_client-py-master.zip 链接:ht......
  • 自定义python Django文件存储系统
    在学习Django框架的时候,我们已经讲过,Django自带文件存储系统,但是默认文件存储在本地,在本项目中,我们需要将文件保存到FastDFS服务器上,所以需要自定义文件存储系统。自定义......
  • Vue 自定义事件
    组件的自定义事件使用场景A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)绑定自定义事件在父组件中:<HelloWorld@customEv......
  • B/S端界面控件DevExtreme中文使用指南——如何自定义图标
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能......