全网最适合入门的面向对象编程教程:45 Python实现常见数据结构-链表、树、哈希表、图和堆

news2024/9/23 7:31:19

全网最适合入门的面向对象编程教程:45 Python 实现常见数据结构-链表、树、哈希表、图和堆

image

摘要:

数据结构是计算机科学中的一种组织和存储数据的方式,它决定了数据的访问方式和操作效率,数据结构的选择和实现对程序的性能和设计至关重要。本文主要讲述了如何使用 Python 语言和内置库实现常见数据结构。

原文链接:

FreakStudio的博客

往期推荐:

可能是全网最适合入门的面向对象编程教程:Python实现-嵌入式爱好者必看!

全网最适合入门的面向对象编程教程:00 面向对象设计方法导论

全网最适合入门的面向对象编程教程:01 面向对象编程的基本概念

全网最适合入门的面向对象编程教程:02 类和对象的Python实现-使用Python创建类

全网最适合入门的面向对象编程教程:03 类和对象的Python实现-为自定义类添加属性

全网最适合入门的面向对象编程教程:04 类和对象的 Python 实现-为自定义类添加方法

全网最适合入门的面向对象编程教程:05 类和对象的Python实现-PyCharm代码标签

全网最适合入门的面向对象编程教程:06 类和对象的 Python 实现-自定义类的数据封装

全网最适合入门的面向对象编程教程:07 类和对象的Python实现-类型注解

全网最适合入门的面向对象编程教程:08 类和对象的 Python 实现-@property 装饰器

全网最适合入门的面向对象编程教程:09 类和对象的Python实现-类之间的关系

全网最适合入门的面向对象编程教程:10 类和对象的Python实现-类的继承和里氏替换原则

全网最适合入门的面向对象编程教程:11 类和对象的Python实现-子类调用父类方法

全网最适合入门的面向对象编程教程:12 类和对象的 Python 实现-Python 使用 logging 模块输出程序运行日志

全网最适合入门的面向对象编程教程:13 类和对象的 Python 实现-可视化阅读代码神器 Sourcetrail 的安装使用

全网最适合入门的面向对象编程教程:14 类和对象的Python实现-类的静态方法和类方法

全网最适合入门的面向对象编程教程:15 类和对象的Python实现-__slots__魔法方法

全网最适合入门的面向对象编程教程:16 类和对象的Python实现-多态、方法重写与开闭原则

全网最适合入门的面向对象编程教程:17 类和对象的Python实现-鸭子类型与“file-like object“

全网最适合入门的面向对象编程教程:18 类和对象的Python实现-多重继承与PyQtGraph串口数据绘制曲线图

全网最适合入门的面向对象编程教程:19 类和对象的 Python 实现-使用 PyCharm 自动生成文件注释和函数注释

全网最适合入门的面向对象编程教程:20 类和对象的 Python 实现-组合关系的实现与 CSV 文件保存

全网最适合入门的面向对象编程教程:21 类和对象的 Python 实现-多文件的组织:模块 module 和包 package

全网最适合入门的面向对象编程教程:22 异常捕获-异常和语法错误

全网最适合入门的面向对象编程教程:23 异常捕获-抛出异常

全网最适合入门的面向对象编程教程:24 异常捕获现-异常的捕获与处理:try/except语句、文件读写示例、Exception引用

全网最适合入门的面向对象编程教程:25 异常捕获-Python 判断输入数据类型

全网最适合入门的面向对象编程教程:26 异常捕获-上下文管理器和with语句

全网最适合入门的面向对象编程教程:26 异常捕获-上下文管理器和with语句

全网最适合入门的面向对象编程教程:27 异常捕获-Python 中异常层级与自定义异常类的实现

全网最适合入门的面向对象编程教程:28 异常捕获-Python编程原则、哲学和规范大汇总

全网最适合入门的面向对象编程教程:29 异常捕获-断言与防御性编程和help函数的使用

全网最适合入门的面向对象编程教程:29 异常捕获-断言与防御性编程和help函数的使用

全网最适合入门的面向对象编程教程:30 Python的内置数据类型-object根类

