数据结构之线性表(python)

news2024/11/15 13:39:33

华子目录

  • 线性表的定义
    • 前驱与后继
  • 1.顺序表(顺序存储结构)
    • `python列表与数组的区别`
      • 列表
      • 数组
    • 1.1插入数据
      • 实例
    • 1.2删除元素
      • 实例
    • 1.3查找元素
    • 1.4修改元素
    • 1.5综合示例
  • 2.单链表
    • 2.1单链表的初始化
    • 2.2插入元素
      • 示例
      • 注意
    • 2.3删除元素
      • 示例
    • 2.4修改元素
    • 2.5查找元素
    • 2.6综合示例

线性表的定义

  • 线性表零个多个数据元素的有限序列
  • 在逻辑结构上具有线性关系。将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构(简称线性表)。
  • 线性表元素的个数nn>=0)定义为线性表的长度,当n=0时,称为空表
  • 在较复杂线性表中,一个数据元素可以有若干个数据项组成。
  • 线性表又可以分为顺序表顺序存储结构)和链表链式存储结构

前驱与后继

  • 某一元素的左侧相邻元素称为“直接前驱”,位于此元素左侧所有元素都统称为“前驱元素
  • 某一元素的右侧相邻元素称为“直接后继”,位于此元素右侧所有元素都统称为“后继元素

在这里插入图片描述

1.顺序表(顺序存储结构)

  • 用一段地址连续存储单元依次存储线性表数据元素

在这里插入图片描述

python列表与数组的区别

列表

  • 列表顺序表,不是链式表
  • 列表(其他语言称为数组)是一种基本数据类型
  • 当进行列表取值a[2]时,列表中的每一个格子存的是值的地址。当进行a[2]时,它取得是a[2]的地址。通过地址指向来取值
  • python不需要提前申请列表长度,因为python内部会自动申请内存。
  • python列表插入删除时间复杂度都是O(n)

数组

  • 当进行数组取值时a[2],假如说电脑是32位,a开头编号是100内存内部会执行100+2*4=108,取到a[2]对应的
  • 数组元素类型要相同
  • 数组长度固定

1.1插入数据

向已有顺序表中插入数据元素,根据插入位置的不同,可分为以下3种情况:

  • 在表头插入元素
  • 在表的中间位置插入元素
  • 在表尾插入元素

虽然数据元素插入顺序表中的位置有所不同,但是都使用的是同一种方式去解决,即:通过遍历,找到数据元素插入位置,然后做如下两步工作:

  • 将要插入位置元素以及后续的元素整体向后移动一个位置
  • 插入的元素放到腾出来的位置上

实例

{1,2,3,4,5} 的第 3 个位置上插入元素 6,实现过程如下:

  • 遍历至顺序表存储第 3 个数据元素的位置
  • 在这里插入图片描述
  • 将元素 3 以及后续元素 4 和 5 整体移动一个位置
  • 在这里插入图片描述
  • 新元素 6 放入腾出的位置
  • 在这里插入图片描述

1.2删除元素

顺序表删除指定元素,实现起来非常简单,只需找到目标元素,并将其后续所有元素整体前移 1 个位置即可。

  • 后续元素整体前移一个位置,会直接将目标元素删除,可间接实现删除元素的目的

实例

{1,2,3,4,5} 中删除元素 3 的过程如图所示:

  • 找到目标元素
    在这里插入图片描述
  • 后续元素整体前移

在这里插入图片描述

1.3查找元素

顺序表中查找目标元素,可以使用多种查找算法实现,比如说二分查找算法、插值查找算法等。

1.4修改元素

顺序表修改元素实现过程是:

  • 找到目标元素
  • 直接修改该元素的值

1.5综合示例

import random


