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

c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序

高阶排序

在这里插入图片描述
在这里插入图片描述

1、快速排序

冒泡排序的升级算法

每次选择一个基准数,把小于基准数的放到基准数的左边,把大于基准数的放到基准数的右边,采用 “ 分治算法 ”处理剩余元素,直到整个序列变为有序序列。

最好和平均的复杂度:
时间复杂度:O(n)*O(logn) = O(nlogn)
空间复杂度:O(logn) 递归的深度所占用的栈内存

最坏的情况(有序的元素):元素有几个,其深度就有几个,此时时间复杂度为 O(n^2) , 空间复杂度为O(n)
在这里插入图片描述

思路

在这里插入图片描述

实例理解

对于数组arr[] = {46,8,76,10,38,7,68,32,65,53};进行快速排序。
在这里插入图片描述
循环的条件 L< R
1、选取基准数 val = arr[L]; // val = 46
2、从R开始往前找第一个 <val 的数字,放到L的地方。(这里不用担心数据被覆盖,因为val已经将值保存), L++ 。
在这里插入图片描述在这里插入图片描述
3、从L开始,往后找第一个 >val 的数字,放到R的地方, R-- 。在这里插入图片描述
4、重复上面的过程,直到循环结束(循环条件为 L<R)在这里插入图片描述
运行到循环结束在这里插入图片描述
此时,将val的值写入 arr[L] 最终一趟下来的结果为在这里插入图片描述

一趟下来,此时,arr[L] 左边的值全部小于val–46,左边全部大于val–46。
此时,继续对两边的数据继续快排。
在这里插入图片描述
最终结果为:
在这里插入图片描述

代码实现


//快排分割处理函数
int Partation(int arr[], int left, int right)
{//记录基准数int val = arr[left];//进行一次快排分割处理   O(n)*O(logn) = O(nlogn)  空间复杂度:O(logn) 递归的深度所占用的栈内存while (left < right){while (left < right && arr[right] > val){right--;}if (left < right){arr[left] = arr[right];left++;}while (left < right && arr[left] < val){left++;}if (left < right){arr[right] = arr[left];right--;}}//left == right   的位置,就是放基准数的位置arr[left] = val;return left;
}//快排的递归接口
void QuickSort(int arr[], int begin, int end)
{if (begin >= end)//快排递归结束的条件{return;}//在[begin,end]区间的元素进行一次快排分割处理int pos = Partation(arr,begin,end);//对基准数的左边和右边的序列,再分别进行快排QuickSort(arr,begin,pos-1);QuickSort(arr,pos+1,end);}//快速排序
void QuickSort(int arr[], int size)//为了区别自带的快速排序函数
{return QuickSort(arr,0,size-1);
}int main()
{int arr[10];srand(time(NULL));for (int i = 0; i < 10; i++){arr[i] = rand() % 100 + 1;}for (int v : arr){cout << v << "  ";}cout << endl;QuickSort(arr, sizeof(arr) / sizeof(arr[0]));for (int v : arr){cout << v << "  ";}cout << endl;return 0;
}

测试

在这里插入图片描述

快速排序的算法优化、效率提升

1)对于小段趋于有序的序列采用插入排序
2)三数取中法。旨在挑选合适的基准数,防止快排退化成冒泡排序。
3)随机数法

特点

快速排序是个不稳定的排序算法

当数据趋于有序,或者已经有序了,快速排序的效率是很差的,但是快速排序的效率是最好的。

快排算法优化一:

1、随着快速排序算法执行,数据越来越趋于有序,在一定范围内,可以采用插入排序代替快速排序
相关代码

