当前位置: 首页 > news >正文

Python数据结构之链表

一、链表

1、目的

解决顺序表存储数据有上限,并且插入和删除操作效率低的问题。

2、概念

链表:链式存储的线性表,使用随机的物理内存存储逻辑上连续的数据。

链表的组成:由一个个结点组成

结点:由数据域和链接域组成,是链表的基本单位。

数据域:存储数据元素的区域。

链接域:记录下一个结点所在位置的区域。

头结点:虚设的一个节点,链接域专门记录链表第一个节点位置,数据域专门记录链表的长度。

3、链表的种类

单向链表、双向链表、循环链表

二、单向链表

1、单向链表的概念

只能通过头结点或链表的头,单向的访问后继节点的链表叫单向链表

2、节点和链表类的格式

⑴包含存储数据元素的数据域

#封装普通节点的类
class Node:#构造函数 定义节点的属性def __init__(self, value):self.value = value #普通节点的数据域self.next = None #普通节点的链接域 刚构造的节点该位置域为空

⑵有一个存储下一个节点的位置域

#封装链表的类(封装头结点)
class LinkList:#构造函数def __init__(self, node = None):self.size = 0 #头结点的数据域为0 链表的长度为0self.head = node #头结点的链接域指向None

3、单向链表的相关操作(成员函数的封装)

⑴判空

函数功能:判断链表是否有节点(除了头节点)。思路:头结点的链接域指向空,则说明链表为空

函数的返回值:逻辑值(真、假)--->1,0 ---->返回值int

函数名:符合命名规则

参数列表:链表

    #判空def is_empy(self):return self.size == 0 #判断链表长度是否为0#或者判断head是否为None

⑵头插

函数功能:将一个节点以头插的方式插入到头结点的后面。思路:(如上图)

函数名:符合命名规则

参数列表:self 链表、要插入的数据

注意事项:

  • 需要申请节点封装数据
  • 插入成功,链表长度自增
    #头插def add_head(self, value):#创建一个新的节点node = Node(value)#头插node.next = self.headself.head = node#插入成功 链表长度自增self.size += 1
头插效果

⑶遍历

函数功能:从头到尾打印出链表中每个节点的数据域的数据

函数返回值:无

函数名:符合命名规则

参数列表:self 链表

注意事项:判空

    #遍历def show(self):#判空if self.is_empy():print("该链表为空!")returnelse:q = self.headwhile q:print("%d"%(q.value),end=" ")q = q.next #改变q的指向print()

⑷尾插

函数功能:将新的节点增加到链表的尾部。思路:(如上图)

函数返回值:无

函数名:符合命名规则

参数列表:self 链表,要插入的数据

注意事项:插入成功,链表自增

    #尾插def add_tail(self, value):#可以判空  空的话 直接将head=node#创建一个节点node = Node(value)#找到链表的最后一个节点p = self.headi=1while i<self.size:p=p.nexti+=1#尾插p.next = node#尾插成功 链表长度自增self.size += 1
尾插效果

⑸任意位置插

函数功能:在指定的位置插入一个节点 思路:如上图

函数返回值:无

函数名:符合命名规则

参数列表:self链表、要插入的位置、要插入的数据

注意事项:

  • 判断要插入的位置是否合理
  • 成功插入 ;链表长度自增
  • 如果是第一个位置,做头插
    #任意位置插入数据def add_index(self, index, value):#判断位置是否合理if index<0 or index>self.size+1:print("插入失败")returnelse:p=self.headif index == 0: #当插入的是第一个位置  头插self.add_head(value)else:# 找到要插入位置的前一个节点p = self.headi=1while i<index:p=p.nexti+=1#创建一个新的节点node=Node(value)#插入node.next=p.nextp.next=node#插入成功 链表自增self.size+=1
在5号位插入22

⑹头删

函数功能:删除链表的第一个节点(除头节点)。思路:(如上图)

函数的返回值:逻辑值(真、假)或者 无

函数名:符合命名规则

参数列表:链表、要删除的数据

注意事项:判断链表是否为空

    #头删def del_head(self):#判空if self.is_empy():print("删除失败,该列表手中为空。")returnelse:#确认被删除元素deleted_value = self.head.valueself.head = self.head.nextself.size -= 1#删除成功 长度自减print(f"删除成功,{deleted_value}已被删除!")
头删

⑺尾删

函数功能:删除链表的最后一个节点。思路:(如上图)

函数的返回值:逻辑值(真、假)或者 无

函数名:符合命名规则