class SqList:
    # 初始化顺序表
    def __init__(self, length):
        self.length = length        #表示顺序表的长度(元素个数)
        self.sqlist = [random.randint(1, 100) for i in range(length)]    #顺序表内容

    # 返回所有元素
    def ShowList(self):
        return self.sqlist

    # 遍历所有元素
    def ErgodList(self):
        for i in range(self.length):
            print(f"第{i+1}个元素值为{self.sqlist[i]}")

    # 取值(按位取值)
    def GetElement(self, i):
        # 首先判断插入的位置是否在合法范围内[0,length-1]
        if i < 1 or i > self.length:
            return False
        return self.sqlist[i - 1]

    # 查找
    def FindElement(self, e):
        for i in range(self.length):
            if e == self.sqlist[i]:
                print(f"查找的元素在第{i+1}个位置")
                break
        else:
            print("无查找元素")

    # 插入
    def InsertList(self, i, e):
        if i < 1 or i > self.length+1:
            return False
        self.sqlist.insert(i - 1, e)
        self.length += 1
        return True

    # 删除(按位删除)
    def DeleteList_space(self, i):
        if i < 1 or i > self.length:
            return False
        self.sqlist.pop(i - 1)
        self.length -= 1
        return True

    # 删除(按值删除)
    def DeleteList_value(self, e):
        for i in range(self.length):
            if e == self.sqlist[i]:
                self.sqlist.pop(i)
                self.length -= 1
                return True
        return False

    # 修改(按值修改)
    def SetElement(self, eold, enew):
        for i in range(self.length):
            if eold == self.sqlist[i]:
                self.sqlist[i] = enew
                return True
        return False

    # 修改(按位修改)
    def SetElement_space(self, i, enew):
        if i < 1 or i > self.length:
            return False
        self.sqlist[i-1] = enew
        return True

l = eval(input("请输入初始化长度:"))
my_sqlist = SqList(l)   #初始化对象

# 输出所有值
mylist = my_sqlist.ShowList()
print(mylist)
print("------------------------------------------------")

# 遍历元素
my_sqlist.ErgodList()
print("------------------------------------------------")

# 插入元素
i, e = map(int, input("请输入插入元素的位置和值(空格分割):").split())
my_sqlist.InsertList(i, e)
print(f"插入后列表:{my_sqlist.sqlist}")
print("------------------------------------------------")

# 删除(按值删除)
e = eval(input("请输入要删除的值:"))
my_sqlist.DeleteList_value(e)
print(f"删除之后的列表{my_sqlist.sqlist}")
print("------------------------------------------------")

# 删除(按位删除)
i = eval(input("请输入删除元素的位置:"))
my_sqlist.DeleteList_space(i)
print(f"删除之后的列表{my_sqlist.sqlist}")
print("------------------------------------------------")

# 修改 (按值修改)
old, new = map(int, input("请输入需要修改的值和新值:").split())
my_sqlist.SetElement(old, new)
print(f"修改之后的列表{my_sqlist.sqlist}")
print("------------------------------------------------")

# 修改(按位修改)
i, new = map(int, input("请输入需要修改的位置和新值:").split())
my_sqlist.SetElement_space(i, new)
print(f"修改之后的列表{my_sqlist.sqlist}")
print("------------------------------------------------")

# 查找
e = eval(input("请输入要查找的值:"))
my_sqlist.FindElement(e)
请输入初始化长度:5
[98, 27, 99, 63, 54]
------------------------------------------------
第1个元素值为98
第2个元素值为27
第3个元素值为99
第4个元素值为63
第5个元素值为54
------------------------------------------------
请输入插入元素的位置和值(空格分割):6 99
插入后列表:[98, 27, 99, 63, 54, 99]
------------------------------------------------
请输入要删除的值:99
删除之后的列表[98, 27, 63, 54, 99]
------------------------------------------------
请输入删除元素的位置:2
删除之后的列表[98, 63, 54, 99]
------------------------------------------------
请输入需要修改的值和新值:98 0
修改之后的列表[0, 63, 54, 99]
------------------------------------------------
请输入需要修改的位置和新值:2 66
修改之后的列表[0, 66, 54, 99]
------------------------------------------------
请输入要查找的值:0
查找的元素在第1个位置

进程已结束,退出代码0

2.单链表

  • 为了表示每个数据元素 ai 与其直接后继数据元素 ai+1 之间的逻辑关系,对数据元素 ai 来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。我们把存储数据元素信息称为数据域,把存储直接后继位置称为指针域指针域中存储的信息称做指针。这两部分信息组成数据元素 ai存储映像,称为结点(Node)
  • n个结点链结成一个链表,即为线性表(a1,a2,…,an)的链式存储结构,因为此链表每个结点中只包含一个指针域,所以叫做单链表