//针对快排优化设计的插入排序
void InsertSort(int arr[], int begin,int end)
{for (int i = begin; i <= end; i++)//O(n){int val = arr[i];int j = i - 1;for (; j >= 0; j--) //O(n){if (arr[j] <= val){break;}arr[j + 1] = arr[j];}//val -> j+1arr[j + 1] = val;}
}
void QuickSort(int arr[], int begin, int end)
{if (begin >= end)//快排递归结束的条件{return;}//优化一:当[begin,end] 序列的元素个数小到指定数量,采用插入排序if (end - begin <= 50)//这里的范围视情况而定{InsertSort(arr,begin,end);return;}//在[begin,end]区间的元素进行一次快排分割处理int pos = Partation(arr,begin,end);//对基准数的左边和右边的序列,再分别进行快排QuickSort(arr,begin,pos-1);QuickSort(arr,pos+1,end);}

快排算法优化二:选择基准数的优化,采用“三数取中”法

采用“三数取中”法,找合适的基准数。

mid = (L+R)/2;

2、归并排序

也采用 “ 分治思想 ”,先进行序列划分,再进行元素的有序合并。
时间复杂度:O(n logn)
空间复杂度:O(logn)+O(n) — 取大的 — O(n)

核心思想

类比于递归思想,核心在于
递—将数据规模不断的减小,减小到结果已知的规模。
归—通过已知的规模反推而上,不断解决上一层规模的问题,最终累计出原始数据 的结果。
所以归并排序的思想:在归的过程中,进行的数据合并,达到排序的效果

难点

上述思想衍生出的问题和难点

1)递到什么程度,才开始归?
2)在归的过程中,如何进行数据合并?

对数数据规模需要一个前后指针,一个起始下标,一个末尾下标。进行二路归并,需要中间值,int mid = (L+R)/2;

递的过程
将数据分两半,
在这里插入图片描述
归并的过程
数据合并,也就是叶子节点网根节点回退。
重新开辟一个空间,将两个有序的叶子节点合并到上一层,不断重复,直到归并到根节点,此时数据处理完毕。
在这里插入图片描述

代码实现