参数列表:链表、要删除的数据

注意事项:

  • 判断链表是否为空
  • 如果链表只有一个节点的情况
    #尾删def del_tail(self):#判空if self.is_empy():print("删除失败,该链表为空!")elif self.size == 1: #当链表只有一个节点时#确认被删除元素deleted_value = self.head.valueself.head = Noneself.size -= 1print(f"删除成功,{deleted_value}已被删除!")else:#找到最后一个节点的前一个节点q = self.headwhile q.next.next:q = q.next#确认被删除元素deleted_value = q.next.value#删除q.next = None #或  q.next = q.next.nextself.size -= 1#删除成功 长度自减print(f"删除成功,{deleted_value}已被删除!")
尾删

⑻任意位置删

函数功能:在指定的位置删除一个节点 思路:(如上图)

函数返回值:逻辑值(真、假)或者 无

函数名:符合命名规则

参数列表:self链表、要删除的位置、要删除的数据

注意事项:

  • 判断要删除的位置是否合理
  • 成功删除 ;链表长度自减
  • 如果是第一个位置,做头删
    #按位置删除def del_at(self, index):#判断位置是否合理if index < 0 or index >= self.size:print("删除失败,位置无效!")elif index == 0:  #当插入的是第一个位置  头删self.del_head()else:# 找到要删除位置的前一个节点p = self.headfor _ in range(index - 1):p = p.next#确认被删除元素deleted_value = p.next.value#删除p.next = None#删除成功 链表自减self.size -= 1print(f"删除成功,{deleted_value}已被删除!")
删除3号位的数据

⑼按位置修改

函数功能:在指定的位置修改一个节点 思路:(如上图)

函数返回值:无

函数名:符合命名规则

参数列表:self 顺序表,要修改的位置、修改的数据

注意事项:

  • 判空

  • 修改的位置是否合理

    #按位置修改def modify_at(self, index, value):#判断位置是否合理if index < 0 or index >= self.size:print("修改失败,位置无效!")else:# 找到要修改位置的节点p = self.headfor _ in range(index):# 修改p = p.nextp.value = valueprint(f"修改成功,位置{index + 1}的数据修改为{value}。")
把3号位的数据修改为33

⑽按值修改

函数功能:链表按值修改。思路:(如上图)

函数的返回值:逻辑值(真、假) --->int 成功返回1,失败返回0

函数名:符合命名规则

参数列表:self 顺序表、旧值、新值

注意事项:需要判断链表是否合法,链表是否为空,新旧值是否相等

    #按值修改def modify_by_value(self, old_value, new_value):# 找到要修改位置的节点p = self.headfound = Falsewhile p:#寻找旧值if p.value == old_value:#把旧值修改成新值p.value = new_valuefound = Truep = p.nextif found:print(f"修改成功,将值{old_value}修改为{new_value}。")else:print(f"修改失败,值{old_value}未找到。")
把40修改为44

⑾按值查找返回位置

函数功能:链表按值查找返回当前值的位置。思路:(如上图)

函数的返回值:---->int 查找成功返回位置(下标),查找失败0

函数名:符合命名规则

参数列表:self 顺序表、要查找的元素(数据)

注意事项:需要判断顺序表是否合法,顺序表是否为空

    #按值查找返回位置def find_value(self, value):# 找到要查找位置的节点p = self.headindex = 0while p:#返回值if p.value == value:return index + 1p = p.nextindex += 1return -1
查找30在列表的什么位置

⑿链表的反转:

函数功能:反转单链表的节点顺序,使头尾节点互换。思路:如上图

函数的返回值:无

函数名:符合命名规则

参数列表:self 顺序表

注意事项:

  • 空链表或单节点链表反转后与原链表一致,但打印成功消息。
  • 反转操作会更改链表结构,不可撤销。
    #链表的反转def reverse(self):#初始化一个临时变量`node`为None,用于存储反转后的链表头node = None#`p`指向链表的当前头节点,遍历过程中会逐步向后移动p = self.headwhile p:#暂存当前节点的下一个节点,用于后续移动next_node = p.next#反转当前节点的指针方向,使其指向反转后的部分p.next = nodenode = pp = next_node#最终更新链表的头节点为反转后的头节点self.head = nodeprint("链表反转成功!")
反转链表

三、链表应用:

1、菜单界面

⑴主菜单

主菜单

⑵添加菜单

添加菜单

⑶删除菜单

删除菜单

⑷修改菜单

修改菜单

2、完整代码