在这里插入图片描述
在这里插入图片描述

  • 头指针:一个普通的指针,它的特点是永远指向链表第一个节点的位置
  • 头节点:其实就是一个不存任何数据空节点,通常作为链表第一个节点。对于链表来说,头节点不是必须的
  • 首元节点:由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点首元节点
  • 其他节点链表中其他的节点

在这里插入图片描述

  • 注意:链表中有头节点时,头指针指向头节点;反之,若链表中没有头节点,则头指针指向首元节点

2.1单链表的初始化

  • 声明一个头指针(如果有必要,可以声明一个头节点
  • 创建多个存储数据节点,在创建的过程中,要随时与其前驱节点建立逻辑关系

2.2插入元素

同顺序表一样,向链表中增添元素,根据添加位置不同,可分为以下 3 种情况:

  • 头插法:插入到链表的头部头节点之后),作为首元节点
  • 中插法插入到链表中间某个位置
  • 尾插法插入链表最末端,作为链表最后一个数据元素

虽然新元素插入位置不固定,但是链表插入元素的思想是固定的,只需做以下3步操作,即可将新元素插入到指定的位置

  • 找到插入位置前一个结点
  • 新结点next指针 指向插入位置结点
  • 插入位置前结点next指针 指向插入结点

示例

例如,我们在链表 {1,2,3,4} 的基础上分别实现在头部中间部位尾部插入新元素 5,其实现过程如图1 所示:
在这里插入图片描述

  • 从图中可以看出,虽然新元素插入位置不同,但实现插入操作方法一致的,都是先执行步骤 1 ,再执行步骤 2

注意

链表插入元素的操作必须是先步骤 1,再步骤 2;反之,若先执行骤步 2,除非再添加一个指针,作为插入位置后续链表的头指针,否则会导致插入位置后的这部分链表丢失无法再实现步骤1

2.3删除元素

链表删除指定数据元素时,实则就是将存有该数据元素节点链表摘除,但作为一名合格的程序员,要对存储空间负责,对不再利用存储空间及时释放。因此,从链表删除数据元素需要进行以下 2 步操作:

  • 结点链表摘下来
  • 手动释放掉结点回收被结点占用的存储空间

其中,从链表上摘除某节点的实现非常简单,只需找到该节点直接前驱节点temp

  • temp.next = temp.next.next

示例

例如,从存有 {1,2,3,4}链表中删除元素3,则此代码执行效果如图 2 所示:
在这里插入图片描述

2.4修改元素

  • 修改链表中的元素,只需通过遍历找到存储此元素的节点,对节点中的数据域做更改操作即可

2.5查找元素

  • 链表查找指定数据元素最常用方法是:从表头依次遍历表中节点,用被查找元素各节点数据域存储数据元素进行比对,直至比对成功遍历至链表最末端NULL比对失败的标志
  • 注意,遍历有头节点链表时,需避免头节点对测试数据影响

2.6综合示例

# 定义节点类,包含两个成员:节点数据域和指向下一个节点的指针域(带有头节点的单链表)
class SingleNode:
    def __init__(self, item):
        self.item = item   #数据域
        self.next = None   #指针域


