【数据结构初阶】---堆的实现、堆排序以及文件中的TopK问题
1.树的概念及结构
1.1树的概念
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
有一个特殊的结点,称为根结点,根结点没有前驱结点,除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
结构图:
注意:树形结构中,子树之间不能有交集,否则就不是树形结构
1.2树的相关概念
1.结点的度:一个结点含有的子树的个数称为该结点的度; 如上图:A的为6
2.叶结点或终端结点:度为0的结点称为叶结点; 如上图:B、C、H、I…等结点为叶结点
3.非终端结点或分支结点:度不为0的结点; 如上图:D、E、F、G…等结点为分支结点
4.双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父结点
5.孩子结点或子结点: 一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结点
6.兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点
7.树的度:一棵树中,最大的结点的度称为树的度; 如上图:树的度为6
8.结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推;
9.树的高度或深度:树中结点的最大层次; 如上图:树的高度为4
10.堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、I互为兄弟结点
11.结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先
12.孩子结点或子结点:以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙
13.森林:由m(m>0)棵互不相交的树的集合称为森林;
2.二叉树的概念及结构
2.1二叉树的概念
与树不同,二叉树根结点的子节点有且不超过两个。
以下几个都是二叉树:
2.2特殊的二叉树
满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。
##2.3 二叉树的性质
- 若规定根结点的层数为h,则一棵非空二叉树的第h层上最多有2^(h-1)个结点
- 若规定根结点的层数为h,则深度为h的二叉树的最大结点数是 2^h-1
- 对任何一棵二叉树, 如果度为0其叶结点个数为n1, 度为2的分支结点个数为n2,则有n1=n2+1
- 假设在顺序表中父亲节点parent的下标是i,则孩子节点child的下标分别是i * 2 + 1和i * 2 + 2,分别对应左右孩子
- 假设在顺序表中孩子节点child的下标是i,不管其是左孩子还是有孩子,其父亲节点的下标都是(i - 1) / 2
2.4二叉树的存储形式
二叉树分为完全二叉树和不完全二叉树,对于完全二叉树,我们可以采用顺序表进行存储,对于不完全二叉树我们则需采用链式存储
3.堆的顺序结构及实现
3.1堆的概念
堆是一种特别的完全二叉树,堆分为大堆和小堆。
对于大堆,堆中任意某个节点的值总是大于其子节点的值。
对于小堆,堆中任意某个节点的值总是小于其父节点的值。
3.2堆的实现
堆结构的定义
对于堆我们是采用顺序表进行存储,因此定义了一个指向数组的指针a和存储数据个数和申请的空间大小的两个变量。
typedef int HPDataType;typedef struct Heap
{HPDataType* a;int size;//数据个数int capacity;//空间大小
}HP;
堆的初始化
堆的初始化就是顺序表的初始化,我们先不申请空间,后续插入数据的时候我们再申请。
//堆的初始化
void HPInit(HP* php)
{php->a = NULL;php->size = php->capacity = 0;
}
堆的插入
我们先判断空间是否足够,当前空间大小为0的话申请4个字节大小的空间,不为空的话就进行扩容两倍。
//堆的插入
void HPPush(HP* php, HPDataType x)
{assert(php);//判断空间是否足够if (php->size == php->capacity){HPDataType newCapacity = php->capacity == 0 ? 4 : 2 * php->capacity;HPDataType* tmp = (HPDataType*)realloc(php->a,sizeof(HPDataType) * newCapacity);if (tmp == NULL){perror("HPPush():realloc");return;}php->a = tmp;php->capacity = newCapacity;}//先把数据插入数组尾部php->a[php->size++] = x;//然后向上调整AdjustUp(php->a, php->size - 1);
}
向上调整这个函数传的两个参数分别表示要调整的数组和要调整的孩子节点child在数组中的下标。
有了孩子节点的下标我们就可以计算其父亲节点的下标:int parent = (child - 1) / 2;
因为我们要实现的是小堆,所以如果父亲节点比孩子节点大,我们则将父子节点进行交换,交换完后我们得到新的父子节点的下标,最坏的情况是孩子节点向上不断交换,最后孩子节点的下标==0,说明其所在位置已经是根节点了,是最小的数了,比较也就停止。
//向上比较交换
void AdjustUp(HPDataType* a, int child)
{//将数组和最后一个数据下标传过去//求这个孩子节点的父亲节点int parent = (child - 1) / 2;//这个孩子节点最终成为根节点则不再比较while (child > 0){//我们要实现的是小堆,父亲节点得比孩子节点小//如果孩子节点比父亲节点小,则交换if (a[child] < a[parent]){Swap(&a[child], &a[parent]);//孩子节点成为父亲节点,继续和祖宗节点比较child = parent;parent = (child - 1) / 2;}//a[child] > a[parent],符合小堆逻辑,不用交换了else{break;}}
}
里面对父子节点进行交换我们也单独写一个函数,方便后续我们要使用的时候直接调用
//交换父子节点
void Swap(HPDataType* child, HPDataType* parent)
{HPDataType tmp = *child;*child = *parent;*parent = tmp;
}
堆的删除
我们要删除的是堆的根,我们怎么删除他呢?直接删除吗?不行,因为直接删除的话剩下的节点直接的关系就全乱了,假如直接删除根节点后,顺序表中的第二个数据就成为了根,而其兄弟节点成为了他的孩子,这时候二者就有了大小关系,但我们知道兄弟节点之间是没有大小关系的,因此这时候顺序表的剩下的数据还是一个堆吗?不是了,他们直接的关系全乱了。
所以我们要删除根节点的办法是先将根节点个顺序表中的最后一个数据进行交换,然后这时候删除最后一个节点就相当于删除了原本的根节点。删除完后我们就需要对这时候的根节点进行调整了。
//堆的删除,删除的是根
void HPPop(HP* php)
{assert(php);assert(php->size);//先将根和数组最后一个数据进行交换Swap(&(php->a[0]), &(php->a[php->size - 1]));//然后删除数组最后一个数据,即是删除原本小堆的根数据php->size--;//然后向下比较交换父子节点AdjustDown(php->a, php->size, 0);
}
如何调整呢?,我们传三个参数,一个是要操作的顺序表,一个是顺序表中元素的个数,因为我们前面删除了最后一个数(也就是原本的根节点),所以我们传数据个数的时候需要减去原本的那个根节点。第三个参数是需要调整的这个节点的下标,因为我们是向下调整,需要这个节点与其孩子节点进行比较,所以我们命名这个节点为parent。
怎么比较呢?这里我们是要保持我们的堆依旧是小堆,所以我们要让大的元素与其孩子进行交换,但一般父亲节点都有两个孩子,我们要与谁进行交换呢?我们要与两个孩子中较小的那个孩子进行交换,因为如果我们是与较大的那个孩子进行交换的话,我们还记得小堆的性质:小堆中任意一个父亲节点的值都小于其孩子节点。
所以如果我们与较大的那个孩子节点交换后,这个孩子节点就成为了父亲节点,他需要比他的孩子节点小,但是他是两个孩子中大的那个呀,他成为父亲节点后,他原本的兄弟节点就成为了他的孩子,但他比他孩子大,这就不构成小堆了。所以我们要与较小的那个孩子进行比较。
我们用假设法先假设左孩子较小,如果右孩子比左孩子小,那child就变成右孩子。
后续就是如果父亲节点比孩子节点大,就交换,然后确认出新的孩子节点和父亲节点。
//向下比较交换父子节点
void AdjustDown(HPDataType* a, int n, int parent)
{//n是数据个数,parent是父亲节点的下标//假设法,先假设左孩子是比较小的那个int child = parent * 2 + 1;//当这个父亲节点变成叶子节点的时候就结束了//当他是叶子节点,那他就没孩子了,他孩子的下标就越界了while (child < n){ //如果只有左孩子,child+1最后可能越界if (child + 1 < n && a[child + 1] < a[child]){//那较小的那个就是右孩子child++;}//父子节点进行比较,父亲节点大于孩子节点则进行交换if (a[parent] > a[child]){Swap(&a[parent], &a[child]);//这个节点变成孩子节点了,继续找他的孩子节点parent = child;child = parent * 2 + 1;}//a[parent] < a[child]满足小堆逻辑else{break;}}
}
返回堆的根
判断不为空后直接返回顺序表第一个元素即可。
//返回堆的根
HPDataType HPTop(HP* php)
{assert(php);assert(php->size);return php->a[0];
}
堆的判空
size == 0为真返回1,为假返回0
//堆的判空
bool HPEmpty(HP* php)
{assert(php);return php->size == 0;
}
堆的销毁
堆的销毁就是将顺序表动态申请的空间进行释放。
//堆的销毁
void HPDestroy(HP* php)
{free(php->a);php->a = NULL;php->size = php->capacity = 0;
}
4.堆排序
堆排序的思路是:降序建小堆,升序建大堆。
以升序为例,我们先建大堆,建完后我们的根节点是不是就是这个堆中最大的那个元素,我们将根节点和数组中的最后一个元素进行交换,然后将除最后一个元素(被交换的那个根节点)之外剩下的元素进行向下调整再次形成一个大堆,这时候这个大堆的根节点是不是就是这个堆中最大的元素,也就是数组中第二大的元素,然后我们继续向下调整,一直这个样重复,我们就能得到一个升序的序列了。
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<assret.h>void Swap(int* child, int* parent)
{int temp = *child;*child = *parent;*parent = temp;
}//向下调整,父亲与孩子比较交换
void AdjustDown(int* a, int n, int parent)
{assert(a);//假设法,先假设左孩子是较大的那个int child = parent * 2 + 1;//孩子下标超过剩余元素个数说明父亲节点已经变成叶子节点了while (child < n){if (child + 1 < n && a[child + 1] > a[child]){++child;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapSort(int* a, int n)
{assert(a);//升序建大堆//从最后一个非叶子节点开始向下调整建堆//最后一个非叶子节点的下标是(n - 1 - 1) / 2,这个下标作为父亲节点的下标for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, n, i);}//建堆完后,我们交换第一个和最后一个元素,然后将根元素向下调整int end = n - 1;while (end){Swap(&a[0], &a[end]);//end是最后一个元素的下标AdjustDown(a, end, 0);//end是除最后一个元素外剩余元素的个数--end;}
}int main()
{int a[] = { 9,5,6,3,7,8,1,2,0,4 };//排个升序HeapSort(a, sizeof(a) / sizeof(a[0]));for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++){printf("%d ", a[i]);}return 0;
}
5.文件中的TopK问题
文件中的TopK问题就是我们有一个文件,里面有很多数据,我们要找出这些数据中最大的前k个元素。
思路是: 我们先创建一个k个元素的小堆(向下调整建堆),这k个元素是文件中的前k个元素。因为是小堆,所以根节点位置的元素是k个元素中最小的那个元素,然后我们将文件中剩下的n-k个元素依次与根节点进行比较,如果比根节点位置的数据大,我们就将根节点的数据进行覆盖,然后我们将这个节点进行向下调整成新的小堆,这样我们确保了根节点永远是k个元素中最小的那个,这样子最后比较完后我们这个小堆中的k个元素就是文件里的n个元素中最大的k个元素了。
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<assret.h>
#include<stdlib.h>
#include<time.h>//空间复杂度:O(k)
//时间复杂度:O((N-K)*logK),即O(N)void Swap(int* child, int* parent)
{int temp = *child;*child = *parent;*parent = temp;
}//向下调整,父亲与孩子比较交换
void AdjustDown(int* a, int n, int parent)
{assert(a);//假设法,先假设左孩子是较小的那个int child = parent * 2 + 1;//孩子下标超过剩余元素个数说明父亲节点已经变成叶子节点了while (child < n){if (child + 1 < n && a[child + 1] < a[child]){++child;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void CreateNData()
{int n = 100000;srand((unsigned int)time(NULL));FILE* fp = fopen("test.txt", "w");if (fp == NULL){perror("CreateNData():fopen");return;}for (int i = 0; i < n; i++){int x = rand() % 10000000;fprintf(fp, "%d\n", x);}fclose(fp);fp = NULL;
}void PrintTopK()
{printf("请输入要查找最大的前多少个数:");int k = 0;scanf("%d", &k);//为数组申请k个空间int* kminHeap = (int*)malloc(sizeof(int) * k);FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("PrintTopK():fopen");return;}//读取文件前k个数据for (int i = 0; i < k; i++){fscanf(pf, "%d", &kminHeap[i]);}//建小堆for (int i = (k - 1 - 1) / 2; i >= 0; i--){AdjustDown(kminHeap, k, i);}int x = 0;//返回的是读取成功的个数,读取失败返回-1while (fscanf(pf, "%d", &x) > 0){if (x > kminHeap[0]){kminHeap[0] = x;AdjustDown(kminHeap, k, 0);}}for (int i = 0; i < k; i++){printf("%d ", kminHeap[i]);}
}int main()
{//先先文件中放些数据//CreateNData();PrintTopK();return 0;
}
相关文章:
【数据结构初阶】---堆的实现、堆排序以及文件中的TopK问题
1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点&…...
【量化策略】均值回归策略
【量化策略】均值回归策略 🚀量化软件开通 🚀量化实战教程 技术背景和应用场景 均值回归策略是一种基于统计学原理的量化交易策略,它假设资产价格会围绕其历史平均水平波动。当价格偏离这个平均水平时,就有可能会回到平均值附…...
设计模式 - 工厂模式 精准梳理精准记忆
1、代码片段 - 带入理解 一、核心模式分类 简单工厂模式(编程习惯,非 GoF 设计模式)工厂方法模式(GoF 创建型模式)抽象工厂模式(GoF 创建型模式) 二、演变过程:咖啡店案例 初始实现…...
WIFI ESP8266以及基础功能介绍
芯片一旦烧写了程序就不可以使用AT指令集,需要重新刷回AT指令库才可以使用 wifi的通信频段是2.4G免费频段。 AT指令 AT(attention)command set.AT指令集或命令集,一般称为AT指令 海斯命令集:Hayes command set 默认…...
面试java做了一道逻辑题,人麻了
题目:给你一个5升水壶,一个6升水壶,去池塘中取水,如何保证最后取出的水是3升? 思考了很久终于想出来了,这里用X5代表5升的桶,X6代表6升的桶: ① 6升桶装满,X50ÿ…...
go语言因为前端跨域导致无法访问到后端解决方案
前端服务8080访问后端8081这端口显示跨域了 ERROR Network Error AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axios/lib/adapters/xhr.js:116:14) at Axios.request (webpack-internal:///./node_modules/axios/lib/core/A…...
svn删除所有隐藏.svn文件,文件夹脱离svn控制
新建一个文件,取名remove-svn-folders.reg,输入如下内容: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] "Delete SVN Folders" [HKEY_LOCAL_MACHINE\SOFTWARE\Class…...
Greenplum6.19集群搭建
一,安装说明 1.1环境说明 1、首先确定部署的环境,确定下服务器的端口,一般默认是22的端口; 2、当前这份文档是服务器处于10022端口下部署的(现场生产环境要求,22端口在生产环境存在安全隐患)&…...
C/C++蓝桥杯算法真题打卡(Day4)
一、P11041 [蓝桥杯 2024 省 Java B] 报数游戏 - 洛谷 算法代码: #include<bits/stdc.h> using namespace std;// 计算第 n 个满足条件的数 long long findNthNumber(long long n) {long long low 1, high 1e18; // 二分查找范围while (low < high) {lo…...
TinyWebServer项目笔记——01 线程同步机制封装类
目录 1.基础知识 (1)RALL (2)信号量 (3)互斥量 (4)条件变量 2.功能 1.基础知识 (1)RALL RALL全称“Resource Acquisition is Initialization”…...
如何在Ubuntu上直接编译Apache Doris
以下是在 Ubuntu 22.04 上直接编译 Apache Doris 的完整流程,综合多个版本和环境的最佳实践: 注意:Ubuntu的数据盘VMware默认是20G,编译不够用,给到50G以上吧 一、环境准备 1. 安装系统依赖 # 基础构建工具链 apt i…...
算法006——和为S 的两个数
力扣——查找总价格为目标值的两个商品点击跳转 注意题目中的关键信息升序 我们利用双指针,不管 target 是多少,让一个指针指向最小值,让一个指针指向最大 那么,共有三种情况 我们首先遇到的是第二种情况 sum < target left …...
物联网设备接入系统后如何查看硬件实时数据?
要在软件中实时查看硬件设备的信息,通常需要结合前后端技术来实现。以下是设计思路和实现步骤: 1. 系统架构设计 实时查看硬件设备信息的系统通常采用以下架构: 数据采集层: 硬件设备通过传感器采集数据,发送到InfluxDB。数据存…...
CSS—属性继承与预处理器:2分钟掌握预处理器
个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–属性继承3–预处理器 2. 属性继承 像Android里面继承extends,类继承,子类可以使用父类的public和protected的属性和方法。子类可以直接用。 在CSS里面也是类似的。CSS里面是布局里面…...
前端知识点---http.createHttp()的理解(arkts)
通俗易懂的例子:点外卖 🍔🥤 想象一下,你在家里点外卖,HTTP 请求就像是你和餐厅之间的沟通方式。 1️⃣ 没有 http.createHttp():每次点餐都重新拨电话 📞 如果你每次点餐都重新拨打餐厅的电话…...
信息安全访问控制、抗攻击技术、安全体系和评估(高软42)
系列文章目录 信息安全访问控制、抗攻击技术、安全体系和评估 文章目录 系列文章目录前言一、信息安全技术1.访问控制2.抗攻击技术 二、欺骗技术1.ARP欺骗2.DNS欺骗3.IP欺骗 三、抗攻击技术1.端口扫描2.强化TCP/IP堆栈 四、保证体系和评估1.保证体系2.安全风险管理 五、真题在…...
【深度学习】宠物品种分类Pet Breeds Classifier
文章目录 宠物品种数据集制作宠物品种标签图像预处理Presizing 损失函数loss观察模型的性能提升模型的性能learning rate finder使用CLR算法训练选择学习率的策略重新训练 迁移学习微调fine_tunefit_one_cycle有判别力的学习率 选择epoch的数量更深的网络架构 宠物品种数据集 …...
PyQt组件间的通信方式
PyQt组件间的通信方式 PyQt组件间的通信方式 1. 组件介绍 1.1 组件的定义1.2 组件的分类 2. 组件的通信方式 2.1 信号与槽(Signal & Slot) 1. 组件介绍 在 Qt 框架中,组件(Component)是构建图形用户界面&am…...
基于编译器特性浅析C++程序性能优化
最近在恶补计算机基础知识,学到CSAPP第五章的内容,在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言,程序的性能可以用CPE(Cycles Per Element)来衡量,其指的是处理每个元素…...
在 Docker 中搭建GBase 8s主备集群环境
本文介绍了如何在同一台机器上使用 Docker 容器搭建GBase 8s主备集群环境。 拉取镜像 拉取GBase 8s的最新镜像 docker pull liaosnet/gbase8s或者docker pull liaosnet/gbase8s:v8.8_3513x25_csdk_x64注:在tag为v8.8_3513x25_csdk_x64及之后的版本中,…...
hadoop集群环境配置
目录 VMware虚拟机安装 Xshell安装 网络问题 centos7下载 ---------参考以下视频步骤进行生态搭建---------- 搭建好hadoop01 克隆出hadoop02、hadoop03 启动三台虚拟机 打开终端 输入 记录下各个ip 打开Xshell,新建会话 修改主机名 配置静态IP 主机名称…...
Hive-优化(参数优化篇)
map 数和reduce数 控制hive任务中的map数 合适的map数,会让资源分配的更平均,让我们的代码运行更快,通常情况下,作业会通过input的目录产生一个或者多个map任务。我们可以通过调整参数来控制运行过程中的map数。 Hive Map的数量…...
深度学习|MAE技术全景图:自监督学习的“掩码魔法“如何重塑AI基础
一、引言:深度学习的困境与自监督的曙光 深度学习(Deep Learning)无疑是当今人工智能领域基础中的基础。从图像识别到自然语言处理(NLP),它在无数任务中展现了卓越性能。例如,在安防监控中&…...
学习threejs,使用LineBasicMaterial基础线材质
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.LineBasicMaterial1.…...
第本章:go 切片
注意: 切片必须要初始化 才能使用 ,切片是引用类型 a :[]int{} // 这上叫始化 此时并没有申请内存 // 如果要追加值的话: append ints : append(a, 1, 2, 3)a : make([]int,5) // 声明切片类型var a []string //声明一…...
dify + ollama + deepseek-r1+ stable-diffusion 构建绘画智能体
故事背景 stable-diffusion 集成进 dify 后,我们搭建一个小智能体,验证下文生图功能 业务流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…...
Java基础面试题全集
1. Java语言基础 1.1 Java是什么? • Java是一种广泛使用的编程语言,最初由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。它是一种面向对象的、基于类的、通用型的编程语言,旨在让应用程序“编写一次&…...
基于multisim的自动干手器设计与仿真
1 设计的任务与要求 设计一个输出 5V 的直流稳压电源。用开关的闭合模拟手挡住光线的功能。用灯的亮灭模拟烘干吹风功能。 2 方案论证与选择 2.1 自动干手器的系统方案 本设计由5V直流电源、红外发射电路、红外接收电路、灯模拟电路构成。 1. 5V直流电源系统 这一部分是整…...
three.js 在 webGL 添加纹理
在我们生成了3D设计之后,我们可以添加纹理使其更加吸引人。在 webGL 和 p5.js中,可以使用 gl.texImage2D() 和 texture() API来为形状应用纹理。 使用 webGL 在 webGL 中,gl.texImage2D() 函数用于从图像文件生成2D纹理。该函数接受许多参…...
Docker 部署 MongoDB 并持久化数据
Docker 部署 MongoDB 并持久化数据 在现代开发中,MongoDB 作为 NoSQL 数据库广泛应用,而 Docker 则提供了高效的容器化方案。本教程将介绍如何使用 Docker 快速部署 MongoDB,并实现数据持久化,确保数据不会因容器重启或删除而丢失…...
SpringBoot优雅关机,监听关机事件,docker配置
Spring Boot 提供了多种方法来实现优雅停机(Graceful Shutdown),这意味着在关闭应用程序之前,它会等待当前正在处理的请求完成,并且不再接受新的请求。 一、优雅停机的基本概念 优雅停机的主要步骤如下: …...
网络基础(一)【网络发展/认识协议/网络 VS 系统/以太网通信原理/重谈协议/网络中的地址管理】
网络基础(一) 1. 网络的发展2. 认识协议3. 网络 VS 系统4. 以太网通信原理5. 重谈协议6. 网络中的地址管理 1. 网络的发展 最开始时,计算机之间相互独立。 但是为了协作完成一些任务,就产生了计算机之间相互通讯的需求,…...
PostgreSQL、SQL Server和MySQL数据库性能调优与故障排除技术
通过结合具体技术特性与工具链的深度使用,可系统化提升数据库性能和稳定性。建议根据实际负载特征制定监控-分析-优化的闭环管理流程。 数据库技术: PostgreSQL 13:逻辑复制、分区表、并行查询、监控工具(如pg_stat_statements、…...
本地YARN集群部署
请先完成HDFS的前置部署,部署方式可查看:本地部署HDFS集群https://blog.csdn.net/m0_73641796/article/details/145998092?spm1001.2014.3001.5502 部署说明 组件配置文件启动进程备注Hadoop HDFS需修改 需启动: NameNode作为主节点 DataNode作为从节点 Secondary…...
Redis数据结构——list
目录 列表命令 lpush lrange lpushx rpush rpushx lpop rpop lindex linsert llen lrem ltrim lset blpop / brpop 命令总结 编码方式 list相当于数组或者顺序表,但并不是简单的数组,更接近于C中的"双端队列"(deque)。 最左侧的下标…...
World of Warcraft [CLASSIC] BigFoot BiaoGe
World of Warcraft [CLASSIC] BigFoot BiaoGe 金团表格插件 设置60秒拍卖装备时间 ALT 鼠标左键,点击装备,弹出对话框,填写 1)拍卖时间默认60秒,起拍价, 2)点击【开始拍卖】 团队所有安装了…...
CentOS Docker 安装指南
CentOS Docker 安装指南 引言 Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及应用的依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 容器是完全使用沙箱机制,相互之…...
PHP:phpstudy无法启动MySQL服务问题解决
文章目录 一、问题说明二、解决问题 一、问题说明 我的Windows10系统,之前安装过MySQL5.7的版本。 然后,用phpstudy安装MySQL8,并启动MySQL8。 发生无法启动的情况。 二、解决问题 1、删除本地MySQL7的服务 net stop MySQL //这里的服务名…...
【电控笔记z29】扰动估测器DOB估测惯量J-摩擦系数B
基本原理 扰动估测器的核心思想是通过向电机系统施加特定的扰动信号,观察系统响应的变化,然后利用系统的动态模型和控制理论来估计未知参数,如惯量和摩擦系数 。一般基于电机的运动方程建立数学模型,结合观测到的电机实际运行数据…...
STM32-I2C通信外设
目录 一:I2C外设简介 二:I2C外设数据收发 三:I2C的复用端口 四:主机发送和接收 五:硬件I2C读写MPU6050 相关函数: 1.I2C_ GenerateSTART 2.I2C_ GenerateSTOP 3.I2C_ AcknowledgeConfig 4.I2C…...
计算机二级MS之PPT
声明:跟着大猫和小黑学习随便记下一些笔记供大家参考,二级考试之前将持续更新,希望大家二级都能轻轻松松过啦,过了二级的大神也可以在评论区留言给点建议,感谢大家!! 文章目录 考题难点1cm25px…...
Spring Boot 3 整合 MinIO 实现分布式文件存储
引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心,而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…...
C++ Primer 交换操作
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
分布式中间件:Redis介绍
目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串(String) 哈希(Hash) 列表(List) 集合(Set) 有序集合&…...
软件测试的基础入门(二)
文章目录 一、软件(开发)的生命周期什么是生命周期软件(开发)的生命周期需求分析计划设计编码测试运行维护 二、常见的开发模型瀑布模型流程优点缺点适应的场景 螺旋模型流程优点缺点适应的场景 增量模型和迭代模型流程适应的场景…...
学之思社区版考试系统docker-compose部署
参考 开源项目-Docker部署学之思管理系统 安装docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Bas…...
深度优先搜索(DFS)和广度优先搜索(BFS)——c#实现
一、深度优先搜索(DFS) 原理: 沿着分支尽可能深入,直到到达叶子节点,然后回溯探索其他分支 类似走迷宫时优先选择一条路走到黑,碰壁再回退 数据结构:栈(Stack)或递归实…...
什么是hive
Apache Hive 是一个基于 Hadoop 生态系统构建的数据仓库工具,主要用于处理和分析大规模的结构化数据。它允许用户通过类似 SQL 的查询语言(HiveQL)进行数据操作,而无需直接编写复杂的 MapReduce 程序。以下是 Hive 的核心特点和应…...
JVM详解
目录 一.JVM的概念 1. 什么是JVM? 2.JVM用来干什么? 二JVM运行流程 JVM执⾏流程 2.1类加载机制 2.2类加载机制带来了哪些好处? 2.3类加载的过程是什么? 2.3.1加载 2.3.2验证 2.3.3准备阶段 2.3.4解析阶段 符号引⽤ 直接引⽤ 2.3.5初始化阶段 2.4类加载器 什么…...
PCA(主成分分析)核心原理
一、PCA(主成分分析)核心原理 即主成分分析技术,又称主分量分析技术,旨在利用降维的思想,把多指标转化为少数几个综合指标。在统计学中,主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换…...