#判断输入是否为整数
def get_int(prompt):while True:try:value = int(input(prompt))return valueexcept ValueError:print("无效输入,请输入一个整数。")#判断输入是否在合理的范围内
def get_valid_int(prompt, min_val, max_val):while True:try:value = int(input(prompt))if min_val <= value <= max_val:return valueelse:print(f"输入不在范围{min_val}-{max_val}之间,请重新输入。")except ValueError:print("无效输入,请输入一个整数。")#判断选择是否合理
def get_choice(prompt, min_val, max_val):while True:try:value = int(input(prompt))if min_val <= value <= max_val:return valueelse:print("无法处理您的指令,请重新输入。")except ValueError:print("无效输入,请输入一个整数。")#封装普通节点的类
class Node:#构造函数 定义节点的属性def __init__(self, value):self.value = value #普通节点的数据域self.next = None #普通节点的链接域 刚构造的节点该位置域为空#封装链表的类(封装头结点)
class LinkList:#构造函数def __init__(self, node = None):self.size = 0 #头结点的数据域为0 链表的长度为0self.head = node #头结点的链接域指向None#判空def is_empy(self):return self.size == 0 #判断链表长度是否为0#或者判断head是否为None#头插def add_head(self, value):#创建一个新的节点node = Node(value)#头插node.next = self.headself.head = node#插入成功 链表长度自增self.size += 1#尾插def add_tail(self, value):#可以判空  空的话 直接将head=node#创建一个节点node = Node(value)#找到链表的最后一个节点p = self.headi=1while i<self.size:p=p.nexti+=1#尾插p.next = node#尾插成功 链表长度自增self.size += 1#任意位置插入数据def add_index(self, index, value):#判断位置是否合理if index<0 or index>self.size+1:print("插入失败")returnelse:p=self.headif index == 0: #当插入的是第一个位置  头插self.add_head(value)else:# 找到要插入位置的前一个节点p = self.headi=1while i<index:p=p.nexti+=1#创建一个新的节点node=Node(value)#插入node.next=p.nextp.next=node#插入成功 链表自增self.size+=1#头删def del_head(self):#判空if self.is_empy():print("删除失败,该列表手中为空。")returnelse:#确认被删除元素deleted_value = self.head.valueself.head = self.head.nextself.size -= 1#删除成功 长度自减print(f"删除成功,{deleted_value}已被删除!")#尾删def del_tail(self):#判空if self.is_empy():print("删除失败,该链表为空!")elif self.size == 1: #当链表只有一个节点时#确认被删除元素deleted_value = self.head.valueself.head = Noneself.size -= 1print(f"删除成功,{deleted_value}已被删除!")else:#找到最后一个节点的前一个节点q = self.headwhile q.next.next:q = q.next#确认被删除元素deleted_value = q.next.value#删除q.next = None #或  q.next = q.next.nextself.size -= 1#删除成功 长度自减print(f"删除成功,{deleted_value}已被删除!")#按位置删除def del_at(self, index):#判断位置是否合理if index < 0 or index >= self.size:print("删除失败,位置无效!")elif index == 0:  #当插入的是第一个位置  头删self.del_head()else:# 找到要删除位置的前一个节点p = self.headfor _ in range(index - 1):p = p.next#确认被删除元素deleted_value = p.next.value#删除p.next = None#删除成功 链表自减self.size -= 1print(f"删除成功,{deleted_value}已被删除!")#按位置修改def modify_at(self, index, value):#判断位置是否合理if index < 0 or index >= self.size:print("修改失败,位置无效!")else:# 找到要修改位置的节点p = self.headfor _ in range(index):# 修改p = p.nextp.value = valueprint(f"修改成功,位置{index + 1}的数据修改为{value}。")#按值修改def modify_by_value(self, old_value, new_value):# 找到要修改位置的节点p = self.headfound = Falsewhile p:#寻找旧值if p.value == old_value:#把旧值修改成新值p.value = new_valuefound = Truep = p.nextif found:print(f"修改成功,将值{old_value}修改为{new_value}。")else:print(f"修改失败,值{old_value}未找到。")#按值查找返回位置def find_value(self, value):# 找到要查找位置的节点p = self.headindex = 0while p:#返回值if p.value == value:return index + 1p = p.nextindex += 1return -1#链表的反转def reverse(self):#初始化一个临时变量`node`为None,用于存储反转后的链表头node = None#`p`指向链表的当前头节点,遍历过程中会逐步向后移动p = self.headwhile p:#暂存当前节点的下一个节点,用于后续移动next_node = p.next#反转当前节点的指针方向,使其指向反转后的部分p.next = nodenode = pp = next_node#最终更新链表的头节点为反转后的头节点self.head = nodeprint("链表反转成功!")#遍历def show(self):#判空if self.is_empy():print("该链表为空!")returnelse:q = self.headwhile q:print("%d"%(q.value),end=" ")q = q.next #改变q的指向print()linkList = LinkList()linkList.add_head(10)
linkList.add_head(20)
linkList.add_head(30)
linkList.add_head(40)
linkList.add_head(50)# 主菜单
while True:print("\n菜单:")print("1. 显示所有数据")print("2. 添加数据")print("3. 删除数据")print("4. 修改数据")print("5. 查找数据")print("6. 链表反转")print("7. 退出")choice = get_choice("请选择操作:", 1, 7)if choice == 1: #显示所有数据linkList.show()elif choice == 2: #显示添加菜单while True:print()print("1. 添加到末尾")print("2. 插入到指定位置")print("3. 返回上一级")add_choice = get_choice("请选择操作:", 1, 3)if add_choice == 1: #添加数据到末尾num = get_int("请输入一个整数:")linkList.add_tail(num)print("数字加入成功。")elif add_choice == 2: #添加数据到指定位置index = get_valid_int(f"请输入插入位置(1-{linkList.size + 1}):", 1, linkList.size + 1) - 1value = get_int("请输入一个整数:")linkList.add_index(index, value)print("数字加入成功。")elif add_choice == 3: #返回主菜单breakelif choice == 3: #显示删除菜单while True:print()print("1. 删除第一个数据")print("2. 删除最后一个数据")print("3. 按位置删除数据")print("4. 返回上一级")del_choice = get_choice("请选择操作:", 1, 4)if del_choice == 1: #删除第一个数据linkList.del_head()elif del_choice == 2: #删除最后一个数据linkList.del_tail()elif del_choice == 3: #按位置删除数据index = get_valid_int(f"请输入要删除的位置(1-{linkList.size}):", 1, linkList.size) - 1linkList.del_at(index)elif del_choice == 4: #返回主菜单breakelif choice == 4: #显示修改菜单while True:print()print("1. 按位置修改")print("2. 按值修改")print("3. 返回上一级")sub_choice = get_choice("请选择操作:", 1, 3)if sub_choice == 1: #按位置修改index = get_valid_int(f"请输入修改位置(1-{linkList.size}):", 1, linkList.size) - 1value = get_int("请输入新的值:")linkList.modify_at(index, value)elif sub_choice == 2: #按值修改old_value = get_int("请输入要修改的原值:")new_value = get_int("请输入新的值:")linkList.modify_by_value(old_value, new_value)elif sub_choice == 3: #返回主菜单breakelif choice == 5: #查找数据value = get_int("请输入要查找的值:")index = linkList.find_value(value)if index != -1:print(f"值{value}位于位置{index}。")else:print(f"值{value}未找到。")elif choice == 6: #反转链表linkList.reverse()elif choice == 7: #退出程序print("程序已退出。")break