class SingleLinkList:
    def __init__(self):
        self.head = None

    # 判断链表是否为空
    def is_empty(self):
        return self.head == None

    # 输出链表长度
    def get_length(self):
        return len(self.travel())

    # 遍历整个链表
    def travel(self):
        # 思路就是先判断链表是否为空
        # 为空直接返回None
        # 不为空的话,就先定义一个列表,然后通过next指针从头指针开始遍历,依次将节点存储的值加入列表中,直到下一个指针指向为空,则停止遍历
        if self.is_empty():
            return None
        else:
            curlist = []
            cur = self.head
            while cur != None:
                curlist.append(cur.item)
                cur = cur.next
            return curlist

    # 头插法创建单链表
    def add(self,newItem):
        node = SingleNode(newItem)
        node.next = self.head
        self.head = node

    # 尾插法
    def append(self,newItem):
        node = SingleNode(newItem)
        if self.is_empty():
            return self.add(newItem)
        # 从头节点开始遍历
        nod = self.head
        while nod.next != None:
            nod = nod.next
        nod.next = node

    # 指定位置添加元素
    def insert(self, pos, newItem): # 在指定pos位置上添加newItem元素
        # 链表的插入需要分几种情况
        # 第一步:判断pos是否在合理范围内,如果不在,则直接终止
        # 第二步:判断pos是否在第一个,如果是则采用头插法
        # 第三步:如果pos在最后一个,则采用尾插法
        # 第四步:如果即不在头,也不在尾,则通过循环遍历到pos位置,再用insert插入
        node = SingleNode(newItem)
        cur = self.head
        count = 0
        if pos == 0:
            return self.add(newItem)
        elif pos < (self.get_length()):
            while count < pos - 1:    #找到指定位置的前一个节点
                cur = cur.next
                count += 1
            node.next = cur.next
            cur.next = node
        elif pos == (self.get_length()):
            return self.append(newItem)
        else:
            return '输入的位置有误,请确认'


    # 删除指定位置上的节点
    def remove(self, pos):
        # 第一步:判断给定的pos是否在合理范围内
        # 第二步:通过循环,遍历到pos位置,遍历期间通过next指针依次指向下一个节点
        # 第三步:找到指定位置的节点后,通过nod.next = nod.next.next删除
        cur = self.head
        count = 0
        if 1 <= pos < (self.get_length()):
            while count < pos - 1:  #找到指定位置的前一个节点
                cur = cur.next
                count += 1
            cur.next = cur.next.next
        elif pos == 0:
            self.head = cur.next
        else:
            return '输入的位置有误,请确认'


    # 查找指定位置的节点值
    def find(self, pos):
        cur = self.head
        count = 0
        if 0 <= pos < (self.get_length()):
            while count < pos:     #找到指定位置的节点
                cur = cur.next
                count += 1
            return cur.item
        else:
            return '输入的位置有误,请确认'

    # 更新链表中某个位置的值
    def update(self, pos, newItem):
        cur = self.head
        count = 0
        if 0 <= pos < (self.get_length()):
            while count < pos:    #找到指定位置的节点
                cur = cur.next
                count += 1
            cur.item = newItem
        else:
            return '输入的位置有误,请确认'

    # 清空链表
    def clear(self):
        self.head = None


singlelinklist = SingleLinkList()  #实例化对象
print("初始化单链表:",singlelinklist)
print("-----------------------------")
print("判断单链表是否为空:",singlelinklist.is_empty())
print("-----------------------------")


# 添加数据
import random
for i in range(10):
    singlelinklist.add(random.randint(1,100))

# 遍历数据
print("遍历单链表:",singlelinklist.travel())
print("-----------------------------")
print("判断单链表是否为空:",singlelinklist.is_empty())
print("-----------------------------")

# 末尾添加数据
singlelinklist.append(10)
print("末尾添加元素后的单链表遍历结果:",singlelinklist.travel())
print("-----------------------------")
# 开头添加数据
singlelinklist.add(1)
print("开头添加元素后的单链表遍历结果:",singlelinklist.travel())
print("-----------------------------")

# 查看数据长度
print("单链表长度:",singlelinklist.get_length())
print("-----------------------------")

# 指定位置插入数据,位置从0开始
singlelinklist.insert(1, 13)
print("插入数据后的遍历单链表:",singlelinklist.travel())
print("-----------------------------")

# 删除指定位置数据
singlelinklist.remove(0)
print("删除数据后的遍历单链表:",singlelinklist.travel())
print("-----------------------------")

# 更新指定位置数据
singlelinklist.update(2, 2)
print("更新数据后的遍历单链表:",singlelinklist.travel())
print("-----------------------------")