//归并过程函数
void Merge(int arr[], int l, int m, int r)
{int* p = new int[r-l+1];int idx = 0;int i = l;int j = m + 1;while (i <= m && j <= r){if (arr[i] <= arr[j]){p[idx++] = arr[i++];}else{p[idx++] = arr[j++];}}while (i <= m){p[idx++] = arr[i++];}while (j <= r){p[idx++] = arr[j++];}//再把合并好的大段有序的结果,拷贝到原始arr[数组[l,r]区间内for (i = l, j = 0; i <= r; i++, j++){arr[i] = p[j];}delete[]p;}//归并排序递归接口
void MergeSort(int arr[], int begin, int end)
{//递归结束的条件if (begin >= end){return;}int mid = (begin + end) / 2;//先递MergeSort(arr,begin,mid);MergeSort(arr,mid+1,end);//再归并  [begin,mid]  [mid+1,end]  -- 把两个小段有序的序列,合并成一个大段的有序序列Merge(arr,begin,mid,end);
}//归并排序
void MergeSort(int arr[], int size)
{return MergeSort(arr, 0, size - 1);
}

测试

int main()
{int arr[10];srand(time(NULL));for (int i = 0; i < 10; i++){arr[i] = rand() % 100 + 1;}for (int v : arr){cout << v << "  ";}cout << endl;MergeSort(arr, sizeof(arr) / sizeof(arr[0]));for (int v : arr){cout << v << "  ";}cout << endl;return 0;
}

在这里插入图片描述

3、堆排序

二叉堆

二叉堆就是一颗完全二叉树,范围两种典型的堆,分别是大根堆小根堆

基于二叉堆的基础,规定了当前节点和两个孩子节点值的大小关系。

满足 0 <= i <= (n-1)/2 , n 代表最后一个元素的下标。
如果 arr[i] <= arr[2 * i + 1] && arr[i] <= arr[2*i + 2] ,就是小根堆
如果 arr[i] >= arr[2 * i + 1] && arr[i] >= arr[2*i + 2] ,就是大根堆
在这里插入图片描述
二叉堆,实际上(物理上)还是用数组存储的元素,只是逻辑上,将其看成有一个人口根节点,
每个节点都有两个孩子,没有孩子的最下一层,称之为叶子节点,这样的二叉树结构,称之为完全二叉树。

完全二叉树:

完全二叉树相比于二叉树,最后一层的叶子节点都是靠左排列,
优点是在存储二叉树节点的时候,比较省数组内存空间。

最后一层的叶子节点都是靠左排列的,每一层的节点都是满的。
最下层节点,必须从左往右都有,中间空一个都不算。

在这里插入图片描述
如何将数组存储的元素,逻辑上看成完全二叉树?当前节点和两个孩子节点有什么关系?
在数组中,满足下图关系的节点,在逻辑上看成二叉树当前节点和其左右节点。
在这里插入图片描述

如何获得第一个非叶子节点的下标?

(n-1)/2

堆的上浮和下层调整(添加删除元素)

入堆(大根堆入堆示例)

数组的元素添加,在数组末尾添加元素。
相对应的,逻辑上,在二叉树的最下层如图所示位置,添加新元素。
在这里插入图片描述

但此时,破坏了此时完全二叉树的逻辑,需要进行调整。、
因为是大根堆,所以要对数据进行上浮调整
这里新的元素10大于父节点5,进行交换。

在这里插入图片描述

交换过后,发现还是比父节点大,继续交换。

在这里插入图片描述
如下图所示,元素上浮到根节点,上浮结束。
在这里插入图片描述
注意,人堆不是入到堆顶,是入到小于父节点的位置。

出堆(大根堆出堆示例)

大根堆出堆,出堆顶元素。
优先级队列实现的时候,假设值越大,优先级越大,这里为大根堆,出元素,就先出堆顶元素。
当然也可以规定,值越小,优先级越小。

出堆操作

将堆顶元素取出。
在这里插入图片描述

将最后的数据放到堆顶,该值相对是偏小的。
在这里插入图片描述
从零号元素开始,往下调整,继续下层调整操作
比较节点两个孩子节点,将孩子节点中较大值,覆盖,进行下层操作。
以此类推,直到元素无孩子节点,或者孩子节点都小于该元素。
将val覆盖该位置的值。

基于堆的优先级队列代码实现

类似于C++库中的priority_queue,其底层也是数组,只不过没有自己写数组。如果自己写数组,就成为容器了,而不是容器适配器,其只是对底层容器(vector)进行适配。

//优先级队列实现 priority_queue(vector)   -- push  pop  top  empty size
class PriorityQueue
{
public://模板定义一个函数对象using Comp = function<bool(int,int)>;//这里默认大根堆PriorityQueue(int cap = 20, Comp comp = greater<int>()):size_(0), cap_(cap), comp_(comp){que_ = new int[cap_];}//PriorityQueue(Comp comp = greater<int>())PriorityQueue(Comp comp):size_(0), cap_(20), comp_(comp){que_ = new int[cap_];}~PriorityQueue(){delete[] que_;que_ = nullptr;}
public://入堆操作  O(log n)  O(1)void push(int val){//判断扩容if (size_ == cap_){int* p = new int[2 * cap_];memcpy(p,que_,cap_*sizeof(int));delete[]que_;que_ = p;cap_ *= 2;}if (size_ == 0){//只有一个元素,不用进行堆的上浮调整que_[size_] = val;}else{//堆里面有多个元素,需要进行上浮调整siftUp(size_,val);}size_++;}//出堆操作void pop(){if (size_ == 0)throw "container is empty!";size_--;if (size_ > 0){// 删除堆顶元素,还有剩余的元素,要进行堆的下沉调整siftDown(0,que_[size_]);}}bool empty() const { return size_ == 0; }int top()const{if (size_ == 0)throw "container is empty!";return que_[0];}int size() const { return size_; }
private://入堆上浮调整void siftUp(int i, int val){while (i > 0)//最多计算到根节点(0号位){int father = (i - 1) / 2;if (comp_(val, que_[father])){que_[i] = que_[father];i = father;}else{break;}}//把val放到i的位置que_[i] = val;}//出堆下沉调整void siftDown(int i, int val){//i下沉不能超过最后一个有孩子的节点//while (i <= (size_ - 1 - 1) / 2)while (i < size_ / 2){int child = 2 * i + 1;//第i个节点的左孩子if (child + 1 < size_ && comp_(que_[child+1],que_[child])){//如果i节点右孩子的值大于左孩子,child记录右孩子的下标child = child + 1;}if (comp_(que_[child], val)){que_[i] = que_[child];i = child;}else{break;//已经满足堆的性质,提前结束}}que_[i] = val;}
private:int* que_; // 指向动态扩容的数组int size_; // 数组元素的个数int cap_;  // 数组的总内存空间大小Comp comp_;  //比较器对象};

测试

int main()
{PriorityQueue que;//基于大根堆实现的优先级队列PriorityQueue que1([](int a, int b) {return a < b; });//基于小根堆实现的优先级队列srand(time(NULL));for (int i = 0; i < 10; i++){que.push(rand()%100);que1.push(rand() % 100);}while (!que.empty()){cout << que.top() << "  ";que.pop();}cout << endl;while (!que1.empty()){cout << que1.top() << "  ";que1.pop();}cout << endl;
}

堆排序代码实现

堆排序的实现,需要借助于大根堆或者小根队的性质。如果需要从小到大排序,需要借助于大根堆。反之,借助小根堆。

思路

对于下图所示无序原始序列,将其这些在数组里存放的元素,逻辑上看作一个二叉堆。
在这里插入图片描述

1、从第一个非叶子节点开始,把二叉堆调整成一个大根堆

其中,第一个非叶子节点的小标为 ( n - 1 )/2,如图所示为数字8
从第 ( n - 1 )/2号位元素开始,到堆元素(0),进行下沉操作。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、把堆顶元素和当前末尾元素进行交换,从零号位继续开始进行部分的堆的下沉

上一趟取得的剩余元素的最大值,将其置于末尾,该元素处理完毕。
下一趟就不管该值,对剩下的元素继续进行下沉操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、重复操作二,不断获取剩余元素最大值,并将其下沉

在这里插入图片描述

代码实现

//堆的下沉调整
void siftDown(int arr[], int i, int size)
{int val = arr[i];//记录一下要调整的值//while(i <= (size-1-1)/2)while (i < size / 2){int child = 2 * i + 1;if (child + 1 < size && arr[child + 1] > arr[child]){child = child + 1;}if (arr[child] > val){arr[i] = arr[child];i = child;  //i 继续指向其孩子,继续调整,直到最后一个有孩子节点的节点}else{break;}}arr[i] = val;
}//堆排序
void HeapSort(int arr[], int size)
{int n = size - 1;//从第一个非叶子节点for (int i = (n - 1) / 2; i >= 0; i--){siftDown(arr,i,size);}//将堆顶元素和当前末尾元素进行交换,从堆顶再一次进行下沉操作for (int i = n; i > 0; i--){int tmp = arr[0];arr[0] = arr[i];arr[i] = tmp;siftDown(arr,0,i); //第三个参数,参与调整的元素的个数,没处理一次,减一}
}

测试

int main()
{int arr[10];srand(time(NULL));for (int i = 0; i < 10; i++){arr[i] = rand() % 100 + 1;}for (int v : arr){cout << v << "  ";}cout << endl;HeapSort(arr, sizeof(arr) / sizeof(arr[0]));for (int v : arr){cout << v << "  ";}cout << endl;return 0;
}

在这里插入图片描述

4、性能测试

注意,rand 函数所给的随机数 范围为 0~32767。
cout << RAND_MAX << endl; // 打印rand函数所给随机数的最大值
如果测试数据量规模过大,例如千万、亿。其中重复的元素将会非常多。
所以为了测试的准确性,在每个测试区间内,都随机一些数据。例如区间0~32767,32768–32768+32767 …。第二个区间,随机数再加一些基数。

相关文章:

c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序

高阶排序 1、快速排序 冒泡排序的升级算法 每次选择一个基准数&#xff0c;把小于基准数的放到基准数的左边&#xff0c;把大于基准数的放到基准数的右边&#xff0c;采用 “ 分治算法 ”处理剩余元素&#xff0c;直到整个序列变为有序序列。 最好和平均的复杂度&#xff1a…...

特朗普画像

任务内容 Description 特朗普当选了&#xff0c;网上流传着很多段子&#xff0c;也出了特朗普的头像。有人说&#xff0c;特朗普 的头像像一团云。所以今年马云去了美国和特朗普谈中美企业的发展。那么你能帮 忙打印出特朗普的头像吗&#xff1f; 抽象派认为&#xff0c;特朗普…...

torch如何产生3d随机变形场(DVFs)

随机变形场(Deformation Vector Fields, DVFs)是一种在图像处理和计算机视觉中常用的技术,用于生成变形后的图像或增强数据集的多样性。它通过创建一个在空间中定义的位移场,以实现图像的随机变形。以下是生成随机DVFs的主要步骤和方法: 1. 随机噪声生成 随机变形场的基…...

【PlantUML系列】用例图(三)

目录 一、组成部分 二、典型案例 一、组成部分 参与者&#xff08;Actors&#xff09;&#xff1a;使用关键字 actor 后跟参与者的名称。用例&#xff08;Use Cases&#xff09;&#xff1a;使用关键字 usecase 后跟用例的名称和编号&#xff08;可选&#xff09;。系统边界…...

PHP使用RabbitMQ(正常连接与开启SSL验证后的连接)

代码中包含了PHP在一般情况下使用方法和RabbitMQ开启了SSL验证后的使用方法&#xff08;我这边消费队列是使用接口请求的方式&#xff0c;每次只从中取出一条&#xff09; 安装amqp扩展 PHP使用RabbitMQ前&#xff0c;需要安装amqp扩展&#xff0c;之前文章中介绍了Windows环…...

距离与AoA辅助的三维测距算法(适用于四个基站的情况的单点定位),MATLAB代码

本MATLAB 代码实现了一个基于LOS/NLOS混合环境的单点定位系统&#xff0c;主要用于估计目标物体的单点位 文章目录 代码运行结果源代码代码功能概述主要步骤分析初始化部分 绘图与输出 代码运行结果 定位结果如下&#xff1a; 命令行的坐标和误差输出&#xff1a; 部分代码…...

计算机网络原理之HTTP与HTTPS

一、前言 为了理解HTTP&#xff0c;我们有必要事先了解一下TCP/IP协议簇。 通常我们使用的网络&#xff08;包括互联网&#xff09;是在TCP/IP协议簇的基础上运作的。而HTTP属于它内部的一个子集。 计算机与网络设备要相互通信&#xff0c;双方必须基于相同的方法。比如&#…...

使用did包进行多期DID分析

本例中&#xff0c;样例数据来自 Callaway 和 Sant’Anna (2020)&#xff0c;研究问题是各州提高最低工资对县级青少年就业率影响。 样例数据集包含 2003 年至 2007 年 500 个县级青少年就业率的数据&#xff0c;其中一些州在 2004 年首次接受治疗&#xff0c;也有一些在 2006…...

Windows宝塔面板下IIS环境如何部署SSL证书?

Windows宝塔面板下IIS环境如何部署SSL证书&#xff1f; 平时服务器linux宝塔用的较多&#xff0c;所以linux系统宝塔&#xff0c;如何部署SSL证书还是比较熟悉&#xff0c;今天遇到一个windows的部署SSL证书&#xff0c;还是头一次&#xff0c;所以记录一下&#xff0c;以防忘…...

【MySQL】函数

函数 1.日期函数2.字符串函数3.数学函数4.其他函数 点赞???收藏???关注??? 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧??? 在mysql中其实内置了很多的函数操作&#xff0c;这些函数可以让我们在数据统计的时候以及查表的时候进行各自各样的操作。 1.日…...

面试复盘 part 02·1202-1207 日

作品集讲述部分 分析反思 作品集讲述部分&#xff0c;视觉讲述部分需要更换&#xff0c;需要换成其他视觉相关的修改 具体话术 这是一个信息展示优化方案&#xff0c;用户为财务&#xff0c;信息区分度不足&#xff0c;理解成本较高&#xff0c;因此选择需要降低理解成本。…...

RISC-V 汇编语言

安装RISCV工具链 riscv-gnu-toolchain工具链和模拟器安装记录 - 知乎 (zhihu.com) riscv-gnu-toolchain工具链分elf-gcc、linux-gnu-gcc两个版本&#xff0c;以及对应的32位和64位版本。两个版本的主要区别是&#xff1a; riscv32-unknown-elf-gcc、riscv64-unknown-elf-gcc…...

MySQL Explain 指南

MySQL Explain 指南 idselect_typetablepartitionstypepossible_keyskeykeylenrefrowsfilteredExtra 使用 explain 执行 DML 语句时&#xff0c;数据不会发生变化。explain 的结果可能包含多行数据&#xff0c;每行对应一个表。若涉及 union 操作&#xff0c;MySQL 会创建临时表…...

keil报错---connection refused due to device mismatch

解决办法如下&#xff1a; 记得改成1 把Enable取消...

ubuntu下的chattts 学习4:Advanced Usage

源码 import ChatTTS import torch import torchaudiochat ChatTTS.Chat() chat.load(compileFalse) # Set to True for better performance ################################### # Sample a speaker from Gaussian.rand_spk chat.sample_random_speaker() print(rand_spk)…...

Ubuntu桌面突然卡住,图形界面无反应

1.可能等待几分钟&#xff0c;系统会自动反应过来。你可以选择等待几分钟。 2.绝大多数情况系统是不会反应过来的&#xff0c;这时候可以进入tty终端直接注销用户。 (1)Ubuntu有6个tty终端&#xff0c;按住CtrlAltF1可以进入tty1终端&#xff0c;&#xff08;同理CtrlAltF2&a…...

毕设记录_论文阅读(动磁式音圈电机的开发与应用)_20241207

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…...

我有一个Python项目,已经用docker打包镜像也push了,k8s怎么部署呢?

要在Kubernetes (k8s) 部署你的Python项目&#xff0c;你需要创建一系列的Kubernetes资源定义文件&#xff08;通常是以.yaml为扩展名&#xff09;&#xff0c;这些文件描述了你希望在集群中运行的应用程序。以下是部署的基本步骤&#xff1a; 1. **准备Docker镜像**&#xff1…...

GAN(生成对抗网络)原理与目标函数

GAN&#xff08;生成对抗网络&#xff09;原理与目标函数 什么是 GAN&#xff1f; GAN 是一种生成模型&#xff0c;全名是 生成对抗网络 (Generative Adversarial Network)。它由两个部分组成&#xff1a; 生成器 (Generator, G)&#xff1a;负责生成“假数据”。判别器 (Di…...

[Java]项目入门

这篇简单介绍一些入门的有关项目和行业的知识&#xff0c;并带着实现一个小项目。便于已经编程入门的各位准备进阶到下一个阶段。 先大致地介绍&#xff0c;一个完整的项目(不看客户端、服务端的分类)基本可以划分为三部分&#xff1a; 1.前端。比如你现在看到的CSDN页面就是一…...

自定义指令,全局,局部,注册

让输入框自动获取焦点(每次刷新自动获取焦点&#xff09; <template><div><h3>自定义指令</h3><input ref"inp" type"text"></div> </template><script> export default {mounted(){this.$refs.inp.focus…...

存储类内存,非易失性内存)的升级换代,将有利于促进【PCIe交换芯片】市场的发展

摘要 根据 HengCe&#xff08;恒策咨询&#xff09;的统计及预测&#xff0c;2023年全球PCIe交换芯片市场销售额达到了10.05亿美元&#xff0c;预计2030年将达到23.81亿美元&#xff0c;年复合增长率&#xff08;CAGR&#xff09;为12.5%&#xff08;2024-2030&#xff09;。地…...

泷羽sec-burp(7)

免责声明 学习视频来自 B 站up主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 泷羽sec官网&#xff1a;http…...

OpenCV图像处理——二值化原理与代码实现(C++/Python)

概述 在 OpenCV 中&#xff0c;二值化&#xff08;Binarization&#xff09;是一种图像处理操作&#xff0c;它的目的是将一幅灰度图像转换为仅包含两种像素值&#xff08;通常为 0 和 255&#xff0c;分别代表黑色和白色&#xff09;的二值图像。通过设定一个合适的阈值&…...

Scala 高阶模式案例解析:从入门到实战

引言 Scala 作为一种功能强大的多范式编程语言&#xff0c;因其函数式编程特性而广受欢迎。其中&#xff0c;高阶模式&#xff08;High-Order Patterns&#xff09;是 Scala 函数式编程的核心概念之一&#xff0c;为开发者提供了解决复杂问题的优雅方式。本篇文章将全面解析 S…...

30天学会Go--第8天 GO语言 Gin Web框架学习与实践

30天学会Go–第8天 GO语言 Gin Web框架学习与实践 文章目录 30天学会Go--第8天 GO语言 Gin Web框架学习与实践前言一、Gin 的简介与安装1.1 Gin 的特点1.2 安装 Gin 二、Gin 的基础用法2.1 路由2.1.1 基本路由2.1.2 路由参数2.1.3 查询参数2.1.4 路由分组 2.2 中间件2.2.1 使用…...

用R(语言)学R-Learning R,In R

一、安装swirl包 在R语言控制面板&#xff0c;对话框输入以下命令&#xff1a; swirl 是一个非常有用的 R 包&#xff0c;它允许你通过交互式教程来学习 R 语言。以下是使用 swirl 包的基本步骤&#xff1a; 安装 swirl 包&#xff1a;首先&#xff0c;你需要在 R 中安装 swi…...

【银河麒麟操作系统运维】某平台多台虚拟机异常重启分析及处理

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 某虚拟化平台多台虚拟机于凌晨触发异常…...

线性代数中的谱分解

一、谱分解的基本原理 谱分解&#xff08;Spectral Decomposition&#xff09;是线性代数中的一个重要概念&#xff0c;特别是在研究矩阵的特征值和特征向量时。它指的是将一个矩阵分解为其特征值和特征向量的组合&#xff0c;从而简化矩阵的运算和分析。谱分解通常适用于对称…...

synchronized(juc)

目录 线程一&#xff1a;interrupt设计模式两阶段终止模式interrupt打断park线程 二:守护线程三:线程状态五个状态(从操作系统角度来说)六种状态(从java API的角度) 共享模型之管程一&#xff1a;上下文切换的安全问题临界区和竟态条件 二&#xff1a;synchronized解决安全问题…...

HTML Input 文件上传功能全解析:从基础到优化

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

深入理解Spring事务

目录 什么是Spring事务为什么需要Spring事务Spring事务的实现 Spring事务的传播机制Spring事务的底层原理 EnableTransactionManagement --开启Spring管理事务Import(TransactionManagementConfigurationSelector.class) --提供两个beanAutoProxyRegistrar --启用AOP的功能&am…...

React学习笔记2-初识React

这篇七个点&#xff1a;1 环境搭建&#xff0c; 2 JSX&#xff0c; 3 组件&#xff0c;4 数据流&#xff0c;5 生命周期&#xff0c;6 React与DOM&#xff0c;7 实例 1 环境搭建 1.1 引用React CDN <!DOCTYPE html> <html lang"en"> <head><met…...

【5G】Spectrum 频谱

频谱是移动运营商的关键资产&#xff0c;可用的频谱是定义移动网络容量和覆盖范围的重要因素。本章讨论了5G的不同频谱选项、它们的特性以及5G早期部署阶段的预期频谱。5G是首个旨在利用大约400 MHz到90 GHz之间所有频段的移动无线系统。5G还设计用于在许可、共享和非许可频谱带…...

解决流网络中不存在s~u~t路径的节点的最大流问题

解决流网络中不存在s~u~t路径的节点的最大流问题 问题分析伪代码C代码示例解释在流网络问题中,我们通常会假设对于所有的节点v ∈ V,都存在一条从源点s到汇点t经过v的路径。然而,当这一假设不成立时,即存在某些节点u,使得不存在路径sut,我们需要证明在这种情况下,网络中…...

springboot的 nacos 配置获取不到导致启动失败及日志不输出问题

前言 问题 1. 本地启动应用时&#xff0c;一切正常&#xff0c;但是部署 docker 后&#xff0c;会因为获取不到 nacos 中的配置导致服务启动失败。 2.当 docker 中的服务一直重启&#xff0c;可能会突然某一次启动成功&#xff0c;之后只要不重新构建 docker 镜像&am…...

word poi-tl 图表功能增强,插入图表折线图、柱状图、饼状图

目录 问题解决问题poi-tl介绍 功能实现引入依赖功能介绍 功能实例饼图模版代码效果图 雷达图&#xff08;模版同饼图&#xff09;代码效果图 柱状图&#xff08;模版同饼图&#xff09;代码效果图 附加CustomCharts 工具类CustomChartSingleSeriesRenderData 数据对象CustomCha…...

SpringBoot 项目如何集成 JWT

SpringBoot 项目如何集成 JWT JWT JSON Web Token (JWT) 是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为 JSON 对象在各方之间安全地传输信息。 在 Oauth2 中&#xff0c;其实就是返回访问令牌 &#xff08;access_token&#…...

如何查看电脑刷新率

Windows 系统 通过显示设置查看&#xff1a; 右键点击桌面空白处&#xff0c;选择 “显示设置”。在打开的窗口中&#xff0c;找到 “高级显示设置”。点击 “显示适配器属性”。在弹出的窗口中&#xff0c;选择 “监视器” 选项卡&#xff0c;即可看到当前的屏幕刷新率。使用 …...

MVC基础——市场管理系统(一)

文章目录 项目地址一、创建项目结构1.1 创建程序以及Controller1.2 创建View1.3 创建Models层,并且在Edit页面显示1.4 创建Layou模板页面1.5 创建静态文件css中间件二、Categories的CRUD2.1 使用静态仓库存储数据2.2 将Categorie的列表显示在页面中(List)2.3 创建_ViewImport.…...

面向对象中多态的含义

多态性的定义 多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个重要概念。它是指同一个函数名或操作符在不同的对象或情境下具有不同的行为。简单来说&#xff0c;就是 “多种形态”。例如&#xff0c;在一个图形处理程序中&#xff0c;有 “计算面积” 这个操…...

L2G3000-LMDeploy 量化部署实践

文章目录 LMDeploy 量化部署实践闯关任务环境配置W4A16 量化 KV cacheKV cache 量化Function call LMDeploy 量化部署实践闯关任务 环境配置 conda create -n lmdeploy python3.10 -y conda activate lmdeploy conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.…...

ubuntu下的chattts 学习5:Example: self introduction

代码 import ChatTTS import torch import torchaudiochat ChatTTS.Chat() chat.load(compileFalse) # Set to True for better performance ################################### inputs_en """ chat T T S is a text to speech model designed for dialogu…...

IDEA的service窗口中启动类是灰色且容易消失

大家在学习Spring Cloud的过程中,随着项目的深入,会分出很多个微服务,当我们的服务数量大于等于三个的时候,IDEA会给我们的服务整理起来,类似于这样 但是当我们的微服务数量达到5个以上的时候,再启动服务的时候,服务的启动类就会变成灰色,而且还容易丢失 解决方法 我们按住…...

vue中pdf.js的使用,包括pdf显示,跳转指定页面,高亮关键词

目录 一、下载pdf.js 二、引入到本地的项目中 三、实现预览pdf 四、跳转到指定页面 五、利用pdf里面的find查找关键词 六、修改页面大小为实际大小 一、下载pdf.js https://github.com/mozilla/pdf.js 里面有很多的版本&#xff0c; 高版本的可能浏览器不兼容或者还要考…...

Cherno C++学习笔记 P32 字符串

这篇文章我们来讲字符串。字符串可以说是最重要的变量类型了&#xff0c;因为对字符串的读写极大地影响到我们的程序和用户之间的交互。甚至很多很庞大的程序就只是在处理字符串。 对于字符串&#xff0c;我们同时需要有关于数组和指针的关系&#xff0c;字符串的实现与数组是…...

【C++初阶】第7课—标准模版库STL(string_1)

文章目录 1. 什么是STL2. STL六大组件3. 标准库中string类3.1 auto关键字3.2 范围for3.3 string类的类型3.4 string类的常用接口(string类对象的常见构造)3.5 string的析构和赋值运算符重载3.6 string类对象的容量操作 1. 什么是STL STL(standard template library—标准模板库…...

GESP202306 一级【时间规划】题解(AC)

》》》点我查看「视频」详解》》》 AC_Code #include <bits/stdc.h> using namespace std;int main() {int h1, m1, h2, m2;cin >> h1 >> m1;cin >> h2 >> m2;h1 h1 * 60 m1;h2 h2 * 60 m2;cout << h2 - h1;return 0; }》》》点我查…...

React基础知识四 Hooks

什么是hooks&#xff1f; (coderwhy) hooks是react 16.8&#xff08;2019年&#xff09;出的新特性。 react有两种形式来创建组件——类式和函数式。在hooks之前类式组件就是react最主流的编程方式。 这个时候&#xff0c;函数式组件是非常鸡肋的&#xff0c;几乎没什么用。因…...

Linux服务器通用安全加固指南

1、保护引导过程&#xff08;以Grub引导为例&#xff09; 在 /etc/inittab 中添加 sp:S:respawn:/sbin/sulogin&#xff0c;以确保当切换到单用户模式时 运行级的配置要求输入 root 密码&#xff1a; cp /etc/inittab / etc/initab .bak vim /etc/inittab 退出&#xff1a;es…...