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

【学习笔记】数据结构(十一)

外部排序

文章目录

  • 外部排序
    • 11.1 外存信息的存取
    • 11.2 外部排序的方法
    • 11.3 多路平衡归并的实现 - 增加k
    • 11.4 置换-选择排序 - 减少m
    • 11.5 最佳归并树

外部排序 指的是大文件的排序,即待排序的记录存储在外存储器 上,在排序过程中需进行多次的内、外存之间的交换。

11.1 外存信息的存取

计算机一般有 两种存储器: 内存储器(主存)和外存储器(辅存)。

  • 内存的信息可随机存取,且存取速度快,但价格贵、容量小。

  • 外存储器包括磁带和磁盘(或磁鼓),前者为顺序存取的设备,后者为随机存取的设备。

1、磁带信息的存取

磁带是薄薄涂上一层磁性材料的一条窄带。

磁带不是连续运转的设备,而是一种启停设备(启停时间约为 5 毫秒),它可以根据读 /写的需要随时启动和停止。由千读/写信息应在旋转稳定时进行,而磁带从静止状态启 动后,要经过一个加速的过程才能达到稳定状态;反之,在读/写结束后,从运动状态到完 全停止,要经过一个减速的过程。因此,在磁带上相邻两组字符组(记录)之间要留一空白 区,叫做 间隙 IRG(lnter Record Gap)

在每次写信息时, 将若干个字符组合并成一块后一次写入磁带。 于是,每个字符组间就没有 IRG,而变成 块间的间隙 IBG(lnter Block Gap) , 从而可以减少IRG 的数目,提高磁带的利用率,块的长度大于 IBG 的长度。

在这里插入图片描述

成块还可减少I/O操作。 因为一次1/0操作可把整个物理块都读到内存缓冲区中. 然后再从缓冲区中取出所需要的信息(一个字符组)。每当要读一个字符组时,首先要查 缓冲区中是否已有,若有,则不必执行I/O操作,直接从缓冲区读取即可。

在磁带上 读写一块信息所需的时间 由两部分组成: TI/O = ta + n · tw

  • ta 为延迟时间,读/写头到达传输信息所在物理块起始位置所需时间;
  • tw 为传输一 个字符的时间。

缺点:

由于磁带是 顺序存取 的设备,则读/写信息之前先要进行顺序查找,并且当读/写头位于磁带尾端,而要读的信息在磁带始端时,尚需使磁带倒转运动。这是顺序存取设备的主要缺点,它使检索和修改信息很不方便。

2、磁盘信息的存取

磁盘是一种 直接存取 的存储设备(DASO)。它的容量大、速度快,存 取速度比磁带快得多。

磁盘可以是单片的,也可以由若干盘片组成盘组。每一片上有两个面。以 6 片盘组为例,由于最顶上和最低下盘片的外侧面不存信息,所以总共只有10个面可用来保存信 息。盘片装在一个主轴上,并绕主轴高速旋转,当磁道在读/写头下通过时,便可以进行信息的读/写。

把磁盘分为 固定头盘和活动头盘

  • 固定头盘的每 一道上都有独立的磁头,它是固定不动的,专负责读/写某一 道上的信息。
  • 活动头盘的磁头是可移动的。盘组也是可变的。一个 面上只有一个磁头,它可以从该面上的一道移动到另一道。 磁头装在一个动臂上,不同面上的磁头是同时移动的,并处 于同一圆柱面上。各个面上半径相同的磁道组成一个圆柱 面,圆柱面的个数就是盘片面上的磁道数。

在这里插入图片描述

在磁盘上标明一个具体信息必须用一个三维地址:柱面号、盘面号、块号

  • 柱面号确定读/写头的径向运动,
  • 块号确定信息在盘片圆圈上的位置。

在磁盘上读写一块信息步骤:

  • 首先必须找柱面,移动臂使磁头移 动到所需柱面上(称为定位或寻查);
  • 然后等待要访问的信息转到磁头之下;
  • 最后,读/写所需信息。

在磁盘上读写一块信息所需的时间 由 3 部分组成: TI/O = tseek + tla + twm

  • tseek 为寻查时间(seek time) , 即读/写头定位的时间;
  • tla 为等待时间(latency time), 即等待信息块的初始位置旋转到读写头下的时间;
  • twm 为传输时间(transmission time)