# 清空所有数据
singlelinklist.clear()
print("清空数据后的遍历单链表:",singlelinklist.travel())
初始化单链表: <__main__.SingleLinkList object at 0x0000020DA4358460>
-----------------------------
判断单链表是否为空: True
-----------------------------
遍历单链表: [39, 42, 88, 51, 64, 60, 66, 29, 29, 35]
-----------------------------
判断单链表是否为空: False
-----------------------------
末尾添加元素后的单链表遍历结果: [39, 42, 88, 51, 64, 60, 66, 29, 29, 35, 10]
-----------------------------
开头添加元素后的单链表遍历结果: [1, 39, 42, 88, 51, 64, 60, 66, 29, 29, 35, 10]
-----------------------------
单链表长度: 12
-----------------------------
插入数据后的遍历单链表: [1, 13, 39, 42, 88, 51, 64, 60, 66, 29, 29, 35, 10]
-----------------------------
删除数据后的遍历单链表: [13, 39, 42, 88, 51, 64, 60, 66, 29, 29, 35, 10]
-----------------------------
更新数据后的遍历单链表: [13, 39, 2, 88, 51, 64, 60, 66, 29, 29, 35, 10]
-----------------------------
清空数据后的遍历单链表: None

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

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

相关文章

【网络】TCP协议的简单使用

目录 echo_service server 单进程单线程 多进程 多线程 线程池 client echo_service_code echo_service 还是跟之前UDP一样&#xff0c;我们先通过实际的代码来实现一些小功能&#xff0c;简单的来使用TCP协议进行简单的通信&#xff0c;话不多说&#xff0c;我们先实现…

LabVIEW提高开发效率技巧----合理使用数据流与内存管理

理使用数据流和内存管理是LabVIEW开发中提高性能和稳定性的关键&#xff0c;特别是在处理大数据或高频率信号时&#xff0c;优化可以避免内存消耗过大、程序卡顿甚至崩溃。 1. 使用 Shift Register 进行内存管理 Shift Register&#xff08;移位寄存器&#xff09; 是 LabVIE…

五分钟上手Spring AI Alibaba,轻松打造智能聊天应用

文章目录 快速上手快速体验示例示例开发指南总结 快速上手 Spring AI Alibaba 已经完全适配了阿里云通用模型&#xff0c;接下来&#xff0c;我们将学习如何使用 spring ai alibaba 开发一个基于通用模型服务的智能聊天应用。 快速体验示例 下载项目 运行以下命令下载源码&…

【产品更新】中汇保函-电子保函管理平台

中汇保函 新增 1.手机扫描保函验真二维码直接跳转小程序模块&#xff0c;验真快人一步。 2.新增客户服务服务&#xff0c;可直接联系微信客服。 优化 1.提交申请、登录程序响应速度。 更新内容说明 1.手机扫描保函验真二维码直接跳转小程序模块&#xff0c;验真快人一步。 2.…

从零开始之AI面试小程序

从零开始之AI面试小程序 文章目录 从零开始之AI面试小程序前言一、工具列表二、部署流程1. VMWare安装2. Centos安装3. Centos环境配置3.1. 更改子网IP3.2. 配置静态IP地址 4. Docker和Docker Compose安装5. Docker镜像加速源配置6. 部署中间件6.1. MySQL部署6.2. Redis部署 7.…

