首页 > 编程语言 >Python中的树与图:构建复杂数据结构的艺术

Python中的树与图:构建复杂数据结构的艺术

时间:2024-09-20 12:53:08浏览次数:10  
标签:Python self vertex current add 构建 数据结构 root 节点

引言

随着大数据时代的到来,我们面临的数据不再是简单的线性关系,而是错综复杂的网状结构。树和图正是用于表示这类复杂关系的最佳工具。树是一种特殊的图,它具有层次结构;而图则更加灵活,能够表达任意节点之间的连接关系。掌握树与图的实现方法,不仅有助于提高算法设计能力,还能为解决现实世界的问题提供新的视角。

基础语法介绍

树的基本概念

  • 节点(Node):树中的每个元素被称为节点,它可能包含一些值以及指向其他节点的引用。
  • 根节点(Root Node):没有父节点的唯一节点。
  • 叶子节点(Leaf Node):没有子节点的节点。
  • 父节点(Parent Node):直接拥有一个或多个子节点的节点。
  • 子节点(Child Node):直接隶属于一个父节点的节点。
  • 兄弟节点(Sibling Node):拥有同一个父节点的节点。

图的基本概念

  • 顶点(Vertex):图中的基本单位,相当于树中的节点。
  • 边(Edge):连接两个顶点的线段,代表了顶点之间的关系。
  • 有向图(Directed Graph):每条边都有方向性的图。
  • 无向图(Undirected Graph)):所有边都没有方向性的图。
  • 权重(Weight):可以为边赋予一定的数值,用来表示顶点间关系的强度或成本等信息。

基础实例

让我们先从一个简单的二叉树开始。二叉树是一种特殊的树,每个节点最多有两个子节点。

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

# 创建树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

def inorder_traversal(root):
    if root:
        inorder_traversal(root.left)
        print(root.val, end=' ')
        inorder_traversal(root.right)

inorder_traversal(root)  # 输出: 4 2 5 1 3

接下来,我们来看看如何实现一个简单的无向图:

class Graph:
    def __init__(self):
        self.vertices = {}

    def add_vertex(self, vertex_id):
        if vertex_id not in self.vertices:
            self.vertices[vertex_id] = set()

    def add_edge(self, v1, v2):
        if v1 in self.vertices and v2 in self.vertices:
            self.vertices[v1].add(v2)
            self.vertices[v2].add(v1)

# 创建图
g = Graph()
g.add_vertex('A')
g.add_vertex('B')
g.add_edge('A', 'B')

print(g.vertices)  # 输出: {'A': {'B'}, 'B': {'A'}}

进阶实例

在更复杂的场景下,我们可能需要处理带有权重的边或具有循环结构的图。下面是一个加权图的例子:

import heapq

class WeightedGraph:
    def __init__(self):
        self.adjacency_list = {}

    def add_vertex(self, vertex):
        self.adjacency_list[vertex] = []

    def add_edge(self, v1, v2, weight):
        self.adjacency_list[v1].append((v2, weight))
        self.adjacency_list[v2].append((v1, weight))

    def dijkstra(self, start):
        distances = {vertex: float('inf') for vertex in self.adjacency_list}
        distances[start] = 0
        pq = [(0, start)]
        while len(pq) > 0:
            current_distance, current_vertex = heapq.heappop(pq)

            if current_distance > distances[current_vertex]:
                continue

            for neighbor, weight in self.adjacency_list[current_vertex]:
                distance = current_distance + weight

                if distance < distances[neighbor]:
                    distances[neighbor] = distance
                    heapq.heappush(pq, (distance, neighbor))

        return distances

wg = WeightedGraph()
wg.add_vertex('A')
wg.add_vertex('B')
wg.add_edge('A', 'B', 5)

print(wg.dijkstra('A'))  # 输出: {'A': 0, 'B': 5}

实战案例

在实际工作中,树和图的应用远比上述例子更为广泛。例如,在搜索引擎中,文档可以看作节点,而链接则是节点间的边。通过构建这样的图模型,我们可以快速找到相关性最高的页面。另一个典型的例子是在社交网络中,用户作为顶点,他们之间的互动关系则构成了复杂的图结构。利用这些信息,我们可以进行好友推荐或者发现潜在的兴趣群体。

假设我们需要在一个社交网络应用中实现好友推荐功能。这里,我们将使用基于图的算法来找出用户之间可能存在的联系。

def recommend_friends(graph, user):
    visited = set()
    queue = [user]
    recommendations = []

    while queue:
        current_user = queue.pop(0)
        if current_user not in visited:
            visited.add(current_user)
            for friend in graph[current_user]:
                if friend not in visited:
                    recommendations.append(friend)
                    queue.append(friend)

    return recommendations[:10]  # 返回前10个推荐好友