全网最适合入门的面向对象编程教程:31 Python的内置数据类型-对象Object和类型Type

全网最适合入门的面向对象编程教程:32 Python的内置数据类型-类Class和实例Instance

全网最适合入门的面向对象编程教程:33 Python 的内置数据类型-对象 Object 和类型 Type 的关系

全网最适合入门的面向对象编程教程:33 Python 的内置数据类型-对象 Object 和类型 Type 的关系

全网最适合入门的面向对象编程教程:34 Python的内置数据类型-Python常用复合数据类型:元组和命名元组

全网最适合入门的面向对象编程教程:35 Python的内置数据类型-文档字符串和__doc__属性

全网最适合入门的面向对象编程教程:36 Python的内置数据类型-字典

全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式

全网最适合入门的面向对象编程教程:38 Python常用复合数据类型-使用列表实现堆栈、队列和双端队列

全网最适合入门的面向对象编程教程:39 Python 常用复合数据类型-集合

全网最适合入门的面向对象编程教程:40 Python 常用复合数据类型-枚举和 enum 模块的使用

全网最适合入门的面向对象编程教程:41 Python常用复合数据类型-队列(FIFO、LIFO、优先级队列、双端队列和环形队列)

全网最适合入门的面向对象编程教程:42 Python常用复合数据类型-collections容器数据类型

全网最适合入门的面向对象编程教程:43 Python常用复合数据类型-扩展内置数据类型

全网最适合入门的面向对象编程教程:44 Python内置函数与魔法方法-重写内置类型的魔法方法

更多精彩内容可看:

CM3调试系统简析

肝了半个月,嵌入式技术栈大汇总出炉

Avnet ZUBoard 1CG开发板上手—深度学习新选择

SenseCraft 部署模型到Grove Vision AI V2图像处理模块

比赛获奖的武林秘籍:09 一文速通计算机设计大赛,比赛人必看的获奖秘籍

比赛获奖的武林秘籍:08 一文速通光电设计大赛,电子人必看

比赛获奖的武林秘籍:07 一文速通电子设计大赛,电子人必看的获奖秘籍!

比赛获奖的武林秘籍:06 5 分钟速通比赛路演答辩,国奖选手的血泪经验!

比赛获奖的武林秘籍:05 电子计算机类比赛国奖队伍技术如何分工和学习内容

比赛获奖的武林秘籍:04 电子类比赛嵌入式开发快速必看的上手指南

比赛获奖的武林秘籍:03 好的创意选取-获得国奖的最必要前提

比赛获奖的武林秘籍:02 国奖秘籍-大学生电子计算机类竞赛快速上手的流程,小白必看

比赛获奖的武林秘籍:01 如何看待当代大学生竞赛中“卷”“祖传老项目”“找关系”的现象?

比赛获奖的武林秘籍:00 学科竞赛-工科类大学生绕不开的话题,你了解多少?

文档和代码获取:

可访问如下链接进行对文档下载:

https://github.com/leezisheng/Doc

image

本文档主要介绍如何使用 Python 进行面向对象编程,需要读者对 Python 语法和单片机开发具有基本了解。相比其他讲解 Python 面向对象编程的博客或书籍而言,本文档更加详细、侧重于嵌入式上位机应用,以上位机和下位机的常见串口数据收发、数据处理、动态图绘制等为应用实例,同时使用 Sourcetrail 代码软件对代码进行可视化阅读便于读者理解。

相关示例代码获取链接如下:https://github.com/leezisheng/Python-OOP-Demo

正文

数据结构基本知识

实际上,前文讲到的队列、列表、集合、字典等均属于数据结构的一部分。数据结构,作为一种代码结构,其核心目的在于有序地存储与组织数据,进而简化信息的修改、导航与访问过程。它不仅决定了数据的收集方式、实现的功能以及数据间的相互关系,更在计算机科学和编程的各个领域,如操作系统、前端开发以及机器学习等,发挥着不可或缺的作用。数据结构是解决问题的高效且真实的关键构件。每一种数据结构都有其独特的适用场景和任务。