华为OD机试 - 出租车计费(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

飞睿智能实时雷达活体探测传感器模块,智能家居静止检测实时感知人员有无

随着科技的飞速发展&#xff0c;我们的生活正在经历着未有的创新。在这个创新的浪潮中&#xff0c;实时雷达活体探测传感器模块的技术正逐渐崭露头角&#xff0c;以其独特的优势为我们的生活带来安全与便捷。今天&#xff0c;我们就来详细探讨一下这项技术&#xff0c;看看它是…

帮13岁小孩哥2分钟完成开发,这位AI程序员究竟是何方神圣?

通义灵码再升级&#xff0c;真AI程序员来了 随着通义系列基础模型能力的全面提升&#xff0c;各个具体领域的应用模型也随之飞升。这次在云栖大会上迎来重磅升级的&#xff0c;就包括用于代码生成的通义灵码。 一年前的通义灵码还只能完成基础的辅助编程任务&#xff0c;很难…

基于SpringBoot和Vue框架的医保管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 1.研究的主要内容与方法 &#xff08;1&#xff09;主要内容 医保管理系统采用B/S模式进行开发&#xff0c;采用Springboot框架、VUE技术、Idea为环境、MySQL为数据库开发。主要功能有&#xff1a;个人资料管理、投保用户管理、…

上海我店平台 8月新增注册用户89w 两年破百亿销售额!

近年来&#xff0c;网络空间内涌现了一个备受瞩目的新平台——“上海我店”&#xff0c;其公布的业绩数据显示&#xff0c;短短三年内&#xff0c;该平台交易流水已突破百亿大关&#xff0c;上月更是迎来了近百万的新增注册用户&#xff0c;这一消息迅速吸引了众多商家的目光。…

【深度好文】你必须要知道-大模型的上下文窗口(Context Window )

Context Window 上下文窗口&#xff1a;捕捉信息的范围 上下文窗口指的是 AI 模型在生成回答时考虑的 Token 数量。它决定了模型能够捕捉信息的范围。上下文窗口越大&#xff0c;模型能够考虑的信息就越多&#xff0c;生成的回答也就越相关和连贯。 在语言模型中&#xff0c;上…

SysML图例-手电筒

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

第二证券:股价为什么出现大跌?股价大跌时怎么办?

股票是预期收益率较大的出资之一&#xff0c;但同时股票商场的动摇也会是比较大的&#xff0c;股价大涨大跌都是有或许出现的。股价大涨会让出资者获利更多&#xff0c;而大跌也会加大出资者的损失。下面为我们分析股价为什么会大跌&#xff0c;并介绍股价大跌出资者应该如何应…

【测试】——Selenium API (万字详解)

&#x1f4d6; 前言&#xff1a;本文详细介绍了如何利用Selenium进行Web自动化测试&#xff0c;包括定位元素&#xff08;如cssSelector和xpath&#xff09;、常用操作函数&#xff08;如点击、输入等&#xff09;、窗口管理、键盘鼠标事件和浏览器导航&#xff0c;以及处理弹窗…

linux 的 sed 命令的 使用学习

&#xff08;1&#xff09; sed 概述&#xff1a; &#xff08;2&#xff09; 首先谢谢 b 站这位老师&#xff0c;这位专家的完美讲解 讲解继续&#xff1a; &#xff08;3&#xff09; 关于 sed 里的模式&#xff1a; &#xff08;4&#xff09; sed 支持的常用的对文本编辑的…

LIN总线CAPL函数—— 设置报头同步间隔场长度(linSetBreakLength)

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

爬虫 ----hook

目录 定义&#xff1a; 了解什么是hook? 举例 hook XHR请求 XMLHttpRequest 案例地址&#xff1a; Interceptors-拦截器 HOOK cookie操作 cookie 示范 常见的hook代码总结 1.Hook Cookie 2.Hook Header 3.Hook URL 4.Hook JSON.stringify 5.Hook JSON.parse 6.Ho…

5G Multicast/Broadcast Services(MBS) (四)

这篇是有关MBS RRC相关的一些基本内容,内容不多,但是感觉很关键,主要包括SI,MBS网络侧相关的内容,L2 协议架构,cell reselection prioritity以及MBS接收的一些内容,希望有帮助。 SI 在MBS场景中,SI和常规5G一样分为Minimum SI和Other SI。Minimum SI是MIB和SIB1,Min…

智能创造的幕后推手:AIGC浪潮下看AI训练师如何塑造智能未来

文章目录 一、AIGC时代的算法与模型训练概览二、算法与模型训练的关键环节三、AI训练师的角色与职责四、AI训练师的专业技能与素养五、AIGC算法与模型训练的未来展望《AI训练师手册&#xff1a;算法与模型训练从入门到精通》亮点内容简介作者简介谷建阳 目录 《医学统计学从入门…

Cisco Packet Tracer超详细下载安装教程(附中文版插件)

一、安装包下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1RK8iQ9lJG__vBEGCYVYNSA 提取码&#xff1a;1lvb 压缩包解压密码&#xff1a;66668888&#xff0c;不能正常解压的&#xff0c;推荐使用360压缩解压 二、安装教程&#xff1a; 1.双击启动安装包 2.点击N…