social_graph = {
    'Alice': ['Bob', 'Charlie'],
    'Bob': ['Alice', 'David'],
    'Charlie': ['Alice', 'Eve'],
    'David': ['Bob'],
    'Eve': ['Charlie']
}

print(recommend_friends(social_graph, 'Alice'))  # 输出: ['Bob', 'Charlie', 'David', 'Eve']

扩展讨论

除了上述提到的内容外,还有许多值得探讨的话题,比如树和图的遍历算法(如DFS、BFS)、图的存储方式(邻接矩阵、邻接表)、图论中的经典问题(最短路径、最小生成树)等。这些知识不仅对于深入理解数据结构本身至关重要,而且也是提升编程技能不可或缺的一部分。

标签:Python,self,vertex,current,add,构建,数据结构,root,节点
From: https://blog.csdn.net/qq_44771627/article/details/142381907

相关文章

  • 唤醒数据中心:构建社交行业的数据飞轮
    在社交行业中,数据不仅是企业竞争的核心资源,它更是驱动创新和个性化服务的主要力量。数据中台虽然汇集了企业的数据资产,但在多数情况下,这些数据资产还是处于未充分利用的状态。利用数据飞轮的概念,我们可以有效地将这些沉睡的数据资产唤醒,并且转化为企业的竞争优势。数据飞轮理论的......
  • Python中的魔法:栈与队列的奇妙之旅
    引言在软件开发过程中,我们常常需要处理大量的数据,并以特定的方式组织这些数据以便于后续的操作。例如,在浏览器的历史记录管理、函数调用的过程控制、打印机的任务调度等场景下,栈与队列便大显身手。栈遵循后进先出(LIFO,LastInFirstOut)原则,而队列则是先进先出(FIFO,First......
  • Python学习:range、xrange和arange的区别
    range生成左闭右开区间的整数。例子见下:np.arange生成左闭右开区间内的小数。例子见下:range和xrange有版本区别(这部分转载):Python3range()函数返回的是一个可迭代对象(类型是对象),而不是列表类型,所以打印的时候不会打印列表。Python3list()函数是对象迭代器,可以把ra......
  • 计算机毕业设计推荐-基于python+Django的学生签到考勤管理系统【源码+文档+讲解】
    精彩专栏推荐订阅:在下方主页......
  • Python面向对象编程
    Python-面向对象:类、对象、属性、方法面向对象概念面向对象编程(Object-orientedProgramming,简称OOP),是一种封装代码的方法面向对象:将模拟真实世界里的事物(对象)和描述其特征(属性)的数据和函数代码块(方法)封装到一起(类)类:可以理解是一个模板,通过它可以创建出无数个具体实例对象:类并......
  • 基于Java中的SSM框架实现数据结构课堂考勤管理平台项目【项目源码+论文说明】
    基于java中的SSM框架实现数据结构课堂考勤管理平台演示【内附项目源码+LW说明】摘要高校的不断扩张让在校学生数量不断的增加,对于教师和管理人员的需求也在不断地增强,对日常的学生考勤管理的工作量也在日益增加,传统的人工点名签到的考勤管理模式已经给无法适用于当前高校......
  • python 比较两个或多个时间,获取最大的时间(最近的时间)
    自定义的公共函数importdate_timedefstr2datetime(date_time,form="%Y-%m-%d%H:%M:%S"):_datetime=datetime.datetime.strptime(date_time,form)ifisinstance(date_time,str)elsedate_timereturn_datetimedefdatetime2str(date_time,form=&q......
  • Python开发深度学习常见安装包 error 解决
    PythonPython是一种广泛使用的高级编程语言,它以其清晰的语法和代码可读性而闻名。Python支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。由于其简洁性和强大的标准库,Python成为了数据科学、机器学习、网络开发、自动化脚本、科学计算和教育等领域的首选语......
  • Python编程 - 协程
    前言上篇文章主要讲述了python的进程,进程池和进程与线程对比等知识,接下来这篇文章再唠唠python的协程,让我们继续往下看!一、协程的使用python中的协程是一种用于处理并发任务的高效工具,它依赖于asyncio库以及async和await关键字来实现异步编程。协程与传统的多线程或......
  • python, Pycharm开发环境配置!
    1.windows官网下载地址windowspythonDownloadwindowpycharmDownload专业版30天试用,可以下载社区版2.先下载安装python64,32位都可,一般现在都是64位双击安装,勾选Addpython.exetoPATH中如果想自定义安装,点击Customizeinstallation自定义安装,......