iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python如何自定义邻接表图类
  • 617
分享到

Python如何自定义邻接表图类

Python邻接表图类自定义邻接表图类Python邻接表 2022-12-16 18:12:43 617人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录python自定义邻接表图类图抽象数据类型(ADT)的术语邻接矩阵和邻接表的优缺点自定义顶点类Python图的邻接表表示总结Python自定义邻接表图类 图抽象数据类型(ADT)

Python自定义邻接表图类

图抽象数据类型(ADT)的术语

顶点(Vertex):也称节点(node),是图的基础部分。具有名称标识“key”。顶点也可以有附加信息项“playload”。

边(Edge):也称弧(arc),也是图的基础组成部分。如果一条边连接两个顶点,则表示两者具有联系。边可以是单向的,也可以是双向的。如果图中的边都是单向的,则称这个图是“有向图(directed graph/digraph)”。

权重(Weight):为了表达从一个顶点到另一个顶点的“代价”,可以给边赋权。

路径(Path):图中的路径,是由边依次连接起来的顶点序列。无权路径的长度为边的数量。带权路径的长度为所有边的权重之和。

圈(Cycle):有向图里的圈是首尾顶点相同的路径。没有圈的图称为“无圈图(acyclic graph)”,没有圈的有向图称为“有向无圈图(directed acyclic graph 或 DAG)”。

实现图的两个著名方法:邻接矩阵(adjacency matrix)和邻接表(adjacency list)。

邻接矩阵和邻接表的优缺点

二维矩阵中,每行和每列都代表图中的顶点。如果顶点v到顶点w之间有边相连,则将值储存在矩阵的v行、w列。每一格的值代表了从顶点v到顶点w边的权重。

邻接矩阵的优点:是简单,然而,大部分的矩阵是空的,这种情况则称矩阵是“稀疏”的。矩阵并不是一个储存稀疏数据的有效途径。

实现稀疏图的更高效方法是使用邻接表(adjacency list)。

在这个实现方法中,包含一个含有所有顶点的主列表(master list),主列表中的每个顶点,再关联一个与自身有边连接的所有顶点的列表。

在实现顶点类的方法中使用字典而不是列表,字典中的键(key)对应顶点,值(value)则保存顶点连接边的权重。

邻接表的优点:是能高效地表示一个稀疏图。邻接表还能很容易的找到某个顶点与其他顶点的所有连接。

自定义顶点类

class Vertex(object):
	# 初始化顶点
	def __init__(self, key):
		self.id = key 							#初始化顶点的键
		self.connectedTo = {}					#初始化顶点的值

	# 添加邻居顶点,参数nbr是邻居顶点的键,默认权重为0	
	def addNeighbor(self, nbr, weight=0):
		self.connectedTo[nbr] = weight

	def __str__(self):
		return str(self.id) + ' connectedTo: ' + str([x.id for x in self.connectedTo])

	# 获取该顶点所有邻居顶点的键
	def getConnections(self):
		return self.connectedTo.keys()

	# 获取顶点的键
	def getId(self):
		return self.id

	# 获取到某邻居顶点的权重
	def getWeight(self, nbr):
		return self.connectedTo[nbr]

# 自定义图类
class Graph(object):
	# 初始化图
	def __init__(self):
		self.vertList = {}						#初始化邻接表
		self.numVertices = 0 					#初始化顶点数

	# 添加顶点
	def addVertex(self, key):
		newVertex = Vertex(key)					#创建顶点
		self.vertList[key] = newVertex 			#将新顶点添加到邻接表中
		self.numVertices = self.numVertices + 1 #邻接表中顶点数+1
		return newVertex

	# 获取顶点
	def getVertex(self, n):
		if n in self.vertList:					#若待查询顶点在邻接表中,则
			return self.vertList[n] 			#返回该顶点
		else:
			return None

	# 使之可用in方法
	def __contains__(self, n):
		return n in self.vertList

	# 添加边,参数f为起始顶点的键,t为目标顶点的键,cost为权重
	def addEdge(self, f, t, cost=0):
		if f not in self.vertList:				#起始顶点不在邻接表中,则
			self.addVertex(f) 					#添加起始顶点
		if t not in self.vertList:				#目标顶点不在邻接表中,则
			self.addVertex(t)					#添加目标顶点
		self.vertList[f].addNeighbor(self.vertList[t], cost)#在邻接表中添加起始点的目标点及权重

	# 获取邻接表中所有顶点的键
	def getVertices(self):
		return self.vertList.keys()

	# 迭代显示邻接表的每个顶点的邻居节点
	def __iter__(self):
		return iter(self.vertList.values())


