数据结构与算法——堆
堆
- 树
- 树的概念与结构
- 树的相关术语
- 树的表示
- 树形结构实际运用场景
- 二叉树
- 概念与结构
- 特殊的二叉树
- 满二叉树
- 完全二叉树
- 二叉树存储结构
- 顺序结构
- 链式结构
- 实现顺序结构二叉树
- 堆的概念与结构
- 堆的实现
- 向上调整算法(插入数据)
- 向下调整算法
- 堆的应用
- 堆排序(建堆)
- 向下调整
- 向上调整算法
- 建堆复杂度分析
- TOP-K问题
树
树的概念与结构
树是⼀种⾮线性的数据结构,它是由 n(n>=0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。
- 有⼀个特殊的结点,称为根结点,根结点没有前驱结点。
- 除根结点外,其余结点被分成 M(M>0) 个互不相交的集合 T1、T2、……、Tm ,其中每⼀个集合Ti(1 <= i <= m) ⼜是⼀棵结构与树类似的⼦树。每棵⼦树的根结点有且只有⼀个前驱,可以0个或多个后继。因此,树是递归定义的。
- ⼦树是不相交的。
- 除了根结点外,每个结点有且仅有⼀个⽗结点。
- ⼀棵N个结点的树有N-1条边。
树的相关术语
- ⽗结点/双亲结点:若⼀个结点含有⼦结点,则这个结点称为其⼦结点的⽗结点。
- ⼦结点/孩⼦结点:⼀个结点含有的⼦树的根结点称为该结点的⼦结点。
- 结点的度:⼀个结点有⼏个孩⼦,他的度就是多少。
- 树的度:⼀棵树中,最⼤的结点的度称为树的度。
- 叶⼦结点/终端结点:度为 0 的结点称为叶结点。
- 分⽀结点/⾮终端结点:度不为 0 的结点。
- 兄弟结点:具有相同⽗结点的结点互称为兄弟结点(亲兄弟)。
- 结点的层次:从根开始定义起,根为第 1 层,根的⼦结点为第 2 层,以此类推。
- 树的⾼度或深度:树中结点的最⼤层次。
- 结点的祖先:从根到该结点所经分⽀上的所有结点。
- 路径:⼀条从树中任意节点出发,沿⽗节点-⼦节点连接,达到任意节点的序列。
- ⼦孙:以某结点为根的⼦树中任⼀结点都称为该结点的⼦孙。
森林:由 m(m>0) 棵互不相交的树的集合称为森林;
树的表示
孩⼦兄弟表⽰法:
树结构相对线性表就⽐较复杂了,要存储表⽰起来就⽐较⿇烦了,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表⽰⽅式如:双亲表⽰法,孩⼦表⽰法、孩⼦双亲表⽰法以及孩⼦兄弟表⽰法等。我们这⾥就简单的了解其中最常⽤的孩⼦兄弟表⽰法
struct TreeNode
{ struct Node* child; // 左边开始的第⼀个孩⼦结点 struct Node* brother; // 指向其右边的下⼀个兄弟结点 int data; // 结点中的数据域
};
树形结构实际运用场景
⽂件系统是计算机存储和管理⽂件的⼀种⽅式,它利⽤树形结构来组织和管理⽂件和⽂件夹。在⽂件系统中,树结构被⼴泛应⽤,它通过⽗结点和⼦结点之间的关系来表⽰不同层级的⽂件和⽂件夹之间的关联。
二叉树
概念与结构
在树形结构中,我们最常用的就是⼆叉树,⼀棵⼆叉树是结点的⼀个有限集合,该集合由⼀个根结点加上两棵别称为左⼦树和右⼦树的⼆叉树组成或者为空。
从上图可以看出⼆叉树具备以下特点:
- ⼆叉树不存在度⼤于 2 的结点。
- ⼆叉树的⼦树有左右之分,次序不能颠倒,因此⼆叉树是有序树。
注意:对于任意的⼆叉树都是由以下⼏种情况复合⽽成的
特殊的二叉树
满二叉树
⼀个⼆叉树,如果每⼀个层的结点数都达到最⼤值,则这个⼆叉树就是满⼆叉树。也就是说,如果⼀个⼆叉树的层数为 K ,且结点总数是的k方-1,就是满二叉树。
完全二叉树
完全⼆叉树是效率很⾼的数据结构,完全⼆叉树是由满⼆叉树⽽引出来的。对于深度为 K 的(有K层),有 n 个结点的⼆叉树,当且仅当其每⼀个结点都与深度为K的满⼆叉树中编号从 1 ⾄ n 的结点⼀⼀对应时称之为完全⼆叉树。要注意的是满⼆叉树是⼀种特殊的完全⼆叉树。
二叉树存储结构
顺序结构
顺序结构存储就是使⽤数组来存储,⼀般使⽤数组只适合表⽰完全⼆叉树,因为不是完全⼆叉树会有空间的浪费,完全⼆叉树更适合使⽤顺序结构存储。
现实中我们通常把堆(⼀种⼆叉树)使⽤顺序结构的数组来存储,需要注意的是这⾥的堆和操作系统虚拟进程地址空间中的堆是两回事,⼀个是数据结构,⼀个是操作系统中管理内存的⼀块区域分段。
链式结构
⼆叉树的链式存储结构是指,⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。通常的⽅法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址。链式结构⼜分为⼆叉链和三叉链,当前我们学习中⼀般都是⼆叉链。后⾯课程学到⾼阶数据结构如红⿊树等会⽤到三叉链。
实现顺序结构二叉树
堆的概念与结构
堆具有以下性质
• 堆中某个结点的值总是不⼤于或不⼩于其⽗结点的值;
• 堆总是⼀棵完全⼆叉树。
⼆叉树性质
• 对于具有 n 个结点的完全⼆叉树,如果按照从上⾄下从左⾄右的数组顺序对所有结点从
0 开始编号,则对于序号为 i 的结点有:
- 若 i>0 , i 位置结点的双亲序号: (i-1)/2 ; i=0 , i 为根结点编号,⽆双亲结点
- 若 2i+1<n ,左孩⼦序号: 2i+1 , 2i+1>=n 否则⽆左孩⼦
- 若 2i+2<n ,右孩⼦序号: 2i+2 , 2i+2>=n 否则⽆右孩⼦
堆的实现
向上调整算法(插入数据)
将新数据插⼊到数组的尾上,再进⾏向上调整算法,直到满⾜堆。
• 先将元素插⼊到堆的末尾,即最后⼀个孩⼦之后。
• 插⼊之后如果堆的性质遭到破坏,将新插⼊结点顺着其双双亲往上调整到合适位置即可。
//交换数据
void swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}//向上调整算法 判断条件:小堆:child < parent 大堆:child > parent
void AdjustUp(HPDataType* arr, int child)
{int parent = (child - 1) / 2;while (child > 0) //child向上调整到祖先结点停止循环{if (arr[child] > arr[parent]) //判断条件:小堆:child < parent 大堆:child > parent{swap(&arr[child], &arr[parent]); child = parent; //向上调整,所以把子结点下标变成父结点下标parent = (child - 1) / 2;//向上找父结点}else {break;}}
}//堆的插入
void HPPush(HP* php, HPDataType x)
{assert(php);//判断空间是否足够if (php->capacity == php->size){int newcapacity = php->capacity == 0 ? 4 : 2 * php->capacity;HPDataType* tmp = (HPDataType*)realloc(php->arr, newcapacity*sizeof(HPDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}php->arr = tmp;php->capacity = newcapacity;}php->arr[php->size] = x;AdjustUp(php->arr,php->size);++php->size;
}
向下调整算法
删除堆是删除堆顶的数据,将堆顶的数据根最后⼀个数据⼀换,然后删除数组最后⼀个数据,再进⾏向下调整算法。
向下调整算法有⼀个前提:左右⼦树必须是⼀个堆,才能调整。
//判空
bool HPEmpty(HP* php)
{assert(php);return php->size == 0;
}
// 向下调整算法 小堆:parent > child arr[child] > arr[child + 1] 大堆:parent < child arr[child] < arr[child + 1]
void AdjustDown(HPDataType* arr, int parent, int n)
{int child = parent * 2 + 1; //左孩子while(child < n ) //n为最大结点个数,不能越界{ if (arr[child] < arr[child + 1] && child + 1 < n) //演示大堆,拿子孩子中大的能够和父亲比较,且确保有右孩子{child++; //左孩子小于右孩子,将child = child + 1,(大堆)大的和父亲比较}if (arr[child] > arr[parent]){swap(&arr[child], &arr[parent]); //大于父亲,因为是大堆,进行交换parent = child; //向下调整,所以将父结点变成子结点child = parent * 2 + 1; //再向下寻找子结点}else {break;}}
}
//出堆
void HPPop(HP* php)
{assert(!HPEmpty(php)); //检查堆是否有元素(非空堆)。swap(&php->arr[0], &php->arr[php->size - 1]); //交换最后一个子节点和祖先节点的值--php->size;//向下调整AdjustDown(php->arr, 0 , php->size);
}
堆的应用
堆排序(建堆)
堆顶一定是最值,大堆堆顶是最大值,小堆堆顶是最小值。
void tes02()
{HP hp;HPInit(&hp);HPPush(&hp, 56);HPPush(&hp, 10);HPPush(&hp, 15);HPPush(&hp, 30);HPPush(&hp, 70);HPPush(&hp, 25);HPPrint(&hp);while (!HPEmpty(&hp)) //如果堆不为空{int top = HPTop(&hp); //循环取堆顶元素printf("%d ", top); //打印HPPop(&hp);//出堆顶元素}HPDestroy(&hp);
}
此处大堆为例,如果堆不为空,循环取堆顶元素,然后打印,然后出堆(出堆会使根结点和最后一个结点值交换,然后删除最后一个结点,因为是大堆,运用向下调整法又找剩余数据中的最大值,直到所有的数据出堆),那这就是用用堆排序的方法吗?
这并不是堆排序,因为这需要我们自己去构建一个数据结构堆,实现需要运用堆的一般操作(初始化,销毁,入堆,出堆等等)。
答案:数组建堆,⾸尾交换,交换后的堆尾数据从堆中删掉,将堆顶数据向下调整选出次⼤的数据(让数组变成一个堆的结构)
向下调整
1. 建堆操作,向下调整
从最后一棵子树开始调整,然后调整parent--继续调整
//堆排序
void HPSort(int* arr, int n)
{//建堆,向下调整算法for (int i = (n - 1 - 1) / 2; i >= 0; i--) //初始值就是最后一棵子树,n-1为最后一个子结点,再减1除2就是其父结点也就最后一棵子树开始{AdjustDown(arr,i,n);}
}
2.将堆顶和最后一个数据交换位置,--size,向下调整堆,继续重复该过程
//堆排序
void HPSort(int* arr, int n)
{//建堆,向下调整算法for (int i = (n - 1 - 1) / 2; i >= 0; i--) //初始值就是最后一棵子树,n-1为最后一个子结点,再减1除2就是其父结点也就最后一棵子树开始{AdjustDown(arr,i,n);}//堆排序int end = n - 1; //最后位置一个结点while (end > 0){Swap(&arr[0], &arr[end]);AdjustDown(arr, 0, end);--end;}}
向上调整算法
//建堆,向上调整算法
for (int i = 0; i < n; i++)
{AdjustUp(arr,i);
}
总结:排升序:建大堆 排降序:建小堆
建堆复杂度分析
计算向上调整算法建堆时间复杂度
计算向下调整算法建堆时间复杂度
TOP-K问题
TOP-K问题:即求数据结合中前K个最⼤的元素或者最⼩的元素,⼀般情况下数据量都⽐较⼤。
⽐如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。
对于Top-K问题,能想到的最简单直接的⽅式就是排序,但是:如果数据量⾮常⼤,排序就不太可取了
(可能数据都不能⼀下⼦全部加载到内存中)。最佳的⽅式就是⽤堆来解决,基本思路如下:
- 1)⽤数据集合中前K个元素来建堆
前k个最⼤的元素,则建⼩堆(小堆头结点最小),比堆顶数据大就入堆。
前k个最⼩的元素,则建⼤堆(大堆头结点最大),比堆顶数据小就入堆。 - 2)⽤剩余的N-K个元素依次与堆顶元素来⽐较,不满⾜则替换堆顶元素
将剩余N-K个元素依次与堆顶元素⽐完之后,堆中剩余的K个元素就是所求的前K个最⼩或者最⼤的元
素
先创建数据
void CreateNDate()
{// 造数据int n = 100000;srand(time(0));const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen error");return;}for (int i = 0; i < n; ++i){int x = (rand() + i) % 1000000;fprintf(fin, "%d\n", x);}fclose(fin);
}
-
fprintf(fin, "%d\n", x);
:fprintf
是C语言中的一个函数,用于将格式化的数据写入文件。fin
是文件指针,指向要写入的文件。"%d\n"
是格式字符串,表示以十进制整数格式写入数据,后面跟一个换行符。x
是要写入的整数值。
-
fclose(fin);
:fclose
是C语言中用于关闭文件的函数。fin
是要关闭的文件指针。- 使用完文件后必须关闭,以确保所有数据都写入磁盘并释放系统资源。
-
(rand() + i) % 1000000
:rand()
是C语言的随机数生成函数,返回一个伪随机整数。+ i
将循环计数器加到随机数上,增加随机性(避免连续调用rand()产生的相关性)。% 1000000
是取模运算,确保结果在0到999999之间(生成六位数以内的随机数)。
这个函数的作用是生成100,000个随机整数(每个在0-999,999之间),每行一个,写入到"data.txt"文件中。
void TopK()
{int k = 0;printf("请输入K:");scanf_s("%d", &k);const char* file = "data.txt";FILE* fout = fopen(file,"r");if (fout == NULL){perror("fopen fail!");exit(1);}//找最大的前K个数据,建小堆int* minHeap = (int*)malloc(sizeof(int) * k);if (minHeap == NULL){perror("malloc fail!");exit(2);}for (int i = 0; i < k; i++){fscanf_s(fout, "%d",&minHeap[i]);//保存到申请的数组空间}//minHeap目前并不是堆结构 所以向下调整建堆(时间复杂度更小)for (int i = (k - 1 - 1) / 2; i >= 0; i--){AdjustDown(minHeap,i,k);}//建堆后,遍历剩下的n-k个数据,与堆顶进行比较,大于堆顶元素则替换int x = 0;//将剩下的数据保存到x里面while (fscanf_s(fout, "%d", &x) != EOF){//x与堆顶数据比较if (x > minHeap[0]){minHeap[0] = x;//但是此时不是有效堆结构AdjustDown(minHeap, 0, k);}}for (int i = 0; i < k; i++){printf("%d ", minHeap[i]);}fclose(fout);
}int main()
{TopK();return 0;
}
时间复杂度:O(n) = k + (n − k)log2k
相关文章:
数据结构与算法——堆
堆 树树的概念与结构树的相关术语树的表示树形结构实际运用场景 二叉树概念与结构特殊的二叉树满二叉树完全二叉树 二叉树存储结构顺序结构链式结构 实现顺序结构二叉树堆的概念与结构堆的实现向上调整算法(插入数据)向下调整算法 堆的应用堆排序(建堆)向…...
【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化
目录 前言 一、空间检索简介 1、空间表结构 2、四至空间检索 二、前后端实现 1、后端实现 2、前端集成 三、成果展示 1、东部省份 2、西部省份 3、南部省份 4、北部省份 5、中部省份 四、总结 前言 在当今数字化时代,地理信息数据的分析与可视化对于众…...
AI驱动新增长:亚马逊Rufus广告点击率提升300%的奥秘
在生成式人工智能迅速融入商业应用的背景下,全球跨境电商巨头亚马逊(Amazon)正以前所未有的速度重构其广告生态。2024年第一季度,据亚马逊官方披露,通过部署内部开发的AI购物助手“Rufus”,其平台部分广告点…...
osgEarth中视角由跟随模式切换到漫游模式后没有鼠标拖拽功能问题分析及解决方法
遇到了一个棘手的问题,就是在由跟随模式切换到漫游模式的时候,鼠标无法实现拖拽功能。后来发现是前面给自己挖的坑。 因为要实现鼠标点选某个模型后,模型需要变红色显示,所以添加了一个事件处理程序。 // 创建 场景中模型的点选功能 事件处理程序 ModelSelectionHandler* …...
网页 HTML布局(详解)
本篇讲的是:构成网页的三要素中的HTML HTML的基本结构标签: html标签:网页的整体 head标签:网页的头部 body标签:网页的身体 title标签:网页的标题 一般我们新建一个HTML就会带有这些基本的标签:…...
为什么可以不重写m1方法
在 Java 中,当一个类继承另一个类并同时实现接口时,如果接口中的方法签名与父类中的方法签名完全相同(包括方法名、参数列表和返回类型),那么父类的方法会自动满足接口的实现要求,子类无需显式重写该方法。…...
深入解析应用程序分层及 BaseDao 的封装策略
目录 1. 应用程序分层 1.1. 应用程序分层简介 1.1.1. 三层结构 1.1.2. 分层的优点 1.1.3. 分层命名 1.2. 应用程序分层实现 1.3. 在分层项目中实现查询业务 2. 封装通用的BaseDao 2.1. 封装通用的DML操作 2.2. 封装通用的查询操作 3. 总结 前言 本文讲解JDBC中的应用…...
物理机做完bond后network服务重启失败
问题描述: 物理机通过systemctl status network.service查看网络服务情况,服务状态为failed,报错:Failed to start LSB: Bring up/down netw 问题分析: 1、network服务于NetworkManager服务冲突 2、未使用的网卡没…...
AGI大模型(30):LangChain链的基本使用
为开发更复杂的应用程序,需要使用Chain来链接LangChain中的各个组件和功能,包括模型之间的链接以及模型与其他组件之间的链接。 链在内部把一系列的功能进行封装,而链的外部则又可以组合串联。 链其实可以被视为LangChain中的一种基本功能单元。 API地址:https://python.…...
什么导致ERP系统中BOM表频繁出错?关键因素与解决路径
企业引入 ERP 系统后,常因 BOM(物料清单)维护不规范导致计划混乱、成本失控等问题。部分工厂依赖手工录入 BOM 数据,存在版本管理缺失、替代物料未标注等现象,使得 MRP 计划出错率高,生产效率与质量双降。解…...
(vue)前端实现下载后端提供的URL文件
(vue)前端实现下载后端提供的URL文件 动态创建: function downloadFile(url, filename) {const a document.createElement(a)a.href urla.download filename || download // 设置下载文件名document.body.appendChild(a)a.click()document.body.removeChild(a) …...
Axure通过下拉框选项改变,控制字段显隐藏
要求:要求选择钢铁行业时,字段1显示,字段2、字段3隐藏,选择水泥行业时,字段2显示,字段1、字段3隐藏,选择发电行业时,字段3显示,字段1、字段2隐藏。 1、首先Axure拖入一个…...
Axure应用交互设计:动态面板嵌套实现超强体验感菜单表头
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:动态面板嵌套 主要内容:利用动态面板多层嵌套实现菜单表头 应用场景:广泛应用于表单表…...
CICD遇到npm error code EINTEGRITY的问题
场景 CICD编译时抛出npm error code EINTEGRITY的错误 npm error code EINTEGRITY npm error sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA integrity checksum failed when using sha512: wanted sha512-PlhdFcillOINfeV…...
C# AI(Trae工具+claude3.5-sonnet) 写前后端
这是一个AI 写的前后端分离项目,通过AI编程,开发电商管理系统(登陆、注册) 使用的AI工具为 Trae工具(字节国际版)claude3.5-sonnet(目前代码最强模型) 前端为 vue3Bootstrap 后端为 C# net5.0(因为我电脑里面已经安装了这个新版更好) do…...
leetcode 25. Reverse Nodes in k-Group
25. Reverse Nodes in k-Group 递归法: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, L…...
PHP伪随机数
在我们现实生活中由于一些物理原因产生的随机数才是真正的随机数,比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等。而对于计算机来说,真正的随机数是不存在的,因为无法通过电信号来实现上面提到的物理过程,对于计算机来…...
vue3 threejs 物体发光描边
threejs官网案例: three.js examples 我的代码(标注了重点代码,加上即可) <template><div class"greenhouse" ref"canvasContainerRef"></div></template><script setup> im…...
java的synchronized 原理及功能
简介: Java中的synchronized关键字是一种同步机制,用于控制多个线程对共享资源的访问。 原理: 在Java锁有一个内部锁 Intrinsic Lock,也称为监视器锁或管程锁,每个Java对象都有一个关联的监视器锁,隐式锁…...
【Leetcode 每日一题】3356. 零数组变换 II
问题背景 给你一个长度为 n n n 的整数数组 n u m s nums nums 和一个二维数组 q u e r i e s queries queries,其中 q u e r i e s [ i ] [ l i , r i , v a l i ] queries[i] [l_i, r_i, val_i] queries[i][li,ri,vali]。 每个 q u e r i e s [ i ]…...
LangChain入门和应用#1
LangChain 是一个全方位的、基于大语言模型这种预测能力的应用开发工具,它的灵活性和模块化特性使得处理语言模型变得极其简便。不论你在何时何地,都能利用它流畅地调用语言模型,并基于语言模型的“预测”或者说“推理”能力开发新的应用 La…...
[每日一题] 3356. 零数组变换ii
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 3356. 零数组变换 II - 力扣(LeetCode) 2. 题目描述 给你一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] [li, ri, va…...
Docker网关冲突导致容器启动网络异常解决方案
一、故障现象 执行docker-compose up命令时服务器网络中断控制台显示"Creating network xxxxxxx with the default driver"通过ifconfig可见docker0网卡docker network ls显示新创建的网络接口 二、根本原因 Docker服务默认创建docker0虚拟网卡(默认地…...
基于stm32的空气质量监测系统
目录 摘 要 Abstract 目 录 第 1 章 绪论 第 2 章 空气质量监测系统总体方案设计 第3章 硬件的部分介绍 3.1 硬件系统的的原理方框图 3.2 硬件系统的的原理图 3.3 温湿度传感器 3.4 甲醛传感器 3.5 报警提醒模块及其他 3.6 系统工作原理 3.7 本章小结 第四章 方案…...
Leetcode-3 判断根结点是否等于子结点之和
Leetcode-3 判断根结点是否等于子结点之和(简单) 题目描述思路分析通过代码(python) 题目描述 **给你一个 二叉树 的根结点 root,该二叉树由恰好 3 个结点组成:根结点、左子结点和右子结点。 如果根结点值…...
《算法笔记》12.1小节——字符串专题->字符串hash进阶 问题 A: 求最长公共子串(串)
题目描述 求采用顺序结构存储的串s和串t的一个最长公共子串,若没有则输出false,若最长的有多个则输出最先出现的那一串。 输入 输入两个字符串 输出 输出公共子串 样例输入 abcdef adbcef 样例输出 bc 分析:用字符串哈希解决。检查…...
为何天线的长度设计为频率波长的四分之一?
目录 1. 电磁波的波长与频率关系 2. 四分之一波长天线的工作原理 3. 为什么选择 λ/4 而不是其他长度? 4. 实际应用中的例子 5. 总结 为何天线的长度设计为频率波长的四分之一? 天线的长度设置为频率波长的四分之一主要是基于电磁波的传播特性以及天线的…...
端口号详解(技术向)
端口号详解(技术向) 一、核心定义 **端口号(Port Number)**是 传输层协议(TCP/UDP) 的逻辑标识,用于在同一设备上区分不同应用程序的网络通信入口。端口号是用两个字节(无符号&…...
git合并多次commit提交
首先查看历史记录 git log 查看你想要合并的commit是哪些(注意:这里是逆序,最上的是最新提交) 找到当前想要合并的最后一个记录,复制该记录的下一个记录的 id(黄色部分commit id),…...
深入浅出Java-Lambda表达式
深入浅出Java-Lambda表达式 一、Lambda 表达式特征二、Lambda 表达式的基础语法与结构2.1 基本语法格式2.2 语法简化规则2.3 与匿名内部类的对比 三、函数式接口:Lambda 表达式的载体3.1 函数式接口的定义3.2 常用函数式接口分类3.2.1 消费型接口(Consum…...
FreeCAD傻瓜教程-外螺纹的绘制,利用两个实体进行布尔运算来实现
起因:因为要设计一个波珠螺丝固定器,为了不跑偏,需要在螺柱上加工一个直径6mm,深度1.2mm的圆弧凹槽所以想用泉州制造的6.8车铣加工。 但是该加工目前不支持轴向的钻孔,所以想着干脆在两端加上M8的螺栓,也起…...
java并发-线程池
文章目录 线程池定义组成工作参数设置种类关闭 线程池 定义 线程池就是提前创建好一批线程,反复复用处理任务,避免频繁创建销毁线程,同时控制线程数量,让系统更高效、稳定。 举个例子: 场景假设: 你开了…...
openlayer:06点击按钮实现地图动画移动
如何实现点击去辽宁按钮实现用动画效果将地图顺滑的切换到辽宁区域,点击回北京按钮后同样将地图使用动画效果移动回到辽宁。 本文介绍了如何通过OpenLayers库实现地图在北京市和辽宁省之间的平滑切换动画。首先,使用View类设置地图的初始中心点为北京市…...
使用 Matter.js 创建封闭箱体与里面的小球
下面是一个使用 Matter.js 创建的示例,包含一个地面、由4个长方形组成的封闭箱体,箱体内有10个不同颜色的小球。箱体可以被拖动,而小球被限制在箱体内部。 <!DOCTYPE html> <html> <head><title>Matter.js 可拖动箱体与小球</title><styl…...
自动化软件如何确保高可用性和容错性?
在数字化转型的浪潮中,RPA(机器人流程自动化)技术成为众多企业和机构实现业务流程优化的得力助手。以金智维为例,作为 RPA 领域的佼佼者,其技术在金融、政务等行业广泛应用,承担着大量关键业务流程的自动化…...
变电站综合自动化系统
系统介绍 a安科瑞 18702112163 变电站综合自动化系统为企业变电站提供了完整的SCADA功能,包括主接线图、设备工况、实时数据显示、定值管理、SOE报警/记录/查询/打印、棒图、实时/历史曲线、语音报警、历史信息查询、用户权限管理、各种运行数据统计分析报表等。系…...
【2025.05】Anaconda新手安装+配置+环境创建教程
本文目录 一、安装前述二、下载与安装1、下载2、选择安装类型3、选择安装路径: 三、设置环境1、添加conda目录到path2、修改envs\pgks默认目录第一种:修改.condarc文件第二种:使用conda config命令 四、修改镜像源五、常用命令(27…...
React-改变当前页class默认的样式
比如antd for mobile,已经定义了默认的ui的class样式,如果想在当前页面的控件显示特殊的样式,除了指定style外,还可以强制改变默认class的样式,比如我想改变list.item的字体。 在返回渲染布局里面加上 return (<&…...
腾讯游戏安全与高通合作构建PC端游安全新格局
导语:5月16日,2025游戏安全行业峰会在深圳举行,腾讯游戏安全ACE与高通(中国)在峰会上就腾讯游戏安全方案正式宣布达成行业生态合作。双方将依托高通技术公司专门面向AI PC打造的骁龙X系列平台,共同为《无畏…...
Token类型与用途详解:数字身份的安全载体图谱
在现代数字身份体系中,Token如同"数字DNA",以不同形态流转于各类应用场景。根据Okta的最新研究报告,平均每个企业应用使用2.7种不同类型的Token实现身份验证和授权。本文将系统梳理主流Token类型及其应用场景,通过行业典…...
【Linux基础I/O】文件调用接口、文件描述符、重定向和缓冲区
【Linux基础I/O一】文件描述符和重定向 1.C语言的文件调用接口2.操作系统的文件调用接口2.1open接口2.2close接口2.3write接口2.4read接口 3.文件描述符fd的本质4.标准输入、输出、错误5.重定向5.1什么是重定向5.2输入重定向和输出重定向5.3系统调用的重定向dup2 6.缓冲区 1.C语…...
软考中级软件设计师——操作系统考试题型
一、PV操作与进程同步(必考大题) 1. 真题示例(2020年真题) 题目: 三个进程P1、P2、P3共享一个缓冲区,P1生产数据放入缓冲区,P2和P3消费数据。要求: 缓冲区大小为10,满时…...
transformer归一化层优化:深度解读 RMSNorm (Root Mean Square Layer Normalization,均方根层归一化)
导读:RMSNorm 把传统 LayerNorm 的“减均值(centering) 除标准差(scaling)”简化为“直接除以向量均方根 (Root Mean Square, RMS,均方根)”。这一改动让归一化既 更省算 又 同样稳定,因而成为 …...
java基础 之 Hash家族(一)
文章目录 HashCode定义代码使用使用场景 HashMap定义常用方法使用场景 ConcurrentHashMap定义常用方法使用场景 HashTable定义常用方法使用场景 HashSet定义常用方法使用场景你想到过吗? HashMap、ConcurrentHashMap、HashTable的对比总结 HashCode 定义 hashcode是…...
windows服务器部署jenkins工具(二)
jenkins的大致流程:新增任务->配置任务->构建(打包)项目->部署(发布) 具体如何使用,我这里就不多讲了。这次就给大家讲讲,jenkins安装之后使用过程中存在的一些问题。 1.maven项目如…...
机器学习第二十讲:网格搜索 → 像尝试所有密码组合找最佳解锁方式
机器学习第二十讲:网格搜索 → 像尝试所有密码组合找最佳解锁方式 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细手把手指南 网…...
【人工智能发展史】从黎明到曙光01
人工智能的史诗:从黎明到曙光 序曲:晨曦微露 故事的序幕拉开于一个思想激荡的年代,1956年,达特茅斯会议的钟声,如同第一缕晨曦,宣告了"人工智能"纪元的到来。那个夏天,在新罕布什尔…...
ollama使用gpu运行大模型
罗列ollma镜像 ollama list拉取ollama镜像源里面的模型: ollama pull qwen2:1.5b下载CudaToolkit https://developer.nvidia.com/cuda-toolkit-archive 我这里选择11.7的万金油版本,从来没出过bug Ollama安装好后,为了让推理跑在GPU上&am…...
Linux电源管理——PSCI初始化流程和多核启动流程
目录 一、PSCI 初始化流程 1、PSCI设备树节点 2、PSCI kernel初始化流程 get_set_conduit_method set_conduit psci_probe 二、CPU PSCI 操作初始化流程 1、CPU 设备树节点 2、 struct cpu_operations 3、kernel 流程 cpu_read_bootcpu_ops smp_init_cpus 三、CPU…...
Linux问题排查-引起服务器带宽使用率高的内鬼
Linux网络流量监控与瓶颈分析全攻略:从基础命令到进程级方案 一、网络带宽查询与实时流量监控 1. 查询主机网络带宽 网卡理论带宽 通过ethtool命令查看网卡最大支持速率,例如: ethtool eth0 # 替换为实际网卡名(如ens33&#x…...