相关文章:

Python数据结构之链表

一、链表 1、目的 解决顺序表存储数据有上限&#xff0c;并且插入和删除操作效率低的问题。 2、概念 链表&#xff1a;链式存储的线性表&#xff0c;使用随机的物理内存存储逻辑上连续的数据。 链表的组成&#xff1a;由一个个结点组成 结点&#xff1a;由数据域和链接域组…...

“LLM是否是泡沫”

目录 “LLM是否是泡沫” 培养自己鉴别论文价值的能力、复现开源项目的能力、debug 代码的能力 llm 是生产力工具 多去找实习&#xff0c;读再多的论文&#xff0c;刷再多的技术文章&#xff0c;也不如一次 debug 多机通讯报错带来的认知深刻 一、LLM领域的发展与挑战 二、…...

基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…...

算法(Algorithm)

算法&#xff08;Algorithm&#xff09; 是指解决问题或完成特定任务的一系列明确指令的集合。它是按照一定规则定义的一种计算过程&#xff0c;用于将输入转化为输出&#xff0c;能够被计算机或人类有效执行。 算法的核心特点 有穷性 算法必须在有限步骤内完成&#xff0c;不能…...

C语言中const char *字符进行切割实现

将127.0.0.1以“”“.”来进行切割&#xff0c;实现如下&#xff1a; const char * ip "127.0.0.1";char *test new char[100];strcpy(test, ip);const char *split ".";char *final;final strtok(test, split);while (final){printf("%s\n"…...

