python数据结构之图的实现方法

以下是关于“Python数据结构之图的实现方法”的完整攻略:

简介

图是一种常用的数据结构,用于表示对象之间的关系。在本教程中,我们将介绍如何使用Python实现图,包括邻接矩阵和邻接表两种实现方法。

邻接矩阵

邻接矩阵是一种常用的图的实现方法,它使用二维数组表示图中的节点和边。在邻接矩阵中,每个节点都对应数组中的一行和一列,如果两个节点之间有边相连,则在对应的数组元素中存储1,否则存储0。

以下是使用Python实现邻接矩阵的示例代码:

class Graph:
    def __init__(self, vertices):
        self.vertices = vertices
        self.matrix = [[0] * vertices for i in range(vertices)]

    def add_edge(self, u, v):
        self.matrix[u][v] = 1
        self.matrix[v][u] = 1

    def remove_edge(self, u, v):
        self.matrix[u][v] = 0
        self.matrix[v][u] = 0

    def print_graph(self):
        for i in range(self.vertices):
            for j in range(self.vertices):
                print(self.matrix[i][j], end=' ')
            print()

g = Graph(5)
g.add_edge(0, 1)
g.add_edge(0, 4)
g.add_edge(1, 2)
g.add_edge(1, 3)
g.add_edge(1, 4)
g.add_edge(2, 3)
g.add_edge(3, 4)

g.print_graph()

在这个示例中,我们使用二维数组实现了邻接矩阵。我们定义了Graph类作为图的实现,使用matrix数组存储图的节点和边,使用add_edge函数添加边,使用remove_edge函数删除边,使用print_graph函数打印图的邻接矩阵。

邻接表

邻接表是一种常用的图的实现方法,它使用链表表示图中的节点和边。在邻接表中,每个节点都对应一个链表,链表中存储与该节点相连的所有节点。

以下是使用Python实现邻接表的示例代码:

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

class Graph:
    def __init__(self, vertices):
        self.vertices = vertices
        self.adj_list = [None] * vertices

    def add_edge(self, u, v):
        node = Node(v)
        node.next = self.adj_list[u]
        self.adj_list[u] = node

        node = Node(u)
        node.next = self.adj_list[v]
        self.adj_list[v] = node

    def remove_edge(self, u, v):
        node = self.adj_list[u]
        if node.value == v:
            self.adj_list[u] = node.next
        else:
            while node.next:
                if node.next.value == v:
                    node.next = node.next.next
                    break
                node = node.next

        node = self.adj_list[v]
        if node.value == u:
            self.adj_list[v] = node.next
        else:
            while node.next:
                if node.next.value == u:
                    node.next = node.next.next
                    break
                node = node.next

    def print_graph(self):
        for i in range(self.vertices):
            print(i, end=' ')
            node = self.adj_list[i]
            while node:
                print('->', node.value, end=' ')
                node = node.next
            print()

g = Graph(5)
g.add_edge(0, 1)
g.add_edge(0, 4)
g.add_edge(1, 2)
g.add_edge(1, 3)
g.add_edge(1, 4)
g.add_edge(2, 3)
g.add_edge(3, 4)

g.print_graph()

在这个示例中,我们使用链表实现了邻接表。我们定义了Node类作为链表节点,定义了Graph类作为图的实现,使用adj_list数组存储图的节点和边,使用add_edge函数添加边,使用remove_edge函数删除边,使用print_graph函数打印图的邻接表。

示例说明

以下是两个示例说明,展示了如何使用Python实现图。

示例1

假设我们要使用Python实现图,可以使用示例代码:

class Graph:
    def __init__(self, vertices):
        self.vertices = vertices
        self.matrix = [[0] * vertices for i in range(vertices)]

    def add_edge(self, u, v):
        self.matrix[u][v] = 1
        self.matrix[v][u] = 1

    def remove_edge(self, u, v):
        self.matrix[u][v] = 0
        self.matrix[v][u] = 0

    def print_graph(self):
        for i in range(self.vertices):
            for j in range(self.vertices):
                print(self.matrix[i][j], end=' ')
            print()

g = Graph(5)
g.add_edge(0, 1)
g.add_edge(0, 4)
g.add_edge(1, 2)
g.add_edge(1, 3)
g.add_edge(1, 4)
g.add_edge(2, 3)
g.add_edge(3, 4)

g.print_graph()

可以看到,我们成功使用Python实现了图,并使用示例测试了函数的功能。

示例2

假设我们要使用Python实现图,可以使用示例代码:

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

