Day27-【13003】短文,线性表两种基本实现方式空间效率、时间效率比较?兼顾优点的静态链表是什么?如何融入空闲单元链表来解决问题?
文章目录
- 本次内容总览
- 第四节,两种基本实现方式概览
- 两种基本实现方式的比较
- 元素个数n大于多少时,使用顺序表存储的空间效率才会更高?
- 时间效率比较?
- *、访问操作,也就是读运算,读操作
- 1、插入,2、删除操作
- 什么是空闲单元链表?
- 空闲单元链表如何实现?
- 2、删除操作
- 1、插入操作
- *、清空链表操作
- 什么是静态链表?
- 静态链表插入操作过程示意?
- 静态链表删除操作过程示意?
- 静态链表单元的状态分类?未使用过的空闲单元是一片连续单元
- 使用过的空闲单元,引入空闲单元链表,建立新链
- 如何实现静态链表?
本次内容总览
第四节,两种基本实现方式概览
两种基本实现方式的比较
线性表有两种基本实现方式,分别是顺序实现和链式实现。
那么,哪一种方法更好呢?
这两种实现方式各有优势,在不同的情况下,对应于不同的操作,某一种方式可能会优于另外一种。但是哪种方式都不能适用于所有情况。
- 顺序表的优点是存储每个数据元素时空间比较紧凑,并且会占用连续的空间。
数组的每个单元中只需要保存数据本身,没有额外的开销。
- 与此相对的是,链表在每个结点上除存储数据元素以外,还要留出空间存放指针。
单链表中每个结点包含一个指针,双向链表中每个结点包含两个指针。这些指针占用的空间称为结构性开销。
存储一个指针的空间大小是固定的,与使用的具体系统相关。
如果数据域data占用的空间较小,则结构性开销的比例就会较大。
元素个数n大于多少时,使用顺序表存储的空间效率才会更高?
为顺序表分配的数组, 通常要宽松—些。 当线性表中元素个数没能达到顺序表的最大容量时,数组中 仍然会有空闲的空间, 此时并没能充分利用数组的全部空间。
而链表中占用的空间大小与链表中的元素个 数成正比, 分配的结点是全部使用的。
-
所以,当线性表的元素个数相对较少时,链表的实现比顺序表的实 现更节省空间。
也就是说,链表方式的发现,在资源紧张时,起了很大的作用
-
反之, 当线性表中的元素个数接近数组分配的最大个数,数组几乎被填满时,空闲的单元不多,它的空间存储效率很高。
设n表示线性表中当前元素的个数,
D表示最多可以在数组中存储的元素个数, 也就是数组的大小,
P 表示指针的存储单元大小,
E表示数据元素的存储单元大小。
按照这个假设,
顺序表的空间需求为D x E;就是数组的元素总数,和每个元素存储单元,的乘积
单链表的空间需求为n x (P+E)。 就是线性表当前元素总数,和指针存储单元+元素存储单元之和,的乘积
对于给定的n值, 以上两个表达式中哪一个的值较小呢?
列方程后可以求 出n的临界值,
即n=D x E/(P+E)。
-
当线性表中元素个数小于这个值时,单链表的存储效率更优。
双向链表的橾作实现起来与单链表类似,其空间效率要低于单链表,因为表中每个结点都带有两个指针,比单链表中每个结点的指针数多1个。
所以双向链表的结构性开销是单链表的2倍。
-
当线性表中元素个数超过这个值时, 顺序表的空间效率更离,
如果P = E (如指针占2字节,数据元素也占2字节),
则临界值n = D/2。
- 也就是说,和数组本身的大小有关
【例2-12】 设采用单链表保存的线性表L的每个元素需要的空间为10字节, ;意思是数据元素空间大小,E,是10字节
—个指针占2字节。 ;意思是P,为2字节
若采 用单链表或含30个元素的数组保存L, ;数组大小D,为30;
试分析哪种方式的空间存储效率更高,
仅需要考虑L中的元素。
1、L中的元素个数n 的临界值
= 30 * 10 / ( 2+10 )
= 25
2、当L中元素个数小于 25时,采用链表的空间存储效率更高
当L中元素个数大于 25时,采用数组的空间存储效率更高
当L中元素个数等于 25时,两者空间存储效率一样
答案:
即在不考虑头结点所占用空间的前提下,(注意:这一点还是要注意一下,说不考虑链表的头结点的,也就是可能采用不带头结点的链表)
如果L中元素个数少于25个, 则采用单链表更省空间;
如果多于25个元素,则采用数组更省空间;
如果正好是25个元素, 则两种方式占用的空间是一样大的。
-
选择顺序表或链表的一个因素是, 当线性表元素个数变化较大或者未知时, 最好侍用链表实现。
-
也就是说,元素个数n未知,或者变化较大,其实也就是n可能会变得很小,那么尽量采用链表
-
如果 用户事先知道线性表的大致长度, 则使用顺序表的空间效率会更高些。
-
如果知道元素个数n的大概长度,就采用顺序表么,要么n很小,不仍然是链表更好
并非如此,因为此时就可以限制一下数组大小D的值,让它尽量匹配,这样n的大概长度,肯定是超过了临界值n的
还有一个因素需要考虑, 即顺序表 占用的空间是连续的,
而链表占用的空间可能是零散的,
并且还需要程序员来管理空间的分配及释放。
时间效率比较?
再来看看操作的时间效率。
以访问线性表的第i个元素为例,
*、访问操作,也就是读运算,读操作
-
单链表不能随机访问指定的元素,访问时必须从表头开始逐个结点进行查找,直到找到第i个结点为止。这个操作的平均时间复杂度和最差时间复杂度均为O(n)
-
相比之下,在顺序表中是直接定位的,可以实现随机访问,操作的时间复杂度是O (1)
1、插入,2、删除操作
关于插入橾作和删除操作,
在给出指向链表合适位置的当前指针后,
见,Day27-【13003】短文,什么是单链表、循环链表、双向链表、双向循环链表?它们的操作时间复杂度是多少?如何进行存储单元的计算?,中:如果已经设定当前指针的指向,则进行插入、删除操作时,时间复杂度均为O(1),
-
在单链表内进行插入和删除操作的时间复杂度也可以达到O (1)。
-
双向链表各个操作的时间复杂度分析留作习题。
-
而顺序表的插入操作和删除操作必须在数组内将当前位置之后的各元素分别向后与向前移动,这种移动的平均和最差时间复杂度均为O(n)。
对于线性表的许多应用,插入和删除都是主要的操作,因此它们的时间效率是举足轻重的,仅就这个原因而言,单链表通常比顺序表更灵活。
见,Day27-【13003】短文,什么是单链表、循环链表、双向链表、双向循环链表?它们的操作时间复杂度是多少?如何进行存储单元的计算?,中:如果已经设定当前指针的指向,则进行插入、删除操作时,时间复杂度均为O(1),
什么是空闲单元链表?
在链表中,当需要在链表中插入— 个结点时,需要调用malloc函数分配相应的空间。
当在链表中删除一 个结点时,需要调用free函数释放空间。
如果在链表中频繁进行插入、删除结点的操作,则频繁调用这些函数的时间开销会是非常可观的。
如何解决?
可以针对实际应用的每类链表,定义一 个 “伙伴链表” ,表结点的结构与所使用链表的结构一 致。
伙伴链表用来管理暂时不用的结点,也可以将伙伴链表称为空闲单元链表。
也就是freelist链表
freelist链表的作用是暂时保管要归还给系统的结点空间,结点中的数据是无意义的,
所以插入及删除的操作都可以在表头进行。
而且,链表中也不需要头结点。
因此,对freelist链表操作的效率非常高。
对于有相同结点结构的所有链表,可以共用一 个freelist链表,
也可以将其设詈为一个全局变量,
初始时,freelist是一 个空链表。
在程序的最后,freelist中结点占用的空间需要全部释放。
空闲单元链表如何实现?
假设保存数据的单链表为L。
2、删除
1、当从链表L中删除一个结点时,将这个结点插入到freelist中。
这样就完成了删除,其实也就是挪到了临时表中,难怪说删除没有真的删,也可能只是挪走了,挪到了临时空间中
1、插入
1、当需要申请新的结点空间时,先查看链表freelist。
2、
a.如果freelist不为空,则从freelist中获取一 个结点,结点中保存相应的值,并将该结点插入到L的相应位詈,
b.否则调用malloc函数分配新的空间,并完成后续的插入橾作。
2、删除操作
在增加freelist链表后,可以修改前面实现的在单链表中进行插入结点及删除结点的橾作,实现如下。
int removeList(LinkList * head, Position curr, ELEMTType * x) {// 删除表head中位置curr处的元素,并通过x返回LinkNode * temp;if ((*head == NULL && curr == NULL) || curr->next == NULL) return FALSE; // 指针无效if (isEmpty(head) == TRUE) return FALSE; // 空表*x = curr->next->data;temp = curr->next;curr->next = curr->next->next;temp->next = freelist;freelist = temp;(*head)->data--;return TRUE;
}
1、插入操作
int insertList(LinkList * head, Position curr, ELEMTType x) {// 在表head的位置curr处插入元素xLinkNode * temp;if (*head == NULL && curr == NULL) return FALSE; // 指针无效if (freelist == NULL) {temp = (LinkList)malloc(sizeof(LinkNode));}else {temp = freelist;freelist = freelist->next;}temp->data = x;temp->next = curr->next;curr->next = temp;(*head)->data++;return TRUE;
}
*、清空链表操作
int clear(LinkList * head) {// 将链表head置为空LinkNode * p;if (*head == NULL) {// 表头指针错误,返回0printf("链表错误\n");return FALSE;}p = (*head)->next;while (p != NULL) {// 将各结点依次放入freelist中(*head)->next = p->next;p->next = freelist;freelist = p;p = (*head)->next;}(*head)->data = 0;// 结点个数为0return TRUE;
}
什么是静态链表?
顺序表和链表的— 些特点是相互对立的,
比如,当插入元素时,在顺序表中可能要移动元素,但在链表中完全不需要移动。
顺序表的空间是一 次性预分配的,而链表的空间是随用随分配的。
顺序表中查找某位詈的元素非宫方便,但多数情况下在链表中进行查找则不是一 个便捷的橾作。
特别是,顺序表占用的空间完整,而链表占用的空间笭散。
在有些应用中,需要— 种兼具顺序表和链表特性的结构,
既要具有顺序表的空间整体性,不必进行零散的空间处理,
又要具有链表的灵活性,在插入或删除时不必进行数据的大量移动。
静态链表正好能满足这种需求。
数据结构中的静态链表,
即使用一 维数组实现的链表。
下面以单链表为例,介绍静态链表。
实际上,还可以实现静态双向链表及静态循环链表。
假设静态链表保存在— 维数组A中,
每个元素的类型与单链表结点类型— 致,
也有数据域data和指针域next。
将A[0]当作一 个特殊结点,类似于单链表中的表头结点,
-
表头结点,并非头结点,而是首结点!
这里确实是类似首结点,因为静态链表没有头结点
在A[0]的数据域data中保存链表中元素的个数,
初始时,data的值是0
在指针域next中保存静态链表中第一 个元素在数组中的下标。
初始时,next的值1。
(注意,这里资料打错了,打成next初始值成-1了)
例如,将图2-17a所示的单链表head中的各元素,依次保存在数组A最前面的几个单元中,得到的静态链表如图2-17b所示。
静态链表插入操作过程示意?
在静态链表中实现基本橾作的过程类似于在链表中的实现过程。
例如,在静态链表中进图2-9所示的插入操作,
新元素E应在元素B与C之间。
1、在图2-17b所示的— 维数组中找到— 个空闲位詈,如下标5处,
- 下标5,也就是静态链表的位置5
这相当于在单链表中进行插入操作时调用malloc函数得到一个新的结点空间。
2、将元素E放在这个位置的data域中(类似于图2-9中的步骤①)。
E的后继是元素C, 所以下标5处的next值应为3 (类似千图2-9中的步骤②),
3、而E的前驱是元素B,即B的next值应为5 (类似于图2-9中的步骤③。
4、最后,将链表中的元素个数加1。
在插入操作完成后,得到的静态链表如图2-18所示。
静态链表删除操作过程示意?
现在,在图2-18所示的静态链表中删除元素D。
1、删除的元素D是静态链表中的表尾元素,
删除后,它的前驱(元素C)的next值应为元素D的next值,即**-1,表示静态链表的结束**。
2、同时,在静态链表中将这个位詈标识为空闲位置,
这相当于在单链表中进行删除橾作时调用delete函数。
得到的静态链表如图2-19所示。
静态链表单元的状态分类?未使用过的空闲单元是一片连续单元
在静态链表使用的数组中,可以将单元的状态分为两类,
-
一类是已经被占用的单元,
如图2-19中下标为0、1、2、3、5的单元,;所谓下标,其实就是位置0,1,2,3,5
-
另一 类是空闲单元,
如图2-19中下标为4、6、7、8的单元。
- 空闲单元又分为两种,一 种是曾经使用过但现在空闲的,如下标为4的单元,
- 另一 种是从未使用过的,如下标为6、7、8的单元。
在静态链表中,可以使用一 个特殊标记来标识空闲单元,
插入时将新元素放置在有特殊标记的单元中。
初始时,数组中所有单元均为空闲单元,故需要为每个单元设詈特殊标记。
在插入时,需要逐个单元进行查找。
当然,可以采用更有效的方法标记空闲单元,其目的是方便后面的插入操作。
数组中所有未曾使用过的单元必定是— 片连续单元,
可以使用整型变量unused记录这片连续单元的首位詈,
凡是下标大于等于unused且不越界的单元,均为空闲单元。
例如,在图2-19中,unused的值是6。
下标大于等于6且小于9的单元即这类空闲单元。
使用过的空闲单元,引入空闲单元链表,建立新链
对于数组中普经使用过且目前空闲的所有单元,建立另一个静态链表将其链接起来,可以将这个链表称为空闲单元链表,
用整型变量available记录这个链表首结点的下标。
- 把空闲单元链表,融合到静态链表中解决问题来了,难怪要先学空闲单元链表
例如,对于图2-19所示的静态链表,available值为4。
因为目前只有这— 个空闲位詈,故它也是表尾,位置4的next值为-1。
如何实现静态链表?
程序中用到的一些常量及静态链表的定义如下。
#define TRUE 1
#define FALSE 0
#define ERROR -1
typedef int ELEMTType;
typedef struct node {ELEMTType data; //数据域int next; //指针域
} ArrayListNode;
typedef struct {ArrayListNode element[maxSize]; //保存元素的数组,最大容量为maxSizeint available; //空闲单元链表首位置,将释放的结点组成一个链表int unused; //未用空间首位置
} ArrayList;
typedef int position;
初始化过程是构造一个空的静态链表,并给静态链表中的各个变量赋初值。
int initList(ArrayList * L) {// 构造一个空静态链表LL->element[0].data = 0;L->element[0].next = -1;L->available = -1;L->unused = 1;return TRUE;
}
清空静态链表与初始化过程是类似的。
int clear(ArrayList * L) {// 将表L置空L->element[0].data = 0; //element[0]:头结点, data保存链表长度L->element[0].next = -1; //element[0]:头结点, 链表结束, 置next为-1L->available = -1; //空闲单元链表首位置, 初始时无空闲结点置为-1L->unused = 1; //未用空间首位置, 初始为element[1]return TRUE;
}
判定静态链表的空或满状态是很容易实现的。数组第一个单元的data域保存了链表中元素的个数,如果该值是0,则链表是空链表,如果是maxSize-1,则表示链表已满。
int isEmpty(ArrayList * L) {// 如果表L为空,则返回1,否则返回0if (L->element[0].data == 0) return TRUE;else return FALSE;
}int isFull(ArrayList * L) {// 如果表L为满,则返回1,否则返回0if (L->element[0].data == maxSize - 1) return TRUE;else return FALSE;
}
求表长的实现如下
int length(ArrayList * L) {// 返回表L的当前长度return L->element[0].data;
}
在静态链表中进行插入操作时,如果空闲单元链表为空,即available==-1,则使用unused位置的单元同时unused++;如果空闲单元链表不为空,即available!=-1,则取表头单元来使用,即使用available位置的单元,同时更新空闲单元链表,available值更新为链表中下一个元素的下标。
int insertArrayList(ArrayList * L, Position pos, ELEMTType x) {// 在表L的位置pos处插入元素xint i, k, curr;if (isFull(L) == TRUE) return FALSE; // 表满if (pos < 0 || pos > L->element[0].data) return ERROR; // 位置错误, 与表满区分开if (L->available == -1) {// 空闲单元链表为空k = L->unused;// 新申请的数据结点的下标L->element[L->unused++].data = x;}else {// 有空闲空间, 取出空闲单元链表的首结点k = L->available;// 新申请的数据结点的下标L->element[k].data = x;L->available = L->element[k].next;// 将新结点从空闲单元链表中删除}L->element[0].data++;curr = 0;// 头位置for (i = 0; i < pos; i++) {// 在数据链表中定位位置在pos的结点curr = L->element[curr].next;}L->element[k].next = L->element[curr].next;// 将新数据结点插入到链表中L->element[curr].next = k;// 放置xreturn TRUE;
}
当从静态链表中删除一个元素时,元素的值通过x带回。从表头开始找到被删除元素的前驱,修改该元素的next值,与被删除元素的后继相连。而该元素占用的空间会链接到空闲单元链表中。
int removeArrayList(ArrayList * L, Position pos, ELEMTType * x) {// 删除表L中位置position处的元素并通过x返回int i, k, curr;if (isEmpty(L) == 1) return FALSE; // 表空if (pos < 0 || pos >= L->element[0].data) return ERROR; // 位置错误, 与表空区分开curr = 0;// 头位置for (i = 0; i < pos; i++) {curr = L->element[curr].next;}k = L->element[curr].next;*x = L->element[k].data;// 记下被删除的元素值L->element[curr].next = L->element[k].next;// 删除L->element[k].next = L->available;L->available = k;L->element[0].data--;// 表长减1return TRUE;
}
相关文章:
Day27-【13003】短文,线性表两种基本实现方式空间效率、时间效率比较?兼顾优点的静态链表是什么?如何融入空闲单元链表来解决问题?
文章目录 本次内容总览第四节,两种基本实现方式概览两种基本实现方式的比较元素个数n大于多少时,使用顺序表存储的空间效率才会更高?时间效率比较?*、访问操作,也就是读运算,读操作1、插入,2、删…...
Scrapy如何设置iP,并实现IP重用, IP代理池重用
前置知识 1/3乐观锁 2/3 Scrapy流程(非全部) 3/3 关于付费代理 我用的"快代理", 1000个ip, 每个ip1min的有效期, 你用的时候, 把你的链接, 用户名填上去就行 设置代理IP 🔒 & 帮助文档: ①meta ②meta#proxy$ 语法: ①proxy的设置: Request对象中…...
动手学图神经网络(4):利用图神经网络进行图分类
利用图神经网络进行图分类:从理论到实践 引言 在之前的学习中,大家了解了如何使用图神经网络(GNNs)进行节点分类。本次教程将深入探讨如何运用 GNNs 解决图分类问题。图分类是指在给定一个图数据集的情况下,根据图的一些结构属性对整个图进行分类,而不是对图中的节点进…...
C++游戏开发深度解析
引言 在本篇文章中,我们将深入探讨C在游戏开发中的应用,包括内存管理、面向对象编程(OOP)、模板使用等,并通过实际代码示例来帮助理解。 内存管理与智能指针 cpp 深色版本 #include <iostream> #include <…...
ultralytics 是什么?
ultralytics 是一个用于计算机视觉任务的 Python 库,专注于提供高效、易用的目标检测、实例分割和图像分类工具。它最著名的功能是实现 YOLO(You Only Look Once) 系列模型,特别是最新的 YOLOv8。 1. YOLO 是什么? YO…...
【从零到一,C++项目实战】CineShare++(基于C++的视频点播系统)
🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…...
kaggle-ISIC 2024 - 使用 3D-TBP 检测皮肤癌-学习笔记
问题描述: 通过从 3D 全身照片 (TBP) 中裁剪出单个病变来识别经组织学确诊的皮肤癌病例 数据集描述: 图像临床文本信息 评价指标: pAUC,用于保证敏感性高于指定阈值下的AUC 主流方法分析(文本) 基于CatBoo…...
C语言深入解析 printf的底层源码实现
深入解析 printf 的底层源码实现 printf 是 C 标准库中最常用的函数之一,用于格式化输出字符串。它的底层实现复杂且高效,包含多个模块化的函数和机制。本文结合 GNU C Library(glibc)的源码,详细分析 printf 的实现原…...
IPhone14 Pro 设备详情
目录 产品宣传图内部图——后设备详细信息 产品宣传图 内部图——后 设备详细信息 信息收集于HubWeb.cn...
vim多文件操作如何同屏开多个文件
[rootxxx ~]# vimdiff aa.txt bb.txt cc.txt #带颜色比较的纵向排列打开的同屏多文件操作 示例: [rootxxx ~]# vimdiff -o aa.txt bb.txt cc.txt #带颜色比较的横向排列打开的同屏多文件操作 示例: [rootxxx ~]# vim -O aa.txt bb.txt c…...
18款炫酷烟花合集
系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码:Python动漫烟花(完整代码)-CSDN博客 Python烟…...
服务器虚拟化技术详解与实战:架构、部署与优化
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 在现代 IT 基础架构中,服务器虚拟化已成为提高资源利用率、降低运维成本、提升系统灵活性的重要手段。通过服务…...
01.双Android容器解决方案
目录 写在前面 一,容器 1.1 容器的原理 1.1.1 Namespace 1.1.2 Cgroups(Control Groups) 1.1.3 联合文件系统(Union File System) 1.2 容器的应用 1.2.1 微服务架构 1.2.2 持续集成和持续部署(CI/C…...
C++封装红黑树实现mymap和myset和模拟实现详解
文章目录 map和set的封装map和set的底层 map和set的模拟实现insertiterator实现的思路operatoroperator- - map和set的封装 介绍map和set的底层实现 map和set的底层 一份模版实例化出key的rb_tree和pair<k,v>的rb_tree rb_tree的Key和Value不是我们之前传统意义上的key/…...
嵌入式知识点总结 Linux驱动 (一)-指令-常用Linux指令 GCC指令 GDB调试指令 驱动开发指令
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.怎么查看当前进程?怎么执行退出?怎么查看当前路径? 2.ls命令执行有什么功能?可以带哪些参数? 3.创建目录用什么命令…...
数字化创新者如何利用开源2+1链动模式AI智能名片S2B2C商城小程序源码重塑市场地位
摘要:在数字化转型的浪潮中,数字化创新者正通过整合前沿技术,重塑行业格局,引领市场变革。本文深入探讨了开源21链动模式、AI智能名片以及S2B2C商城小程序源码等技术在数字化创新中的应用,旨在揭示这些技术如何助力企业…...
以用户为中心,优化 B 端界面设计
在数字化转型的进程中,B 端产品已成为企业高效运营的关键支撑,而 B 端界面设计则是决定其成败的核心要素。以用户为中心优化 B 端界面,不仅能提升员工操作体验,还能为企业运营注入强大动力。 以用户为中心,意味着深入洞…...
微服务学习-服务调用组件 OpenFeign 实战
1. OpenFeign 接口方法编写规范 1.1. 在编写 OpenFeign 接口方法时,需要遵循以下规范 1.1.1.1. 接口中的方法必须使用 RequestMapping、GetMapping、PostMapping 等注解声明 HTTP 请求的类型。 1.1.1.2. 方法的参数可以使用 RequestParam、RequestHeader、PathVa…...
使用国内镜像加速器解决 Docker Hub 拉取镜像慢或被屏蔽的问题
一、问题背景 Docker Hub 是 Docker 默认的镜像仓库,但由于网络限制,国内用户直接拉取镜像可能面临以下问题: 下载速度极慢(尤其是大镜像)。连接超时或完全被屏蔽(部分网络环境)。依赖国外源的…...
反向代理模块。。
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
《十七》浏览器基础
浏览器:是安装在电脑里面的一个软件,能够将页面内容渲染出来呈现给用户查看,并让用户与网页进行交互。 常见的主流浏览器: 常见的主流浏览器有:Chrome、Safari、Firefox、Opera、Edge 等。 输入 URL,浏览…...
飞致云开源社区月度动态报告(2025年1月)
自2023年6月起,中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》,旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况,以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…...
【PyQt5】数据库连接失败: Driver not loaded Driver not loaded
报错内容如下: 可以看到目前所支持的数据库驱动仅有[‘QSQLITE’, ‘QMARIADB’, ‘QODBC’, ‘QODBC3’, ‘QPSQL’, ‘QPSQL7’] 我在网上查找半天解决方法未果,其中有一篇看评论反馈是可以使用的,但是PyQt5的版本有点低,5.12…...
Linux之内存管理前世今生(一)
一个程序(如王者荣耀)平常是存储在硬盘上的,运行时才把这个程序载入内存,CPU才能执行。 问题: 这个程序载入内存的哪个位置呢?载入内核所在的空间吗?系统直接挂了。 一、虚拟内存 1.1 内存分…...
【cran Archive R包的安装方式】
cran Archive R包的安装方式 添加链接描述 1.包被cran移除 2.包要求的R语言版本与你电脑上的版本不相符 ad archive包的网址或者是下载到工作目录下,ad等于文件名 install,packages(ad repos NULL)...
Python中容器类型的数据(上)
若我们想将多个数据打包并且统一管理,应该怎么办? Python内置的数据类型如序列(列表、元组等)、集合和字典等可以容纳多项数据,我们称它们为容器类型的数据。 序列 序列 (sequence) 是一种可迭代的、元素有序的容器类型的数据。 序列包括列表 (list)…...
2025美赛美国大学生数学建模竞赛A题完整思路分析论文(43页)(含模型、可运行代码和运行结果)
2025美国大学生数学建模竞赛A题完整思路分析论文 目录 摘要 一、问题重述 二、 问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码(仅供参考) 4.1.4问题1样例代码运行结果&…...
OneDrive同步桌面 实现文件备份
Target 将笔记本桌面与OneDrive同步,当Desktop的文件发生变动时,自动更新到OneDrive。 取消旧的OneDrive账号与本机的关联 点击logo,弹出界面,点击设置。 随后打开OneDrive界面,点击“同步与备份”,“备…...
14.模型,纹理,着色器
模型、纹理和着色器是计算机图形学中的三个核心概念,用通俗易懂的方式来解释: 1. 模型:3D物体的骨架 通俗解释: 模型就像3D物体的骨架,定义了物体的形状和结构。 比如,一个房子的模型包括墙、屋顶、窗户等…...
用C++编写一个2048的小游戏
以下是一个简单的2048游戏的实现。这个实现使用了控制台输入和输出,适合在终端或命令行环境中运行。 2048游戏的实现 1.游戏逻辑 2048游戏的核心逻辑包括: • 初始化一个4x4的网格。 • 随机生成2或4。 • 处理玩家的移动操作(上、下、左、…...
python -m pip和pip的主要区别
python -m pip和pip的主要区别在于它们与Python环境的关联方式和安装路径。 与Python环境的关联方式: pip 是直接使用命令行工具来安装Python包,不指定特定的Python解释器。如果系统中存在多个Python版本,可能会导致安装的包被安装到…...
linux监控脚本+自动触发邮件发送
linux脚本 需求: CPU 负载:使用 uptime 命令,我们可以清楚地了解系统的 CPU 负载情况。这个命令会显示系统在过去 1 分钟、5 分钟和 15 分钟的平均负载。高负载可能意味着系统正在处理大量的任务,可能会导致性能下降或服务响应延迟…...
Mybaties缓存机制
Mybatis缓存机制 在 MyBatis 中,缓存机制是用来提高查询效率的一种方式。MyBatis 提供了两种内置的缓存机制:一级缓存和二级缓存。 1. 一级缓存(Local Cache) 一级缓存是基于 SqlSession 的。当你在同一个 SqlSession 中执行相…...
面试题-Java集合框架
前言 Java集合框架(Java Collections Framework)是Java平台提供的一套用于表示和操作集合的统一架构。它位于java.util包中,并且自Java 1.2(也称为Java 2平台,标准版,即Java SE 2)起成为Java平…...
半波整流和全波整流电路汇总及电路仿真
0 前言 0.1 引言 整流电路是将交流电(AC)转换为直流电(DC)的电路,广泛应用于电源设计、信号处理和电力电子等领域。整流电路的基本功能是将交流电的正半周或负半周转换为直流电,从而为电子设备提供稳定的直流电源。本文将详细介绍半波整流和全波整流电路的工作原理、电…...
04-机器学习-网页数据抓取
网络爬取(Web Scraping)深度指南 1. 网络爬取全流程设计 一个完整的网络爬取项目通常包含以下步骤: 目标分析: 明确需求:需要哪些数据(如商品价格、评论、图片)?网站结构分析&…...
豆包MarsCode:前缀和计算问题
问题描述 思路分析 问题理解 小S的任务是计算一个整数数组 nums 的前缀和。前缀和是指从数组开始到某个位置的所有元素的累加值,形成一个新数组。例如: 输入数组:nums [4, 5, 1, 6]前缀和数组:[4, 9, 10, 16] 4 49 4 510 …...
MySQL中InnoDB逻辑存储结构
在MySQL中,InnoDB是最常用的存储引擎之一,它具有高度的事务支持、行级锁、ACID特性以及自动崩溃恢复等特性。InnoDB的逻辑存储结构可以分为多个层次,下面是详细的解析。 1. 表空间 (Tablespace) InnoDB的物理存储结构以表空间为基础。表空间…...
如何提高新产品研发效率
优化研发流程、采用先进工具、提升团队协作、持续学习与改进,是提高新产品研发效率的关键。其中,优化研发流程尤为重要。通过简化流程,减少不必要的环节和复杂性,企业可以显著提升研发效率。例如,采用自动化测试工具和…...
可扩展架构:如何打造一个善变的柔性系统?
系统的构成:模块 + 关系 我们天天和系统打交道,但你有没想过系统到底是什么?在我看来,系统内部是有明确结构 的,它可以简化表达为: 系统 = 模块 + 关系 在这里,模块是系统的基本组成部分,它泛指子系统、应用、服务或功能模块。关系指模块 之间的依赖关系,简单…...
使用大语言模型在表格化网络安全数据中进行高效异常检测
论文链接 Efficient anomaly detection in tabular cybersecurity data using large language models 论文主要内容 这篇论文介绍了一种基于大型语言模型(LLMs)的创新方法,用于表格网络安全数据中的异常检测,称为“基于引导式提…...
BUUCTF 蜘蛛侠呀 1
BUUCTF:https://buuoj.cn/challenges 文章目录 题目描述:密文:解题思路:flag: 相关阅读 CTF Wiki Hello CTF NewStar CTF buuctf-蜘蛛侠呀 BUUCTF:蜘蛛侠呀 MISC(时间隐写)蜘蛛侠呀 题目描述&am…...
eVTOL的航空电子设备漫谈
电动垂直起降(eVTOL),也统称为城市空中交通(UAM),是民用航空平台发展的新方向之一。随着它们在市场上成为现实,它们将对所使用的航空电子设备有其自身的要求.. eVTOL概念 eVTOL领域的发展才刚…...
SpringCloudAlibaba 服务保护 Sentinel 项目集成实践
目录 一、简介1.1、服务保护的基本概念1.1.1、服务限流/熔断1.1.2、服务降级1.1.3、服务的雪崩效应1.1.4、服务的隔离的机制 1.2、Sentinel的主要特性1.3、Sentinel整体架构1.4、Sentinel 与 Hystrix 对比 二、Sentinel控制台部署3.1、版本选择和适配3.2、本文使用各组件版本3.…...
【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置
【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置 【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置 文章目录 【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数…...
【问题】Qt c++ 界面 lineEdit、comboBox、tableWidget.... SIGSEGV错误
蛋疼的错误集锦----今日分错误: 在主界面或者对话框的构造函数中,准备对一些对象赋值初始化值时,报了以上错误。!!!! 一脸懵逼的,各种确认,因为是最基础的赋值想不到错在…...
Hugging Face 推出最小体积多模态模型,浏览器运行成为现实!
1. SmolVLM 模型家族简介 1.1 什么是 SmolVLM-256M 和 SmolVLM-500M,它们为何如此重要? 在人工智能的多模态模型领域,如何在有限的计算资源下实现强大性能一直是一个重要的挑战。SmolVLM-256M 和 SmolVLM-500M 是最近推出的两款视觉语言模型,它们不仅突破了传统“大模型”…...
30289_SC65XX功能机MMI开发笔记(ums9117)
建立窗口步骤: 引入图片资源 放入图片 然后跑make pprj new job8 可能会有bug,宏定义 还会有开关灯报错,看命令行注释掉 接着把ture改成false 然后命令行new一遍,编译一遍没报错后 把编译器的win文件删掉, 再跑一遍虚拟机命令行…...
提供ZYNQ,MPSOC,RFSOC生成BOOT.BIN的小工具
如图: 这里提供了三种.bif,三种批处理.bat文件,一个bootgen.exe可执行文件和这个批处理文件运行是需要的动态库文件。 我们先看一下.bat文件,以BOOT_RFSOC为例: del temp\boot.bin bootgen -image output_rfsoc.bif -arch zynqmp…...
滤波电路汇总
0、前言 1. 引言 滤波电路是电子系统中不可或缺的组成部分,其主要功能是选择性地通过或衰减特定频率范围内的信号。在现代电子技术中,滤波电路广泛应用于信号处理、通信系统、音频设备、电源设计等多个领域。通过滤波,可以去除信号中的噪声和干扰,提高信号的质量和稳定性…...