g = Graph() 									#实例化图类
for i in range(6): 
	g.addVertex(i) 								#给邻接表添加节点
print(g.vertList)								#打印邻接表
g.addEdge(0, 1, 5) 								#给邻接表添加边及权重
g.addEdge(0, 5, 2) 
g.addEdge(1, 2, 4) 
g.addEdge(2, 3, 9) 
g.addEdge(3, 4, 7) 
g.addEdge(3, 5, 3) 
g.addEdge(4, 0, 1) 
g.addEdge(5, 4, 8) 
g.addEdge(5, 2, 1) 
for v in g: 									#循环每个顶点
	for w in v.getConnections(): 				#循环每个顶点的所有邻居节点
		print("(%s, %s)" % (v.getId(), w.getId())) #打印顶点和其邻居节点的键

结果为:

{0: <__main__.Vertex object at 0x00000000021BF828>, 1: <__main__.Vertex object at 0x00000000021BF860>, 2: <__main__.Vertex object at 0x00000000021BF898>, 3: <__main__.Vertex object at 0x00000000021BF8D0>, 4: <__main__.Vertex object at 0x00000000021BF908>, 5: <__main__.Vertex object at 0x00000000021BF940>}
(0, 1)
(0, 5)
(1, 2)
(2, 3)
(3, 4)
(3, 5)
(4, 0)
(5, 4)
(5, 2)

python图的邻接表表示

我就废话不多说了,上代码

"""图的邻接表表示"""
 
class GraphNode(object):
    """节点类"""
    def __init__(self,_elem=None):
        self._elem = _elem # 数据域
        self._next = None # 指针域
 
 
class Graph(object):
    """图类"""
    def __init__(self):
        """初始化一个序列"""
        self._graph = []
 
    def createPeak(self,newNode):
        """创建一个图顶点"""
        self._graph.append(newNode)
        return self._graph
 
    def createSide(self):
        """创建图的边"""
        for node in self._graph:
            graphNode = node
            print(f"请输入{graphNode._elem}的邻接点,以-1结束")
            while True:
                _graphNode = GraphNode() # 初始化每个节点的邻接点
                end = input("请输入: ")
                if end == '-1':
                    self.printGraph()
                    break
                else:
                    """临时列表图中的节点值,用来后续判断"""
                    temp = []
                    for item in self._graph:
                        temp.append(item._elem)
                    if end not in temp:
                        """输入的邻接节点不在顶点中"""
                        print("输入的节点不属于图中的顶点,重新输入")
                        continue
                    elif end == graphNode._elem:
                        """输入的顶点就是当前顶点"""
                        print("输入的是当前节点,重新输入")
                        continue
                    else:
                        # 新建节点
                        _graphNode._elem = end
                        # 指针向后移
                        _graphNode._next = graphNode._next
                        graphNode._next = _graphNode
                        graphNode = graphNode._next
 
    def printGraph(self):
        """遍历当前节点列表"""
        for node in self._graph:
            print(f"顶点{node._elem}的邻接链表: ",end='')
            while node != None:
                if node._next != None:
                    print(f'{node._elem}-->',end='')
                else:
                    print(f'{node._elem}', end='')
                node = node._next
            print() # 换节点,换行
 
 
if __name__ == '__main__':
    count = int(input('请输入顶点个数: '))
    s = Graph()
    # 创建节点
    peakNodeStr = input('请输入顶点: ')
    peakNodes = peakNodeStr.split(' ')
    # 将输入的节点实例化之后添加到图的链表中
    for peakNode in peakNodes:
        peak = GraphNode(peakNode)
        s.createPeak(peak)
 
    print('图中的节点:',end='')
    for peak in s._graph:
        print(peak._elem,end=' ')
    print()
 
    # 创建边
    s.createSide()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Python如何自定义邻接表图类