class Graph:
    def __init__(self, vertices):
        self.vertices = vertices
        self.adj_list = [None] * vertices

    def add_edge(self, u, v):
        node = Node(v)
        node.next = self.adj_list[u]
        self.adj_list[u] = node

        node = Node(u)
        node.next = self.adj_list[v]
        self.adj_list[v] = node

    def remove_edge(self, u, v):
        node = self.adj_list[u]
        if node.value == v:
            self.adj_list[u] = node.next
        else:
            while node.next:
                if node.next.value == v:
                    node.next = node.next.next
                    break
                node = node.next

        node = self.adj_list[v]
        if node.value == u:
            self.adj_list[v] = node.next
        else:
            while node.next:
                if node.next.value == u:
                    node.next = node.next.next
                    break
                node = node.next

    def print_graph(self):
        for i in range(self.vertices):
            print(i, end=' ')
            node = self.adj_list[i]
            while node:
                print('->', node.value, end=' ')
                node = node.next
            print()

g = Graph(5)
g.add_edge(0, 1)
g.add_edge(0, 4)
g.add_edge(1, 2)
g.add_edge(1, 3)
g.add_edge(1, 4)
g.add_edge(2, 3)
g.add_edge(3, 4)

g.print_graph()

可以看到,我们成功使用Python实现了图,并使用示例测试了函数的功能。

本教程介绍了如何使用Python实现图,包括邻接矩阵和邻接表两种实现方法。我们使用二维数组实现了邻接矩阵,使用链表实现了邻接表。我们还提供了两个示例,展示了如何使用Python实现图。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python数据结构之图的实现方法 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python IDE PyCharm的基本快捷键和配置简介

    下面是针对“Python IDE PyCharm的基本快捷键和配置简介”的完整攻略: PyCharm快捷键 常用快捷键 以下是一些常用的PyCharm快捷键: Ctrl + D 复制当前行或所选内容 Ctrl + X 剪切当前行或所选内容 Ctrl + C 复制当前行或所选内容 Ctrl + V 粘贴最后一次复制的内容 Ctrl + Z 回退 Ctrl + …

    python 2023年5月20日
    00
  • Python计算信息熵实例

    Python计算信息熵实例 什么是信息熵? 信息熵是一个衡量信息传递的无序程度的指标,通常用来描述一个系统的不确定性。 对于离散型随机变量 $X$,其信息熵定义为: $$H(X) = -\sum_{i=1}^{n} p_i \log_2 p_i$$ 其中,$n$ 表示 $X$ 可能取值的个数,$p_i$ 表示 $X$ 取第 $i$ 个值的概率。 如何用Pyt…

    python 2023年6月3日
    00
  • python删除文件、清空目录的实现方法

    下面是Python删除文件、清空目录的实现方法的详细攻略。 删除文件 Python中删除文件可以使用os模块中的os.remove()函数。它接收文件路径作为参数,删除该路径下的文件。 示例: import os file_path = ‘./test.txt’ os.remove(file_path) # 删除文件 需要注意的是,当被删除的文件不存在时,o…

    python 2023年6月2日
    00
  • Python中函数的创建与调用你了解吗

    当创建一个函数时,你需要使用 Python的def语句来定义函数,在函数名后面跟有圆括号,然后跟有一个冒号,再在下一行写出执行了什么样的任务的代码块。 下面是一个简单的示例函数: def greet(name): print("Hello, " + name) 这个函数在被调用时,接受一个参数,输出问候语 “Hello ” 和这个参数的值…

    python 2023年5月30日
    00
  • Python利用jmespath模块进行json数据处理

    我来讲解利用jmespath模块进行json数据处理的完整攻略。 什么是jmespath模块 jmespath是一种用于查询和转换JSON数据的语言,它是日本的 James Spath 在2012年创建的。JMesPath模块提供了一种简单的读取 JSON 数据的方式,它允许您使用 Python 程序查询 JSON 对象并提取所需的数据。JMesPath支持…

    python 2023年6月3日
    00
  • Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)

    Python中的数组和列表都是非常常见的数据结构,在实际的开发中也经常用到。而冒号则是Python中许多数据结构中的核心语法之一,可以实现许多方便的功能。下面就来详细讲解一下“Python中数组、列表:冒号的灵活用法介绍”。 数组和列表基础知识 在Python中,数组和列表都是用来存储一组数据的数据结构,但是它们之间有一些区别。 数组通常用于存储数值型数据,…

    python 2023年6月5日
    00
  • Python pandas.replace的用法详解

    在Python中,pandas是一个强大的数据分析库,提供了许多数据处理和转换的函数。其中,pandas.replace()函数用于替换DataFrame或Series中的值。本文将详细介绍pandas.replace()函数的用法,包括函数参数、返回值、示例说明等。 函数参数 pandas.replace()函数的语法如下: DataFrame.repla…

    python 2023年5月14日
    00
  • Python爬虫过程解析之多线程获取小米应用商店数据

    本文将详细讲解如何使用Python多线程爬虫获取小米应用商店数据的完整攻略。我们将使用Python的requests、BeautifulSoup、pandas和threading等库来实现这个任务。 爬取数据 首先,我们需要从小米应用商店上爬取数据。我们可以使用Python的requests和BeautifulSoup库来实现这个任务。以下是一个简单的Pyt…

    python 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部