数据结构可划分为逻辑结构与物理结构两大类:

  1. 逻辑结构:是指数据元素间逻辑关系的数据组织方式,这种关系侧重于元素间的相对位置,而与数据在计算机中的实际存储位置无关。

在逻辑结构的分类中,可以分为线性结构和非线性结构:

  1. 物理结构:又称存储结构,描述的是数据逻辑结构在计算机存储空间中的具体实现形式。数据的逻辑结构通常可以映射为多种物理结构。物理结构是实现数据元素间逻辑关系的具体手段。一种逻辑结构可以根据实际需求转化为多种物理结构。常见的物理结构有:
    • ① 顺序存储,其特点是元素在内存中的存储顺序是连续的,线性表的元素通过一组连续的存储单元来存储。
    • ② 链式存储,在这种方式中,内存中的存储元素不必连续,每个元素节点包含数据元素和指向相邻元素的指针信息。
    • ③ 索引存储,除了存储节点信息,还通过附加的索引表来标识节点的内存地址,索引表由多个索引项构成。
    • ④ 散列存储,又称 Hash 存储,其中节点的存储地址由节点的关键码值直接决定。

接下来,我们将简要介绍如何利用面向对象编程的思维和 Python 内置数据类型去实现其他的数据结构,注意该部分并非本书重点内容,所以这里只是浅显的讲一下数据结构,其中实现代码主要是帮助读者理解而非实际应用。

Python 实现链表

链表是一种物理存储单元上非连续、非顺序的存储结构,是由许多相同数据类型的数据项按照特定顺序排列而成的线性表。链表有一系列节点组成,所谓节点就是指链表中的每一个元素,每个节点包含两个数据,一个是存储元素的数据域(值),另一个是存储下一个节点地址的指针域。

image

链表中的第一个节点称为头节点,最后一个节点称为尾节点,其中尾节点的 next 指向为 null。链表可以是单链,也可以是双链,这取决于每个节点是只有一个指向下一个节点的指针,还是还有一个指向前一个节点的指针。你可以把链表想象成一条链;单个链接只与相邻的链接有一个连接,但所有链接一起形成一个更大的结构。

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None
class SLinkedList:
    def __init__(self):
        self.headval = None
list1 = SLinkedList()
list1.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")
_# Link first Node to second node_
list1.headval.nextval = e2
_# Link second Node to third node_
e2.nextval = e3

链表具有以下优势:新元素插入和删除更高效、比数组更易于重组、高级数据结构 (如图形或树)都是基于链表的,缺点是:每个数据点的指针存储增加了内存使用量同时必须始终从头节点遍历链表以查找特定元素。

Python 实现树

树是另一种基于关系的数据结构,专门用于表示层次结构。与链表一样,它们也被 Node 对象填充,Node 对象包含一个数据值和一个或多个指针,用于定义其与直接节点的关系。每棵树都有一个根节点,所有其他节点都从根节点分支出来。根节点包含指向它正下方所有元素的指针,这些元素被称为它的子节点。这些子节点可以有它们自己的子节点。在同一层上的任何节点都称为同级节点。没有连接子节点的节点称为叶节点。

image

我们平时用到最多的就是二叉树,二叉树最常见的应用是二叉搜索树。二叉搜索树擅长于搜索大量的数据集合,因为时间复杂度取决于树的深度而不是节点的数量。二叉树具有以下特点:

  • 左子树只包含元素小于根的节点。
  • 右子树只包含元素大于根的节点。
  • 左右子树也必须是二叉搜索树。他们必须以树的“根”来遵循上述规则。
  • 不能有重复的节点,即不能有两个节点具有相同的值。
lass Node:
    def __init__(self, data):
        self.left = None
        self.right = None
        self.data = data
    def insert(self, data):
_# Compare the new value with the parent node_
        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data
_# Print the tree_
    def PrintTree(self):
        if self.left:
            self.left.PrintTree()
        print( self.data),
        if self.right:
            self.right.PrintTree()
_# Use the insert method to add nodes_
root = Node(12)
root.insert(6)
root.insert(14)
root.insert(3)
root.PrintTree()

树形结构的搜索效率高非常适合存储分层数据(如文件位置等),但仅仅适用于排序的列表,未排序的数据退化为线性搜索。