内外存之间的数据交换原理:

在这里插入图片描述

11.2 外部排序的方法

外部排序基本上由两个相对独立的阶段组成:

  • 按可用内存大小,将外存上含 n 个记录的文件分成若干长度为 l 的子文件或段(segment),依次读入内存并利用有效的内 部排序方法对它们进行排序,并将排序后得到的有序子文件重新写入外存,通常称这些有序子文件为归并段或顺串(run);
  • 对这些归并段进行逐趟归并,使归并段(有序的子文件)逐渐由小至大,直至得到整个有序文件为止

在这里插入图片描述

外部排序所需总的时间=内部排序(产生初始归并段)所需的时间(m * tIS) + 外存信息读写的时间(d * tIO) + 内部归并所需的时间(s * utmg

  • tIS:为得到一个初始归并段进行内部排序所需时间的均值;
  • m:为经过内部排序之后得到的初始归并段的个数I
  • tIO:是进行一次外存 读/写时间的均值;取决于所用的外存设备;
  • d:为总的读/写次数
  • utmg:对u 个记录进行内部归并所需时间;
  • s :为归并的趟数;

tIO 比 tmg大得多,所以提高外排的效率应主要 着眼于减少外存信息读写的次数d

假设在每个物理块可以容纳 200个记录,则每一趟归并需进行 50 次“读” 和 50 次“写"’

利用 2-路归并:4 趟 * 100 + 100 内部排序 = 500 次的读/写。

利用 5-路归并:2 趟 * 100 + 100 内部排序 = 300 次的读/写。

可见,对同一文件而言,进行外排时所需读/写外存的次数和归并的趟数 s成正比。

对m个初始归并段进行k-路平衡归并时,归并的趟数 s = ⌊ logkm ⌋ —— 可见,若增加 K 或减少m 便能减少s

若能增加初始归并段的长度则可减少初始归并段数量m

例子:

在这里插入图片描述

11.3 多路平衡归并的实现 - 增加k

每一趟从m个归并段得到 ⌈m/k⌉ 归并段。这种归并方法称为 k-路平衡归并

使用k路平衡归并策略,选出一个最小元素需要对比关键字(k-1)次,所以增加k会导致内部归并所需时间增加

eg:8路平衡归并,从公企归并段中选出一个最小元素需要对比关键字7次

在这里插入图片描述

“败者树"(Tree of Loser):可视为一棵完全二叉树)(根节点上多了一个结点)。k个叶结点分别是当前参加比较的元素,非叶子结点用来记忆左右子树中的“失败者”,而让胜者往上继续进行比较,一直到根结点。目的- 使k元素的关键字对比次数变少

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1  // 禁用 Visual Studio 的安全警告(例如 scanf 的安全问题)
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>// 定义状态码,用于表示函数执行的成功或失败
#define OK 1
#define OVERFLOW -2
#define ERROR -1// 栈的初始大小
#define STACK_INIT_SIZE 4// 定义归并段的数量
#define K 5// 定义最大键值和最小键值
#define MAXKEY INT_MAX  // 表示归并段结束的特殊键值
#define MINKEY INT_MIN  // 用于初始化败者树的虚拟键值// 定义状态类型
typedef int Status;// 定义栈的结构体
typedef struct {int* base;      // 栈的基地址(栈底)int* top;       // 栈顶指针int stacksize;  // 栈的当前容量
} SqStack;// 定义键值类型
typedef int KeyType;// 定义败者树,大小为 K
typedef int LoserTree[K];// 定义外部节点结构体
typedef struct {KeyType key;  // 外部节点的键值
} ExNode, External[K + 1];  // 外部节点数组,大小为 K + 1(用于败者树)/*** 初始化栈* @param S 栈的指针* @return 成功返回 OK,失败返回 OVERFLOW*/
Status InitStack(SqStack* S) {S->base = (int*)malloc(STACK_INIT_SIZE * sizeof(int));  // 分配栈的初始内存if (!S->base)exit(OVERFLOW);  // 内存分配失败,退出程序S->top = S->base;  // 初始化栈顶指针为栈底S->stacksize = STACK_INIT_SIZE;  // 初始化栈的容量return OK;  // 初始化成功
}/*** 向栈中压入元素* @param S 栈的指针* @param e 要压入的元素* @return 成功返回 OK,失败返回 OVERFLOW*/
Status Push(SqStack* S, int e) {// 如果栈已满,则需要扩容if (S->top - S->base >= S->stacksize) {int* new_base = (int*)realloc(S->base, (S->stacksize + STACK_INIT_SIZE) * sizeof(int));  // 重新分配内存if (!new_base) {return OVERFLOW;  // 内存分配失败,返回错误}S->base = new_base;  // 更新栈底指针S->stacksize += STACK_INIT_SIZE;  // 更新栈的容量}*S->top++ = e;  // 将元素压入栈顶,并移动栈顶指针return OK;  // 成功返回 OK
}/*** 从栈中弹出元素* @param S 栈的指针* @param e 用于存储弹出元素的变量* @return 成功返回 OK,失败返回 ERROR*/
Status Pop(SqStack* S, int* e) {if (S->top == S->base) {return ERROR;  // 如果栈为空,返回错误}*e = *(--S->top);  // 弹出栈顶元素,并移动栈顶指针return OK;  // 成功返回 OK
}/*** 调整败者树的某个节点* @param ls 败者树* @param b 外部节点数组* @param s 当前要调整的节点索引*/
void Adjust(LoserTree ls, External b, int s) {int t, tmp;// 计算当前节点的父节点索引t = (s + K) / 2;  // 公式:(s + K) / 2,用于找到父节点索引// 从当前节点向上调整到根节点while (t > 0) {// 如果当前节点的值大于父节点的值if (b[s].key > b[ls[t]].key) {tmp = s;  // 交换当前节点和父节点s = ls[t];ls[t] = tmp;}t = t / 2;  // 继续向上调整}ls[0] = s;  // 更新胜者节点(ls[0] 始终存储当前胜者)
}/*** 创建败者树* @param ls 败者树* @param b 外部节点数组*/
void CreateLoserTree(LoserTree ls, External b) {int i;// 初始化外部节点的虚拟节点(用于处理特殊情况)b[K].key = MINKEY;  // 第 K 个外部节点的键值设置为 MINKEY// 初始化败者树的叶子节点(归并段的索引)for (i = 0; i < K; i++) {ls[i] = K;  // 初始化败者树的叶子节点为虚拟节点}// 从最后一个叶子节点开始调整败者树for (i = K - 1; i >= 0; i--) {Adjust(ls, b, i);  // 调整败者树}
}/*** K 路归并* @param ls 败者树* @param b 外部节点数组* @param S 栈数组*/
void K_merge(LoserTree ls, External b, SqStack* S) {int i, q;// 从每个栈中弹出第一个元素作为初始值for (i = 0; i < K; i++) {Pop(&S[i], &b[i].key);  // 从第 i 个栈中弹出第一个元素}// 创建败者树CreateLoserTree(ls, b);// 当胜者节点的值不为 MAXKEY 时,继续归并while (b[ls[0]].key != MAXKEY) {q = ls[0];  // 获取当前胜者节点(ls[0] 始终存储胜者索引)printf("%d ", b[q].key);  // 输出胜者节点的值// 从胜者节点的栈中弹出下一个元素Pop(&S[q], &b[q].key);// 调整败者树Adjust(ls, b, q);}printf("\n");  // 输出换行符
}/*** 主函数*/
void main() {int i, j;int e;SqStack S[K];  // 每个归并段对应一个栈LoserTree ls;  // 败者树External b;  // 外部节点数组// 初始化每个归并段的栈for (i = 0; i < K; i++) {InitStack(&S[i]);  // 初始化第 i 个栈Push(&S[i], MAXKEY);  // 将 MAXKEY 压入栈底,表示归并结束// 输入 3 个元素for (j = 0; j < 3; j++) {printf("S[%d] push: ", i);scanf("%d", &e);  // 从标准输入读取一个整数Push(&S[i], e);  // 将读取的整数压入栈中}}// 执行 K 路归并K_merge(ls, b, S);
}

在这里插入图片描述

11.4 置换-选择排序 - 减少m

m是外部文件经过内部排序之后 得到的初始归并段的个数,

m = ⌈n/l⌉, 其中 n 为外部文件中的记录数,l 为初始归并段中的记录数

注意事项:

  • 当归并段为空时,选择工作区内最小数
  • 当归并段不为空时,选择工作区内【大于归并段最大值的-归并段最后一个值】最小数
  • 不能被放进归并段时,需重新创建一个归并段

在这里插入图片描述

11.5 最佳归并树

2路归并

在这里插入图片描述

多路归并

在这里插入图片描述

补充虚段

k路最佳归并树:

  • 一定是一棵严格的 k叉树
  • 只有度为0和度为k的结点

在这里插入图片描述

添加虚段的数量:

初始归并段数量 + 虚段数量 = n0 = 度为0的结点数

度为k的结点数 = nk

① 总结点数 = n = n0 + nk

② 叉的数量 = 分支结点 nk * 每个分支结点发出的分叉数 k = 除根节点外的其他结点都被一个分叉连着 n - 1 即 nk * k = n - 1

① 和 ② => n0 =(k-1)nk + 1 => nk = (n0 - 1) / (k - 1) 如果是“严格k叉树”一定能除得尽

① 若(初始归并段数量 -1) % (k-1)=0,说明刚好可以构成严格k叉树,此时不需要添加虚段

② 若(初始归并段数量 -1) % (k-1) = u ≠ 0,则需要添加虚段(k-1) - u个

在这里插入图片描述

例题:设外存上有120个初始归并段,进行12路归并时,为实现最佳归并,需要补充的虚段个数是()
A.1 B.2 C.3 D.4

(120 - 1)% (12 - 1) = 9; 则补充 (12 - 1) - 9 = 2

例题:已知三叉树T中6个叶结点的权分别是2,3,4,5,6,7,T的带权(外部)路径长度最小的是()
A.27 B.46 C.54 D.56

(6 - 1)% (3 - 1) = 1 ≠ 0; 需要补充的虚段个数是1;则变成【0,2,3,4,5,6,7】,WPLmin = (2+3)*3 + (4+5)*2 + (6+7)*1 = 15 + 18 + 13 = 46

0
2
3
4
5
6
7
5
14
27

参考:

教材:严蔚敏《数据结构》(C语言版).pdf

视频:

外部排序

败者树

置换选择排序

博客:

多路平衡归并败者树(Tree of Loser)算法

相关文章:

【学习笔记】数据结构(十一)

外部排序 文章目录 外部排序11.1 外存信息的存取11.2 外部排序的方法11.3 多路平衡归并的实现 - 增加k11.4 置换-选择排序 - 减少m11.5 最佳归并树 外部排序 指的是大文件的排序&#xff0c;即待排序的记录存储在外存储器 上&#xff0c;在排序过程中需进行多次的内、外存之间的…...

【Logstash03】企业级日志分析系统ELK之Logstash 过滤 Filter 插件

Logstash 过滤 Filter 插件 数据从源传输到存储库的过程中&#xff0c;Logstash 过滤器能够解析各个事件&#xff0c;识别已命名的字段以构建结构&#xff0c; 并将它们转换成通用格式&#xff0c;以便进行更强大的分析和实现商业价值。 Logstash 能够动态地转换和解析数据&a…...

深度学习模型部署——基于Onnx Runtime的深度学习模型CPU与GPU部署(C++实现)

1.概述 许多机器学习和深度学习模型都是在基于 Python 的框架中开发和训练的&#xff0c;例如 PyTorch 和 TensorFlow 等。但是&#xff0c;当需要将这些训练好模型部署到生产环境中时&#xff0c;通常会希望将模型集成到生产流程中&#xff0c;而这些流程大多是用 C 编写的&a…...

Selenium 的四种等待方式及使用场景

Selenium 的四种等待方式及使用场景 隐式等待&#xff08;Implicit Wait&#xff09;显式等待&#xff08;Explicit Wait&#xff09;自定义等待&#xff08;Custom Wait&#xff09;固定等待&#xff08;Sleep&#xff09; 1. 隐式等待 定义&#xff1a; 隐式等待是为 WebD…...

攻防世界 ics-07

点击之后发现有个项目管理能进&#xff0c;点进去&#xff0c;点击看到源码&#xff0c;如下三段 <?php session_start(); if (!isset($_GET[page])) { show_source(__FILE__); die(); } if (isset($_GET[page]) && $_GET[page] ! index.php) { include(flag.php);…...

一文读懂「LoRA」:大型语言模型的低秩适应

LoRA: Low-Rank Adaptation of Large Language Models 前言 LoRA作为大模型的微调框架十分实用&#xff0c;在LoRA出现以前本人都是通过手动修改参数、优化器或者层数来“炼丹”的&#xff0c;具有极大的盲目性&#xff0c;但是LoRA技术能够快速微调参数&#xff0c;如果LoRA…...

新车月交付突破2万辆!小鹏汽车“激活”智驾之困待解

首次突破月交付2万辆规模的小鹏汽车&#xff0c;稳吗&#xff1f; 本周&#xff0c;高工智能汽车研究院发布的最新监测数据显示&#xff0c;2024年11月&#xff0c;小鹏汽车在国内市场&#xff08;不含出口&#xff09;交付量&#xff08;上险口径&#xff0c;下同&#xff09…...

dockerfile 中 #(nop)

在 Dockerfile 中&#xff0c;#(nop) 通常出现在 docker history 命令的输出中。以下是对它的详细解释&#xff1a; 背景 当你使用 docker history <image_name> 命令查看 Docker 镜像的构建历史时&#xff0c;你可能会看到 #(nop) 这样的标记。这是因为 Docker 镜像由…...

升级 Spring Boot 3 配置讲解 —— 为何 SpringBoot3 淘汰了 JDK8?

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 随着 Spring Boot 3 的发布&#xff0c;许多开发者发现了一个重要的变化&#xff1a;Spring Boot 3 不再支持 JDK 8。这一变化引发了不少讨论&#xff0c;尤其是对于那些仍然在使用 JDK …...

IT面试求职系列主题-人工智能(一)

想成功求职&#xff0c;必要的IT技能一样不能少&#xff0c;再从人工智能基础知识来一波吧。 1&#xff09;您对人工智能的理解是什么&#xff1f; 人工智能是计算机科学技术&#xff0c;强调创造能够模仿人类行为的智能机器。这里智能机器可以定义为能够像人一样行动、像人一…...

JVM 优化指南

JVM 优化指南 1. JVM 参数配置 1.1 基础参数配置 设置堆内存大小 -Xms2048m -Xmx2048m 设置新生代大小 -Xmn1024m 设置元空间大小 -XX:MetaspaceSize256m -XX:MaxMetaspaceSize256m 设置线程栈大小 -Xss512k1.2 垃圾回收器配置 使用 G1 垃圾回收器 -XX:UseG1GC 设置期望停顿…...

windows下编写的shell脚本在Linux下执行有问题解决方法

前言&#xff1a; 这个问题在实际工作中经常会遇到(非语法错误)&#xff0c;脚本来源有些是自己在windows系统编写的、有些是从别人那里copy来的&#xff0c;还有些原本是好的被别人拿到windows下修改了一些内容&#xff0c;总之各种场景&#xff0c;但是如果是一个内容比较多的…...

使用 SQL 和表格数据进行问答和 RAG(6)—将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库

将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库。以下是详细代码逻辑&#xff1a; 1. 类结构 该类包含三个主要方法&#xff1a; _prepare_db&#xff1a;负责将文件夹中的 CSV 和 XLSX 文件转换为 SQL 表。_validate_db&#xff1a;用于验证 SQL 数据库中创建的表是否…...

【算法】算法大纲

这篇文章介绍计算机算法的各个思维模式。 包括 计数原理、数组、树型结构、链表递归栈、查找排序、管窥算法、图论、贪心法和动态规划、以及概率论:概率分治和机器学习。没有办法逐个说明,算法本身错综复杂,不同的算法对应着不同的实用场景,也需要根据具体情况设计与调整。…...

vue(2,3), react (16及以上)开发者工具资源

在前端开发的广阔领域中&#xff0c;Vue.js 和 React.js 作为两大主流框架&#xff0c;各自拥有庞大的用户群体和丰富的生态系统。为了帮助开发者更高效地进行调试和开发&#xff0c;Vue Devtools 和 React 开发者工具应运而生&#xff0c;成为这两个框架不可或缺的辅助工具。本…...

系统编程(网络,文件基础)

网络链接 虚拟机和主机之间网络连接的主要模式有三种&#xff0c;分别是桥接模式&#xff08;Bridged&#xff09;、网络地址转换模式&#xff08;NAT&#xff09;以及主机模式&#xff08;Host-Only&#xff09;。以下是这三种模式的详细解释&#xff1a; 一、桥接模式&…...

重温设计模式--13、策略模式

策略模式介绍 文章目录 策略模式介绍C 代码示例 策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。该模式将算法的定义和使用分离开来&#xff0c;使得算法可以独立于使用它的客户端而变化&#xff0c;提高了代码的灵活性和可维护性。 其主要包含以下几个…...

数字IC设计高频面试题

在数字IC设计领域&#xff0c;面试是评估候选人技术能力和问题解决能力的重要环节。数字IC设计的复杂性和要求在不断提高。面试官通常会提出一系列面试题&#xff0c;以考察应聘者在数字设计、验证、时钟管理、功耗优化等方面的专业知识和实践经验。 这些题目不仅涉及理论知识…...

C#异步多线程——ThreadPool线程池

C#实现异步多线程的方式有多种&#xff0c;以下总结的是ThreadPool的用法。 线程池的特点 线程池受CLR管理&#xff0c;线程的生命周期&#xff0c;任务调度等细节都不需要我们操心了&#xff0c;我们只需要专注于任务实现&#xff0c;使用ThreadPool提供的静态方法把我们的任…...

矩母函数(MGF)

矩母函数&#xff08;MGF&#xff09;简介 矩母函数&#xff08;Moment Generating Function&#xff0c;MGF&#xff09;是概率统计中描述随机变量分布特征的重要工具。MGF的主要用途是通过导数来计算随机变量的矩&#xff08;比如均值、方差等&#xff09;&#xff0c;同时它…...

【技术支持】安卓无线adb调试连接方式

Android 10 及更低版本&#xff0c;需要借助 USB 手机和电脑需连接在同一 WiFi 下&#xff1b;手机开启开发者选项和 USB 调试模式&#xff0c;并通过 USB 连接电脑&#xff08;即adb devices可以查看到手机&#xff09;&#xff1b;设置手机的监听adb tcpip 5555;拔掉 USB 线…...

OpenCV相机标定与3D重建(46)将三维空间中的点投影到二维图像平面上函数projectPoints()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将3D点投影到图像平面上。 cv::projectPoints 是 OpenCV 库中的一个函数&#xff0c;用于将三维空间中的点投影到二维图像平面上。这个过程涉及到…...

Android wifi常见问题及分析

参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题&#xff0c;同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉&#xff0c;是否想过为何需要这样分层&#xff1f; 网上大多都是介绍每一层…...

如何用 ESP32-CAM 做一个实时视频流服务器

文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用&#xff1f;GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…...

编译与汇编

本文来自《程序员的自我修养》 编译过程是把预处理完的文件进行一系列词法分析&#xff0c;语法分析&#xff0c;语义分析以及优化后生成相应的汇编文件代码。 现在版本的GCC把预编译和编译两个步骤合并为一个步骤。 gcc -S HelloWorld.c HelloWorld.sint main() {//test/* …...

Linux入门攻坚——43、keepalived入门-1

Linux Cluster&#xff08;Linux集群的类型&#xff09;&#xff1a;LB、HA、HPC&#xff0c;分别是负载均衡集群、高可用性集群、高性能集群。 LB&#xff1a;lvs&#xff0c;nginx HA&#xff1a;keepalived&#xff0c;heartbeat&#xff0c;corosync&#xff0c;cman HP&am…...

备考蓝桥杯:顺序表相关算法题

目录 询问学号 寄包柜 移动0 颜色分类 合并两个有序数组 物品移动 询问学号 我们的思路&#xff1a;创建一个顺序表存储从1开始依次存放进入教室的学生学号&#xff0c;然后查询 #include <iostream> #include <vector> using namespace std; const int N 2…...

【STM32+QT项目】基于STM32与QT的智慧粮仓环境监测与管理系统设计(完整工程资料源码)

视频演示: 基于STM32与QT的智慧粮仓环境监测与管理系统设计 目录: 目录 视频演示: 目录: 前言:...

Vue3 自定义hook

文章目录 Vue3 自定义hook概述用法 Vue3 自定义hook 概述 Vue3推荐利用Vue的组合式API函数进行代码封装&#xff0c;这种封装方式统称为自定义hook。 用法 定义 hook/countHook.js&#xff1a; import {computed, ref, watch} from "vue";export default (initC…...

【VBA】【EXCEL】将某列内容横向粘贴到指定行

Sub CopyRowToColumn()On Error GoTo ErrorHandler 添加错误处理Application.ScreenUpdating FalseApplication.Calculation xlCalculationManualApplication.EnableEvents False 禁用事件处理Dim lastCol As LongDim lastRow As LongDim i As Long, colCount As LongDim …...

使用Llama 3.1创建合成数据集以调优你的大型语言模型

使用Llama 3.1创建合成数据集以调优你的大型语言模型 在数据驱动的人工智能领域&#xff0c;数据是核心资产。开发高质量数据集既复杂又昂贵&#xff0c;因此很多实验室和开发者选择使用合成数据集。本文将介绍如何利用大型语言模型Llama 3.1 405B创建合成数据集&#xff0c;并…...

【Ubuntu22.04】VMware虚拟机硬盘扩容

1.首先打开虚拟机设置 2.根据需要对硬盘扩展 这边提示我们还需要进入虚拟机在内部分区 3.安装界面化磁盘管理工具 # 安装 sudo apt install gparted# 启动 sudo gparted调整硬盘大小 调整的时候会提示我们硬盘是只读的&#xff0c;因此还要进行操作 新建终端重新挂载文件系…...

初学stm32 --- DMA直接存储器

目录 DMA介绍 STM32F1 DMA框图 DMA处理过程 DMA通道 DMA优先级 DMA相关寄存器介绍 F1 DMA通道x配置寄存器&#xff08;DMA_CCRx&#xff09; DMA中断状态寄存器&#xff08;DMA_ISR&#xff09; DMA中断标志清除寄存器&#xff08;DMA_IFCR&#xff09; DMA通道x传输…...

reactor中的并发

1. reactor中的并发有两种方式 1.1 flatmap&#xff0c;底层是多线程并发处理。在reactor的演讲中&#xff0c;flatmap对于io类型的并发效果较好. flamap有两个参数: int concurrency, int prefetch。分别代表并发的线程数和缓存大小 注意凡是参数中有prefetch的&#xff0c;都…...

HTML - <script>,<noscript>

<script>标签用于在网页插入脚本&#xff0c;<noscript>标签用于指定浏览器不支持脚本时的显示内容。 1.<script> <script>用于加载脚本代码&#xff0c;目前主要是加载 JavaScript 代码。 <script> console.log(hello world); </script&g…...

C#语言的函数实现

C#语言的函数实现 在现代编程语言中&#xff0c;函数&#xff08;Function&#xff09;是最基本也是最重要的组成部分之一。函数不仅提高了代码的复用性&#xff0c;还使得程序结构更清晰。C#作为一种多用途的编程语言&#xff0c;函数的知识是程序员必备的基本技能之一。本文…...

JAVA I/O流练习1

往D盘中的JAVA复习文件夹中写数据&#xff1a; 数据改了一下哈&#xff1a; import java.io.*; import java.util.Scanner; public class Test {public static void main(String[] args) throws IOException {String fileName"D:JAVA复习\\grade.txt";FileWriter w…...

HTML——75. 内联框架

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>内联框架</title><style type"text/css">iframe{width: 100%;height: 500px;}</style></head><body><!--iframe元素会创建包含…...

js获取当前浏览器地址,ip,端口号等等

前言&#xff1a; js获取当前浏览器地址&#xff0c;ip&#xff0c;端口号等等 window.location属性查询 具体属性&#xff1a; 1、获取他的ip地址 window.location.hostname 2、获取他的端口号 window.location.port 3、获取他的全路径 window.location.origin 4、获取…...

C++虚函数(八股总结)

什么是虚函数 虚函数是在父类中定义的一种特殊类型的函数&#xff0c;允许子类重写该函数以适应其自身需求。虚函数的调用取决于对象的实际类型&#xff0c;而不是指针或引用类型。通过将函数声明为虚函数&#xff0c;可以使继承层次结构中的每个子类都能够使用其自己的实现&a…...

【每日学点鸿蒙知识】跳转三方地图、getStringSync性能、键盘避让模式等

1、跳转三方地图导航页 类似于Android 跳转到地图APP 导航页面&#xff1a; // 目标地点的经纬度和名称 double destinationLat 36.547901; double destinationLon 104.258354; String destinationName "目的地名称"; // 构建URI Uri uri Uri.parse("…...

【线性代数】通俗理解特征向量与特征值

这一块在线性代数中属于重点且较难理解的内容&#xff0c;下面仅个人学习过程中的体会&#xff0c;错误之处欢迎指出&#xff0c;有更简洁易懂的理解方式也欢迎留言学习。 文章目录 概念计算几何直观理解意义 概念 矩阵本身就是一个线性变换&#xff0c;对一个空间中的向量应用…...

C#设计模式(行为型模式):备忘录模式,时光倒流的魔法

C#设计模式&#xff1a;备忘录模式&#xff0c;时光倒流的魔法 在软件开发中&#xff0c;我们经常会遇到需要保存对象状态&#xff0c;并在未来某个时刻恢复的场景。例如&#xff1a; 撤销操作&#xff1a; 文本编辑器中的撤销功能&#xff0c;游戏中的回退操作。事务回滚&am…...

服务器信息整理:用途、操作系统安装日期、设备序列化、IP、MAC地址、BIOS时间、系统

文章目录 引言I BIOS时间Windows查看BIOS版本安装日期linux查看BIOS时间II 操作系统安装日期LinuxWindowsIII MAC 地址IV 设备序列号Linux 查看主板信息知识扩展Linux常用命令引言 信息内容:重点信息:用途、操作系统安装日期、设备序列化、IP、MAC地址、BIOS时间、系统 Linux…...

用OpenCV实现UVC视频分屏

分屏 OpencvUVC代码验证后话 用OpenCV实现UVC摄像头的视频分屏。 Opencv opencv里有很多视频图像的处理功能。 UVC Usb 视频类&#xff0c;免驱动的。视频流格式有MJPG和YUY2。MJPG是RGB三色通道的。要对三通道进行分屏显示。 代码 import cv2 import numpy as np video …...

【C#学习】基类的静态变量 派生类会如何处理

来源GPT&#xff0c;仅记录学习 在C#中&#xff0c;子类继承父类的public static变量时&#xff0c;父类的静态变量对所有类&#xff08;包括子类&#xff09;都是共享的。子类并不会重新创建父类静态变量&#xff0c;而是共享父类的静态成员。 具体行为&#xff1a; 静态变量…...

Unity3D仿星露谷物语开发19之库存栏丢弃及交互道具

1、目标 从库存栏中把道具拖到游戏场景中&#xff0c;库存栏中道具数相应做减法或者删除道具。同时在库存栏中可以交换两个道具的位置。 2、UIInventorySlot设置Raycast属性 在UIInventorySlot中&#xff0c;我们只希望最外层的UIInventorySlot响应Raycast&#xff0c;他下面…...

SQL进阶实战技巧:如何利用 Oracle SQL计算线性回归置信区间?

目录 1 置信区间计算方法 步骤1:计算回归系数 步骤2:计算标准误差 步骤3:计算置信区间 2 数据准备 <...

计算机网络——网络层—IP数据报与分片

一、IP 数据报的格式 • 一个 IP 数据报由首部和数据两部分组成。 • 首部的前一部分是固定长度&#xff0c;共 20 字节&#xff0c;是所有 IP 数据报必须具有的。 • 在首部的固定部分的后面是一些可选字段&#xff0c;其长度是可变的。 IP 数据报首部的固定部分中的各字段 版…...

高山旅游景区有效降低成本,无人机山下到山上物资吊运技术详解

在高山旅游景区&#xff0c;传统的物资运输方式往往面临人力成本高昂、效率低下等问题&#xff0c;而无人机技术的引入为这一难题提供了新的解决方案。以下是对无人机从山下到山上进行物资吊运技术的详细解析&#xff1a; 一、无人机物资吊运技术的优势 1. 降低人力成本&#…...