【UE5】在材质中计算模型在屏幕上的比例

ViewProperty节点有很多有意思的变量 例如用 ViewProperty 的 tan ⁡ ( FOV / 2 ) \tan(\text{FOV} / 2) tan(FOV/2) 输出&#xff0c;用它计算模型占屏幕的比例。 &#xff08;常用于for运算的次数优化&#xff0c;也可以用于各种美术效果&#xff09; ScaleOnScreen Obje…...

前端速通(HTML)

1. HTML HTML基础&#xff1a; 什么是HTML&#xff1f; 超文本&#xff1a; "超文本"是指通过链接连接不同网页或资源的能力。HTML支持通过<a>标签创建超链接&#xff0c;方便用户从一个页面跳转到另一个页面。 标记语言&#xff1a; HTML使用一组预定义的标签…...

订单日记为“惠采科技”提供全方位的进销存管理支持

感谢温州惠采科技有限责任公司选择使用订单日记&#xff01; 温州惠采科技有限责任公司&#xff0c;成立于2024年&#xff0c;位于浙江省温州市&#xff0c;是一家以从事销售电气辅材为主的企业。 在业务不断壮大的过程中&#xff0c;想使用一种既能提升运营效率又能节省成本…...

Linux:文件管理(一)

目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说&#xff0c;如果在电脑上新建了一个空白文档&#xff0…...

鸿蒙多线程开发——线程间数据通信对象03(sendable)

1、简 介 在传统JS引擎上&#xff0c;对象的并发通信开销的优化方式只有一种&#xff0c;就是把实现下沉到Native侧&#xff0c;通过Transferable对象的转移或共享方式降低并发通信开销。而开发者仍然还有大量对象并发通信的诉求&#xff0c;这个问题在业界的JS引擎实现上并没…...

linux从0到1——shell编程7

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

自主研发,基于PHP+ vue2+element+ laravel8+ mysql5.7+ vscode开发的不良事件管理系统源码,不良事件管理系统源码

不良事件上报系统源码&#xff0c;不良事件管理系统源码&#xff0c;PHP源码 不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”&#xff0c;结合预存上百套已正在使用的模板&#xff0…...

【海思Hi3519DV500】双目网络相机套板硬件规划方案

Hi3519DV500双目网络相机套板是针对该芯片设计的一款 IP 编码板 PCBA&#xff0c;硬件接口支持双目sensor 接入&#xff0c;SDIO3.0 接口、USB2.0、USB3.0、UART 接口以及丰富的 IO 扩展应用&#xff0c;可根据各种使用场景设计相应扩展板&#xff0c;丰富外围接口&#xff0c;…...

【电源专题】BUCK电源SW电压的平均值为什么等于输出电压?

在Buck电源测试过程中,我们会去测试SW开关节点的波形。那么从SW波形中我们能看出什么呢? 首先查看SW波形一般会看SW频率,通过SW波形的频率知道目前芯片的运行状态是什么。比如PSM还是PWM模式。 此外,还会看SW波形的占空比,通过占空比我们可以知道目前输出的状态是怎么样的…...

SpringCloud Gateway转发请求到同一个服务的不同端口

SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程&#xff0c;提供一些解决思路 需求背景 公司有一个IM项目&#xff0c;对外暴露了两个端口8081和8082&#xff0c;8081是springboot启动使用的端口&#xff0c;对外提供一些http接口…...

【模块一】kubernetes容器编排进阶实战之pod的调度流程,pause容器及init容器

pod的调度流程及常见状态 pod的调度流 pod的常见状态 Unschedulable&#xff1a;#Pod不能被调度&#xff0c;kube-scheduler没有匹配到合适的node节点 PodScheduled&#xff1a;#pod正处于调度中&#xff0c;在kube-scheduler刚开始调度的时候&#xff0c;还没有将pod分配…...

PySpark3:pyspark.sql.functions常见的60个函数

目录 一、常见的60个函数 1、col 2、lit 3、sum 4、avg/mean 5、count 6、max 7、min 8、concat 9、substring 10、lower 11、upper 12、trim 13、ltrim 14、rtrim 15、split 16、explode 17、collect_list 18、collect_set 19、asc 20、desc 21、when 2…...

Python操作neo4j库py2neo使用之创建和查询(二)

