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

news2024/9/20 19:31:10

引言

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

基础语法介绍

树的基本概念

  • 节点(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)、图的存储方式(邻接矩阵、邻接表)、图论中的经典问题(最短路径、最小生成树)等。这些知识不仅对于深入理解数据结构本身至关重要,而且也是提升编程技能不可或缺的一部分。

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

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

相关文章

文件防泄密软件哪个好?6款被夸爆的文件防泄密软件推荐!

滴水不漏&#xff0c;方显器量&#xff1b;信息无泄&#xff0c;乃见安防。 文件防泄密软件作为保护企业数据安全的重要工具&#xff0c;受到了越来越多企业的关注。 本文将为您推荐六款备受好评的文件防泄密软件&#xff0c;它们各具特色&#xff0c;功能强大&#xff0c;能…

C语言 结构体和共用体——枚举类型

目录 枚举数据类型 三问枚举数据类型 枚举数据类型 三问枚举数据类型

Ubuntu与Windows之间实现复制粘贴

1.卸载已有的工具 sudo apt-get autoremove open-vm-tools 2.安装工具open-vm-tools sudo apt-get install open-vm-tools 3.安装open-vm-tools-desktop sudo apt-get install open-vm-tools-desktop

Virtuoso服务在centos中自动停止的原因分析及解决方案

目录 前言1. 问题背景2. 原因分析2.1 终端关闭导致信号12.2 nohup命令的局限性 3. 解决方案3.1 使用 screen 命令保持会话3.2 使用 tmux 作为替代方案3.3 使用系统服务&#xff08;systemd&#xff09; 4. 其他注意事项4.1 网络配置4.2 日志监控 结语 前言 在使用Virtuoso作为…

Jenkins怎么设置每日自动执行构建任务?

在 Jenkins 中设置每日自动执行构建任务可以按照以下步骤进行&#xff1a; 一、安装必要插件 确保安装了 “Timestamper” 插件&#xff0c;这个插件可以为构建添加时间戳&#xff0c;方便查看构建的执行时间。 二、配置任务 打开需要设置每日自动执行的 Jenkins 任务。在 …

《线性代数》常用公式定理总结

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…

C++ | 二叉搜索树

前言 本篇博客讲解c中的继承 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&…

【大模型】初识大模型(非常详细)零基础入门到精通,收藏这一篇就够了_大模型入门

大模型的定义 大模型是指具有数千万甚至数亿参数的深度学习模型。近年来&#xff0c;随着计算机技术和大数据的快速发展&#xff0c;深度学习在各个领域取得了显著的成果&#xff0c;如自然语言处理&#xff0c;图片生成&#xff0c;工业数字化等。为了提高模型的性能&#xf…

MeterSphere的一次越权审计

1 MeterSphere简介 MeterSphere是一个一站式开源持续测试平台&#xff0c;它提供了测试跟踪、接口测试、UI测试和性能测试等功能。它全面兼容JMeter、Selenium等主流开源标准&#xff0c;助力开发和测试团队实现自动化测试&#xff0c;加速软件的高质量交付。MeterSphere 的特点…

Java 微服务框架 HP-SOA v1.1.4

HP-SOA 功能完备&#xff0c;简单易用&#xff0c;高度可扩展的Java微服务框架。 项目主页 : https://www.oschina.net/p/hp-soa下载地址 : https://github.com/ldcsaa/hp-soa开发文档 : https://gitee.com/ldcsaa/hp-soa/blob/master/README.mdQQ Group: 44636872, 66390394…

解决selenium爬虫被浏览器检测问题

文章目录 专栏导读1.问题解析2.代码解析(Edge/Chrome通用)2.1 设置Edge浏览器选项:2.2 尝试启用后台模式2.3 排除启用自动化模式的标志2.4 禁用自动化扩展2.5 设置用户代理2.6 实例化浏览器驱动对象并应用配置2.7 在页面加载时执行JavaScript代码 3.完整代码&#xff08;可直接…

[ IDE ] SEGGER Embedded Studio for RISC-V

一、FILE 二、Edit 三、View 四、Search 五、Navigate 六、Project 七、Build 7.1 编译 先选择一个目标类型&#xff0c;再选择编译。 八、Debug 九、Target 十、Tools 10.1 自定义快捷键 点击菜单项&#xff0c;通过Tools –> Options –> Keyboard&#xff0c;实现自…

初识Linux · 环境变量

目录 前言&#xff1a; 命令行参数 环境变量 直接看现象 更多的环境变量 尝试理解环境变量 前言&#xff1a; 今天介绍的是一个较为陌生的名词&#xff0c;环境变量&#xff0c;在学习环境变量之前&#xff0c;我们需要一定的预备知识&#xff0c;这个预备知识是命令行参…

HarmonyOS学习(十三)——数据管理(二) 关系型数据库

文章目录 1、基本概念2、运行机制3、默认配置与限制4、接口说明5、实战&#xff1a;开发“账本”5.1、创建RdbStore5.2、创建数据库5.3、增加数据5.4、删除数据5.5、修改数据5.6、查询数据5.7、备份数据库5.8、恢复数据库5.9、删除数据库 官方文档地址&#xff1a; 通过关系型…

堆的向下调整算法和TOPK问题

目录 1.什么是堆&#xff1f; 1.1 向下调整建堆的时间复杂度计算 1.2 堆的结构体设计 2.堆的功能实现&#xff1a; 2.1 堆的插入&#xff1a; 2.2 堆的删除&#xff1a; 2.3 堆排序&#xff1a; 2.4 向下调整建堆&#xff1a; 2.5 TOPK问题&#xff1a; 2.6 向上调整算…

对接金蝶云星空调用即时库存信息查询API(附JAVA实现)

文章目录 前言准备工作获取第三方授权权限与授权配置信息集成金蝶云SDK调用实现备注前言 对于有自己商品信息管理后台并且使用金蝶ERP系统管理物料的商家来说,将金蝶上物料的库存信息同步到管理后台就可以不用去金蝶上确认库存了,可以大大简化管理后台的库存变更工作,这篇文…

Call OpenAI API with Python requests is missing a model parameter

题意&#xff1a;使用 Python requests 调用 OpenAI API 时缺少 model 参数。 问题背景&#xff1a; Im trying to call OpenAI API from Python. I know they have their own openai package, but I want to use a generic solution. I chose the requests package for its f…

通义千问重磅开源Qwen2.5,性能超越Llama

Qwen2.5 新闻 9月19日云栖大会&#xff0c;阿里云CTO周靖人发布通义千问新一代开源模型Qwen2.5&#xff0c;旗舰模型Qwen2.5-72B性能超越Llama 405B&#xff0c;再登全球开源大模型王座。Qwen2.5全系列涵盖多个尺寸的大语言模型、多模态模型、数学模型和代码模型&#xff0c;每…

TransUNet: 通过Transformer的视角重新思考U-Net架构在医学图像分割中的设计|文献速递-Transformer架构在医学影像分析中的应用

Title 题目 TransUNet: Rethinking the U-Net architecture design for medical imagesegmentation through the lens of transformers TransUNet: 通过Transformer的视角重新思考U-Net架构在医学图像分割中的设计 01 文献速递介绍 卷积神经网络&#xff08;CNNs&#xff…

计算机毕业设计之:教学平台微信小程序(

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…