Python 实现哈希表

哈希表又叫散列表,哈希表是一种复杂的数据结构,能够存储大量信息并有效检索特定元素。此结构存储的是由键(key)和值(value)组成的数据,根据键直接访问存储在内存存储位置的数据结构。

image

每个输入键都要经过一个哈希函数,该函数将其从初始形式转换为一个整数值,称为哈希。哈希函数必须始终从相同的输入产生相同的哈希,必须快速计算,并产生固定长度的值。Python 包含一个内置的 hash()函数,可以加速实现。然后,该表使用散列来查找所需值(称为存储桶)的一般位置。然后,程序只需要在这个子组中搜索所需的值,而不必搜索整个数据池。除了这个通用框架之外,根据应用程序的不同,哈希表也可能非常不同。有些可能允许来自不同数据类型的键,而有些可能有不同的设置桶或不同的散列函数。

下面是一个 Python 代码中的哈希表示例:

import pprint
class Hashtable:
    def __init__(self, elements):
        self.bucket_size = len(elements)
        self.buckets = [[] for i in range(self.bucket_size)]
        self._assign_buckets(elements)
    def _assign_buckets(self, elements):
        for key, value in elements: _#calculates the hash of each key_
            hashed_value = hash(key)
            index = hashed_value % self.bucket_size _# positions the element in the bucket using hash_
            self.buckets[index].append((key, value)) _#adds a tuple in the bucket_
    def get_value(self, input_key):
        hashed_value = hash(input_key)
        index = hashed_value % self.bucket_size
        bucket = self.buckets[index]
        for key, value in bucket:
            if key == input_key:
                return(value)
        return None
    def __str__(self):
        return pprint.pformat(self.buckets) _# pformat returns a printable representation of the object_
if __name__ == "__main__":
     capitals = [
        ('France', 'Paris'),
        ('United States', 'Washington D.C.'),
        ('Italy', 'Rome'),
        ('Canada', 'Ottawa')
    ]