Python操作neo4j库py2neo使用之创建和查询&#xff08;二&#xff09; py2neo 创建操作 1、连接数据库 from py2neo import Graph graph Graph("bolt://100.100.20.55:7687", auth(user, pwd), nameneo4j)2、创建Node from py2neo import Node, Subgraph # 创建…...

力扣11.23

1964. 找出到每个位置为止最长的有效障碍赛跑路线 你打算构建一些障碍赛跑路线。给你一个 下标从 0 开始 的整数数组 obstacles &#xff0c;数组长度为 n &#xff0c;其中 obstacles[i] 表示第 i 个障碍的高度。 对于每个介于 0 和 n - 1 之间&#xff08;包含 0 和 n - 1&…...

golang实现TCP服务器与客户端的断线自动重连功能

1.服务端 2.客户端 生成服务端口程序: 生成客户端程序: 测试断线重连: 初始连接成功...

数据结构 (6)栈的应用举例

1. 递归调用 递归函数在执行时&#xff0c;会将每一层的函数调用信息&#xff08;包括局部变量、参数和返回地址&#xff09;存储在栈中。当递归函数返回时&#xff0c;这些信息会从栈中弹出&#xff0c;以便恢复之前的执行状态。栈的后进先出&#xff08;LIFO&#xff09;特性…...

谁的年龄最小(结构体专题)

题目描述 设计一个结构体类型&#xff0c;包含姓名、出生日期。其中出生日期又包含年、月、日三部分信息。输入n个好友的信息&#xff0c;输出年龄最小的好友的姓名和出生日期。 输入描述 首先输入一个整数n(1<n<10)&#xff0c;表示好友人数&#xff0c;然后输入n行&…...

【论文笔记】LLaVA-KD: A Framework of Distilling Multimodal Large Language Models

Abstract 大语言模型(Large Language Models, LLM)的成功&#xff0c;使得研究者为了统一视觉和语言的理解去探索多模态大预言模型(Multimodal Large Language Models, MLLM)。 但是MLLM庞大的模型和复杂的计算使其很难应用在资源受限的环境&#xff0c;小型MLLM(s-MLLM)的表现…...

M|大脑越狱

rating: 7.0 豆瓣: 7.6 上映时间: “2015” 类型: M悬疑 导演: 约瑟夫怀特 Joseph White 主演: 亚历山大欧文 Alexander Owen爱德华富兰克林 Edward Franklin 国家/地区: 英国 片长/分钟: 20分钟 M&#xff5c;大脑越狱 想法不错&#xff0c;但是逻辑比较一般。属于…...

数据库编程(sqlite3)

一&#xff1a;数据库分类 常用的数据库 大型数据库 &#xff1a;Oracle商业、多平台、关系型数据库功能最强大、最复杂、市场占比最高的商业数据库 中型数据库 &#xff1a;Server是微软开发的数据库产品&#xff0c;主要支持windows平台 小型数据库 : mySQL是一个小型关系型…...

【C语言】关键字详解

【C语言】关键字详解 文章目录 [TOC](文章目录) 前言一、char1.定义字符串类型2.定义字符类型 二、short三、int四、long五、signed六、unsigned七、float八、double九、struct、union、enum十、void1.void用于函数声明&#xff0c;没有返回值的函数&#xff0c;其类型为 void。…...

什么是计算机网络

什么是计算机网络&#xff1f; 计算机网络的定义计算机网络的分类按覆盖范围分类按拓扑结构分类按通信传输介质分类按信号频带占用方式分类 计算机网络的功能信息交换资源共享分布式处理 计算机网络的组成计算机网络的定义计算机网络的分类按覆盖范围分类按拓扑结构分类按通信传…...

【大数据学习 | Spark-Core】Spark的分区器(HashPartitioner和RangePartitioner)

之前学过的kv类型上面的算子 groupby groupByKey reduceBykey sortBy sortByKey join[cogroup left inner right] shuffle的 mapValues keys values flatMapValues 普通算子&#xff0c;管道形式的算子 shuffle的过程是因为数据产生了打乱重分&#xff0c;分组、排序、join等…...

CSS3_BFC(十二)

BFC MDN对BFC的解释&#xff1a;块格式化上下文&#xff08;Block Formating Context, BFC&#xff09;是web页面的可视CSS渲染的一部分&#xff0c;是块盒子的布局过程发生的区域&#xff0c;也是浮动元素与其他元素交互的区域。 1、开启BFC flow-root对内容的影响是最低的&am…...

C0032.在Clion中使用MSVC编译器编译opencv的配置方法

使用MSVC编译器编译opencv的配置方法...