本文链接: https://www.lsjlt.com/news/175117.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python如何自定义邻接表图类
    目录Python自定义邻接表图类图抽象数据类型(ADT)的术语邻接矩阵和邻接表的优缺点自定义顶点类python图的邻接表表示总结Python自定义邻接表图类 图抽象数据类型(ADT)...
    99+
    2022-12-16
    Python邻接表图类 自定义邻接表图类 Python邻接表
  • Python怎么自定义邻接表图类
    这篇文章主要介绍“Python怎么自定义邻接表图类”,在日常操作中,相信很多人在Python怎么自定义邻接表图类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么自定义邻接表图类”的疑惑有所帮助!...
    99+
    2023-07-04
  • Python如何自定义元类
    这篇文章主要介绍了Python如何自定义元类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、说明一个类没有声明自己的元类,默认他的元类就是type,除了使用元类type,用...
    99+
    2023-06-14
  • python如何定义类
    这篇文章将为大家详细讲解有关python如何定义类,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。普通方法创建普通的方法的方式有两种(class A() & cla...
    99+
    2024-04-02
  • Python导入自定义类
    现有自定义类(Color.py)如下,类位于路径’/Users/chuxing/python/test’下: class Color(object): def __init__(self, red, green, blu...
    99+
    2023-01-31
    自定义 Python
  • Win10如何自定义图标
    本篇内容主要讲解“Win10如何自定义图标”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Win10如何自定义图标”吧!win10自定义图标教程:右键单击选择想要更改的文件夹,点击打开“属性”。打...
    99+
    2023-06-27
  • python中如何使用自定义异常类
    本篇文章为大家展示了python中如何使用自定义异常类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。自定义异常类自定义类继承系统的异常基类exception自定义异常类的构造函数等方法进行处理举例:...
    99+
    2023-06-20
  • PHP如何自定义异常类
    小编给大家分享一下PHP如何自定义异常类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  class MyE...
    99+
    2024-04-02
  • 如何自定义 PHP 异常类?
    如何自定义 php 异常类?扩展内置 exception 类,创建自定义异常类。在构造函数中传递消息、错误码和前一个异常(可选)。创建针对特定情况的自定义异常,提供更详细的错误消息。 ...
    99+
    2024-05-09
    php 自定义异常类
  • C#如何自定义泛型类
    这篇文章主要为大家展示了“C#如何自定义泛型类”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#如何自定义泛型类”这篇文章吧。Generic是Framework 2.0的新元素,中文名字称之为“...
    99+
    2023-06-18
  • Python 自定义类的排序
    Python 里面自定义类的时候, 一般需要重写几个方法, __init__ 一般是构造函数 这里面有一个__cmp__() 是比较函数, 重写它的时候,一定要记得返回值有三个,0,±1  !! 而不是返回0,1   这里没有注意,导致在...
    99+
    2023-01-31
    自定义 Python
  • python如何定义类方法
    这篇文章将为大家详细讲解有关python如何定义类方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。类方法@classmethod不需要self来表示自身了,而是用了cl...
    99+
    2024-04-02
  • Java编程如何实现邻接矩阵表示稠密图
    这篇文章主要介绍了Java编程如何实现邻接矩阵表示稠密图,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之...
    99+
    2023-05-30
    java
  • vue使用highcharts自定义仪表盘图表
    使用highchart图表框架实现一个自定义的类似下图的图表,供大家参考,具体内容如下 1. 原理 实际上就是4个饼图叠起来(可以这么理解),中间一个完整的圆和三个大小不一的圆圈 ...
    99+
    2024-04-02
  • Python如何自定义函数
    小编给大家分享一下Python如何自定义函数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!自定义函数import requestsfrom b...
    99+
    2023-06-27
  • VB如何自定义类型参数
    这篇文章主要介绍“VB如何自定义类型参数”,在日常操作中,相信很多人在VB如何自定义类型参数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”VB如何自定义类型参数”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-17
  • Torch如何自定义一个Dataset类
    要自定义一个Dataset类,可以继承自torch.utils.data.Dataset,并实现其中的__len__和__getit...
    99+
    2024-04-02
  • TypeScript如何自定义数据类型
    这篇文章主要介绍“TypeScript如何自定义数据类型”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“TypeScript如何自定义数据类型”文章能帮助大家解决问题。TypeScript 类型系统和...
    99+
    2023-07-04
  • Springboot中如何自定义Banner图案
    这篇文章给大家介绍Springboot中如何自定义Banner图案,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、前言我们在启动 Spring Boot 项目时,默认会在控制台打印 Spring logo 和版本等信...
    99+
    2023-06-15
  • Python 定义自己的常量类
    在实际的程序开发中,我们通常会将一个不可变的变量声明为一个常量。在很多高级语言中都会提供常量的关键字来定义常量,如 C++ 中的 const , Java 中的 final 等,但是 Python 语言因为变量无类型,所以也就不存在这样的...
    99+
    2023-01-31
    自己的 常量 定义
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作