hashtable = Hashtable(capitals)
print(hashtable)
print(f"The capital of Italy is {hashtable.get_value('Italy')}"

哈希表可以将任何形式的键隐藏为整数索引,对于大型数据集搜索非常有效,常常应用于用于频繁查询的大型数据库或根据关键字检索的系统。

Python 实现图

图是一种数据结构,用于表示数据顶点(图的节点)之间关系的可视化。将顶点连接在一起的链接称为边。边定义了哪些顶点被连接,但没有指明它们之间的流向。每个顶点与其他顶点都有连接,这些连接以逗号分隔的列表形式保存在顶点上。还有一种特殊的图叫做有向图,它定义了关系的方向,类似于链表。在建模单向关系或类似流程图的结构时,有向图很有帮助。

在 Python 中,图的最佳实现方式是使用字典,每个顶点的名称作为键,边列表作为值。

_# Create the dictionary with graph elements_
graph = { "a" : ["b","c"],
                 "b" : ["a", "d"],
                 "c" : ["a", "d"],
                  "d" : ["e"],
                  "e" : ["d"]
         }
_# Print the graph          _
print(graph)

图在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构。常见的图遍历算法就是广度优先算法和深度优先算法。它适用于网络或类似网络的结构建模,可以通过代码快速传达视觉信息,但是在大型图中很难理解顶点链接同时从图表中解析数据的时间昂贵。

Python 实现堆

堆比较特殊,是一种图的树形结构。被用于实现“优先队列”(priority queues),优先队列是一种数据结构,可以自由添加数据,但取出数据时要从最小值开始按顺 序取出。在堆的树形结构中,各个顶点被称为“结点”(node),数据就存储在这些结点中。只要满足下面两个特点的树形结构就是堆:

  • 堆是一个完全二叉树(所谓完全二叉树就是除了最后一层其他层的节点个数都是满的)。
  • 堆中每一个节点的值都必须大于等于或者小于其子树中每一个节点的值。

image

我们可以使用 heapq 模块实现一个适合与 Python 的列表一起使用的最小堆:

import heapq
from heapq_showtree import show_tree
from heapq_heapdata import data

heap = []
print('random :', data)
print()

for n in data:
    print('add {:>3}:'.format(n))
    heapq.heappush(heap, n)
    show_tree(heap)

里面有两个函数需要注意:

  • heapq.heappush(heap, item):将值 item 推送到 heap,保持堆不变。
  • heapq_showtree.show_tree(heap):用于展示树形结构。

image

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

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

相关文章

Microk8s ingress启动失败, 10254端口被占用问题定位

问题描述 RHEL9 VM里安装了Microk8s&#xff0c;且使用了Nginx ingress Controller插件&#xff0c;443端口正常。 VM重启一次后&#xff0c;发现443端口没有LISTEN&#xff0c;不能对外提供服务。 定位过程 查看ingress pod状态&#xff0c;为CrashLoopBackOff # kubectl …

【Python篇】PyQt5 超详细入门级教程(中篇一)

文章目录 PyQt5入门级超详细教程中篇&#xff1a;信号槽机制与表格数据展示第4部分&#xff1a;事件处理与信号槽机制4.1 什么是信号与槽&#xff1f;4.2 信号与槽的基本用法4.3 信号与槽的基础示例代码详解&#xff1a; 4.4 处理不同的信号代码详解&#xff1a; 4.5 自定义信号…

【软考】设计模式之代理模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明 1.代理模式&#xff08;Proxy Pattern&#xff09;。2.意图&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。3.通过提供与对象相同的接口来控制对这个对象的访问。4.是设计模…

kali——wpscan的使用

目录 前言 查看帮助&#xff08;-h&#xff09; ​编辑 常规扫描&#xff08;--url&#xff09; 破解用户名和密码 插件枚举 扫描插件漏洞 扫描主题漏洞 前言 wpscan 是 Kali Linux 自带工具&#xff0c;主要用于扫描WordPress网站的各种安全漏洞&#xff0c;包括Word…

深度学习TensorFlow框架

深度学习介绍 深度学习和机器学习区别 机器有人工参与&#xff0c;而深度学习是靠网络&#xff1b; 深度学习需要大量的数据集&#xff0c;训练神经网络需要大量的算力 机器学习有&#xff1a;朴素贝叶斯&#xff0c;决策树等 深度学习主要是神经网络 深度学习应用场景 CV&…

[数据集][目标检测]轮胎缺陷检测数据集VOC+YOLO格式2154张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2154 标注数量(xml文件个数)&#xff1a;2154 标注数量(txt文件个数)&#xff1a;2154 标注…

【爬虫软件】小红薯评论区采集工具

一、采集目标与应用场景 您好&#xff01;我利用Python技术自主研发了一款高效的爬虫软件&#xff0c;批量收集小红薯平台上的评论&#xff0c;包括主评论及其下的二级评论。 为了拓宽用户群体&#xff0c;让不具备编程基础的小白用户也能轻松上手&#xff0c;我开发成了界面…

Burp Suite Professional 2024.8 for macOS x64 ARM64 - 领先的 Web 渗透测试软件

Burp Suite Professional 2024.8 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件 世界排名第一的 Web 渗透测试工具包 请访问原文链接&#xff1a;https://sysin.org/blog/burp-suite-pro-mac/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页…

设计模式-装饰器代理观察者

3.7 装饰器模式&#xff08;代码见vs&#xff09; 装饰器又叫做包装模式&#xff0c;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种模式创建了一个装饰类&#xff0c;用来包装原有的类&#xff0c;并在保持类方法完整性的前提下&#xff0c;提供了额…

基于Android Studio的行程记录APK开发指南(二):熟悉一个项目结构

前言 最近博主在unity开发独立游戏&#xff0c;UE5系列的相关长期教程先暂时不更新了,请大家多多谅解本系列教程我们来看看如何使用Android Studio去开发一个APK用于用户的实时行程记录 第一期&#xff1a;基于Android Studio的用户行程记录APK开发指南(一)&#xff1a;项目基…

CTF---密码学知识点总结

✨Ascall编码&#xff1a;在 ctf 比赛中&#xff0c;flag 的标志一般是以 Ascall 码的形式存在&#xff0c;其对应的码值为102&#xff0c;108&#xff0c;97&#xff0c;103&#xff08;其中{的码值是123&#xff09;&#xff01; ✨Unicode编码&#xff1a;又名万国码&#…

OpenHarmony持久化存储UI状态:PersistentStorage

前两个小节介绍的LocalStorage和AppStorage都是运行时的内存&#xff0c;但是在应用退出再次启动后&#xff0c;依然能保存选定的结果&#xff0c;是应用开发中十分常见的现象&#xff0c;这就需要用到PersistentStorage。 PersistentStorage是应用程序中的可选单例对象。此对…

海外云服务器安装 MariaDB10.6.X (Ubuntu 18.04 记录篇二)

本文首发于 秋码记录 MariaDB 的由来&#xff08;历史&#xff09; 谈起新秀MariaDB&#xff0c;或许很多人都会感到陌生吧&#xff0c;但若聊起享誉开源界、业界知名的关系型数据库——Mysql&#xff0c;想必混迹于互联网的人们&#xff08;coder&#xff09;无不知晓。 其…

C++中protobuffer的具体使用方法以及重要原理的实现

一、protobuffer的具体使用 对于基本的知识可以看我之前的文章。 那一片文章主要是知识点&#xff0c;这一片是实战。 1、头部 我们通过syntax 这个来指定版本号&#xff0c;如果不写的话就会默认为proto2&#xff0c;2这个版本是一个比较旧的版本。旧的版本写起来就比较繁琐。…

地平线Sparse4D论文解析(含论文原文)

0. 摘要 在自动驾驶感知系统中&#xff0c;3D 检测和跟踪是两个基本任务。本文深入研究了这一领域&#xff0c;并在 Sparse4D 框架的基础上进行了扩展。我们引入了两个辅助训练任务&#xff08;时间实例去噪和质量估计&#xff09;&#xff0c;并提出了解耦注意力机制&#xf…

智能计算方法与实现2|模拟退火算法原理|工具箱及其应用

模拟退火算法原理 模拟退火算法 模拟退火算法&#xff08;SimulatedAnnealing&#xff0c;SA&#xff09;最早的思想是由N.Metropolis等人于1953年提出。 1983年&#xff0c;S.Kirkpatrick等成功地将退火思想引l入到组合优化领域 它是基于Monte-Carlo送代求解策略的一种随机寻…

MATLAB 仿真跳频扩频通信系统

1. 简介 跳频扩频&#xff08;FHSS&#xff09;是一种通过在不同的频率之间快速切换来对抗窄带干扰的技术。在这篇博客中&#xff0c;我们将使用 MATLAB 进行 FHSS 通信系统的仿真&#xff0c;模拟跳频过程、调制、解调以及信号在不同步骤中的变化。通过对仿真结果进行可视化&…

为虚拟机配置固定的IP地址(CentOS9)

配置虚拟网卡 首先关闭虚拟机 打开虚拟网络编辑器 选择更改配置 选择VMnet8&#xff0c;选择子网的IP和掩码 &#xff08;这里的子网掩码为255.255.255.0&#xff0c;表示前24位为网络号&#xff0c;后8位为主机号&#xff09;然后点击DHCP设置 设置开始IP地址和结束IP地址&…

远端ide ,vscode ,python 开发环境, 有些还有一建生成chatgpt功能,支持gpu功能

现在智能化的AI工具&#xff0c;可以实现智能聊天、文本生成、语言翻译等多种功能。 博主归纳总结了6个好用免费的AI工具网站&#xff0c;供大家参考。 ## 1&#xff0c;insCode 网址&#xff1a; https://inscode.csdn.net/ 简介&#xff1a; InsCode 是一个以“灵感”&am…

【知识点】图论续篇 - 最短路算法合集

我不会跟大家说我两个月前就写好了&#xff0c;只是今天才发出来。 本文概述 最短路算法&#xff0c;见名知意&#xff0c;就是用于求出图中从某个顶点到另一个顶点最短距离的算法。最短路算法的应用极其广泛。本文将会以求解最短路为中心&#xff0c;围绕着展开叙述一些常见的…