算法与竞赛(第15章) - 矩阵高级运算

第1关:矩阵(方阵)行列式

任务描述
本关任务:掌握特殊矩阵(方阵)的行列式的概念,编程实现n阶行列式的值。例如2阶方阵:,它的行列式的值为:Det(A)=1×4−2×3=−2。

相关知识
为了完成本关任务,你需要掌握:1.行列式的定义。

行列式的定义
当一个矩阵的行数和列数相等时,称这个矩阵为方阵,若行数为1,则称之为一阶方阵,若行数为2,则称之为二阶方阵,以此类推,若行数为n,则称之为n阶方阵。

一阶方阵只有一个元素,它的行列式的值就是本身。记方阵为A,行列式的值用D表示,则D=Det(A)。

二阶方阵每行每列都是两个元素,设二阶方阵,那么二阶行列式记为,并称a 
ij

 (i,j=1,2)为行列式的元素。二阶行列式即是由四个元素排列成两行两列,并按一定规则得到的一个值。例如:

三阶行列式则是形如的数据块,即由9个元素排成的三行三列,并按一定规则得到的一个值,记三阶行列式为D,则。例如:

n阶行列式为由n 
2
 个元素a 
ij

 (i,j=1,2,..,n)排成n行n列,并按一定规则得到的一个值,记为:,其值为n!项之和:,其中是将序列的元素次序交换k次所得到的一个序列,k即为交换后的序列相对原序列的逆序数(在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数)。

编程要求
本关的编程任务是补全右侧代码片段Determinant_1、Determinant_2、Determinant_3、Inverse_Number和Determinant_n中Begin至End中间的代码,具体要求如下:

在Determinant_1中,计算一阶方阵的行列式,并返回行列式的值。

在Determinant_2中,计算二阶方阵的行列式,并返回行列式的值。

在Determinant_3中,计算三阶方阵的行列式,并返回行列式的值。

在Inverse_Number中,计算由n个数组成的序列(整型数组a)的逆序数,并返回逆序数值。

在Determinant_n中,计算n阶方阵的行列式,并返回行列式的值。

测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:
2
1 2
3 4
预期输出:
-2

开始你的任务吧,祝你成功!

//
//  main.cpp
//  step1
//
//  Created by ljpc on 2018/11/29.
//  Copyright © 2018年 ljpc. All rights reserved.
//#include <iostream>
#include <algorithm>using namespace std;
int det(int n, int** mat)
{int mov = 0;int flag;int sum = 0;if (n == 1) return mat[0][0];int** b = new int* [n - 1];for (int z = 0; z < n - 1; ++z)b[z] = new int[n - 1];for (int i = 0; i < n; ++i){for (int j = 0; j < n - 1; ++j) {mov = i > j ? 0 : 1;for (int k = 0; k < n - 1; ++k)b[j][k] = mat[j + mov][k + 1];}if (i % 2 == 0) flag = 1;else flag = -1;sum += flag * mat[i][0] * det(n - 1, b);}delete[] b;return sum;
}
struct Matrix{int m, n;int **val;Matrix(){}Matrix(int m_, int n_){m = m_;n = n_;this->val = (int**)malloc(sizeof(int*)*m);for(int i=0;i<m;i++){this->val[i] = (int*)malloc(sizeof(int)*n);}}void in(){for(int i=0;i<m;i++){for(int j=0;j<n;j++){scanf("%d", &this->val[i][j]);}}}void out(){for(int i=0;i<m;i++){printf("%d", this->val[i][0]);for(int j=1;j<n;j++){printf(" %d", this->val[i][j]);}printf("\n");}}int Determinant_1 (){// 请在这里补充代码,完成本关任务/********* Begin *********/return val[0][0];/********* End *********/}int Determinant_2 (){// 请在这里补充代码,完成本关任务/********* Begin *********/return (val[0][0] * val[1][1] - val[0][1] * val[1][0]);/********* End *********/}int Determinant_3 (){// 请在这里补充代码,完成本关任务/********* Begin *********/int left = val[0][0] * val[1][1] * val[2][2] + val[0][1] * val[1][2] * val[2][0] + val[1][0] * val[2][1] * val[0][2];int right = val[2][0] * val[1][1] * val[0][2] + val[1][0] * val[0][1] * val[2][2] + val[2][1] * val[1][2] * val[0][0];return left - right;/********* End *********/}int Inverse_Number(int n, int arr[]){// 请在这里补充代码,完成本关任务/********* Begin *********/int count = 0;for (int i = 0; i < n - 1; i++) {for (int j = i + 1; j < n; j++) {if (arr[i] > arr[j]) {count++;break;}}}return count;/********* End *********/}int Determinant_n (){// 请在这里补充代码,完成本关任务/********* Begin *********/int res = det(this->n, this->val);return res;/********* End *********/}int Determinant (){if(this->n==1){return Determinant_1();}else if(this->n==2){return Determinant_2();}else if(this->n==3){return Determinant_3();}else {return Determinant_n();}}};int main(int argc, const char * argv[]) {int n;scanf("%d", &n);Matrix A(n,n);A.in();int det = A.Determinant();printf("Det(A)=%d\n", det);return 0;
}

第2关:矩阵逆运算

任务描述
本关任务:掌握特殊矩阵(方阵)的逆的概念,编程实现n阶矩阵的逆矩阵。

例如:矩阵,其逆矩阵。

相关知识
为了完成本关任务,你需要掌握:1.单位矩阵的定义,2.代数余子式,3.伴随矩阵,4.逆矩阵的定义。

单位矩阵的定义
单位矩阵的定义:从左上角到右下角的对角线(称为主对角线)上的元素均为1,除此以外全都为0。

代数余子式
设矩阵A=(a 
ij

 ),将矩阵A的元素aij所在的第i行第j列去掉后,余下的(n−1) 
2
 项按原来的排列顺序组合成的(n−1)阶矩阵所确定的行列式称为元素aij的余子式,即为Mij,称Aij=(−1) 
i+j
 Mij为元素aij的代数余子式。

伴随矩阵
矩阵A=(a 
ij

 ) 
n×n

 的各元素的代数余子式Aij所构成的如下矩阵A 

 :

该矩阵A 

 称为矩阵A的伴随矩阵。

逆矩阵的定义
给定整数a和b,且b 


 =0,则a除以b可写为: 
b
a

 =ab 
−1
 ,在等式中,称b 
−1
 = 
b
1

 为b的逆元,显然有b 
−1
 b=bb 
−1
 =1。

对于矩阵来说,矩阵的除法可以归结为乘法运算。对于n阶矩阵(方阵)A,若存在n阶矩阵B,使得:AB=BA=I,其中I为单位矩阵,则称B为A的逆矩阵,并称A为可逆矩阵或可逆方阵,记A的逆矩阵为A 
−1
 。

特别的,由行列式的乘法可得等式∣A∣∣A 
−1
 ∣=∣AA 
−1
 ∣=∣I∣=1,因此∣A∣ 


 =0。可见,要判断一个矩阵是否有逆矩阵存在,只需要判断该矩阵是否为非奇异矩阵(行列式的值不等于零)。

设矩阵A为n阶非奇异矩阵,则A有唯一的一个逆矩阵A 
−1
 :

其中,A 

 为A的伴随矩阵,为行列式∣A∣中元素的代数余子式。

编程要求
本关的编程任务是补全右侧代码片段Cofactor、Adjugate_Matrix、Inverse_Matrix和Identity_Matrix中Begin至End中间的代码,具体要求如下:

在Cofactor中,根据矩阵余子式的定义,计算去掉矩阵第x行第y列元素后的余子式,并返回该余子式的值。

在Adjugate_Matrix中,根据伴随矩阵的定义,借助Cofactor函数计算矩阵(∗this)的伴随矩阵,并返回该伴随矩阵。

在Inverse_Matrix中,根据逆矩阵的定义,通过计算矩阵的行列式的值及其伴随矩阵,求得矩阵(∗this)的逆矩阵并返回。

在Identity_Matrix中,根据单位矩阵的定义,判断矩阵(∗this)是否为单位矩阵,若是,返回true,否则,返回false。

测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:
2
1 2
3 4
预期输出:
-2.0000 1.0000
1.5000 -0.5000

开始你的任务吧,祝你成功!

//
//  main.cpp
//  step2
//
//  Created by ljpc on 2018/11/29.
//  Copyright © 2018年 ljpc. All rights reserved.
//#include <iostream>
#include <algorithm>using namespace std;#define eps 1e-8
inline int sig(double x){return (x>eps)-(x<-eps); }struct Matrix{int m, n;double **val;Matrix(){}Matrix(int m_, int n_){m = m_;n = n_;this->val = (double**)malloc(sizeof(double*)*m);for(int i=0;i<m;i++){this->val[i] = (double*)malloc(sizeof(double)*n);}}void in(){for(int i=0;i<m;i++){for(int j=0;j<n;j++){scanf("%lf", &this->val[i][j]);}}}void out(){for(int i=0;i<m;i++){printf("%.4lf", this->val[i][0]);for(int j=1;j<n;j++){printf(" %.4lf", this->val[i][j]);}printf("\n");}}Matrix operator * (const double r)const{int m_ = this->m;int n_ = this->n;Matrix A = *this;Matrix M(m_, n_);for(int i=0;i<m_;i++){for(int j=0;j<n_;j++){M.val[i][j] = A.val[i][j] * r;}}return M;}Matrix operator * (const Matrix B)const{Matrix A = *this;Matrix M(A.m, B.n);if(A.n!=B.m){printf("error\n");}for(int i=0;i<A.m;i++){for(int j=0;j<B.n;j++){double sum = 0;for(int k=0;k<A.n;k++){sum += A.val[i][k] * B.val[k][j];}M.val[i][j] = sum;}}return M;}int Inverse_Number (int n, int arr[]) {int num = 0;for(int i=0;i<n;i++){for(int j=0;j<i;j++){if(arr[j]>arr[i]){num++;}}}return num;}double Determinant () {Matrix D = *this;double det = 0;int *arr;arr = (int*)malloc(sizeof(int)*D.n);for(int i=0;i<D.n;i++){arr[i] = i;}do{int inv = Inverse_Number(D.n, arr);double tmp = (inv%2==0)?1:-1;for(int i=0;i<D.n;i++){tmp *= D.val[i][arr[i]];}det += tmp;}while(next_permutation(arr, arr+D.n));return det;}double Cofactor (int x, int y) {// 请在这里补充代码,完成本关任务/********* Begin *********/Matrix C = Matrix(this->n-1,this->n-1);for(int i=0;i<x;i++){for(int j=0;j<y;j++){C.val[i][j] = this->val[i][j];}}for(int i=0;i<x;i++){for(int j=y+1;j<this->n;j++){C.val[i][j-1] = this->val[i][j];}}for(int i=x+1;i<this->n;i++){for(int j=0;j<y;j++){C.val[i-1][j] = this->val[i][j];}}for(int i=x+1;i<this->n;i++){for(int j=y+1;j<this->n;j++){C.val[i-1][j-1] = this->val[i][j];}}double det_c = C.Determinant();return det_c;/********* End *********/}Matrix Adjugate_Matrix () {// 请在这里补充代码,完成本关任务/********* Begin *********/Matrix A = Matrix(this->n, this->n);for(int i=0;i<A.n;i++){for(int j=0;j<A.n;j++){int flag = ((i+j)%2==0)?1:-1;int M_ij = Cofactor(i, j);A.val[j][i] = flag * M_ij;}}return A;/********* End *********/}Matrix Inverse_Matrix (){// 请在这里补充代码,完成本关任务/********* Begin *********/double det = Determinant();if(det == 0){printf("error\n");return Matrix();}Matrix I = Matrix(this->n, this->n);Matrix A = Matrix(this->n, this->n);A = Adjugate_Matrix();I = A * (1./det);return I;/********* End *********/}bool Identity_Matrix() {// 请在这里补充代码,完成本关任务/********* Begin *********/for(int i=0;i<this->n;i++){for(int j=0;j<this->n;j++){if(i==j){if(sig(this->val[i][j]-1)!=0){return false;}}else {if(sig(this->val[i][j]-0)!=0){return false;}}}}return true;/********* End *********/}};int main(int argc, const char * argv[]) {int n;scanf("%d", &n);Matrix A(n,n);A.in();Matrix I(n,n);I = A.Inverse_Matrix();I.out();Matrix E1(n,n);Matrix E2(n,n);E1 = A*I;E2 = I*A;if(E1.Identity_Matrix()==false){printf("A*I error\n");E1.out();}if(E2.Identity_Matrix()==false){printf("I*A error\n");E2.out();}return 0;
}

第3关:矩阵初等变换

任务描述
本关任务:掌握矩阵的初等变换的基本操作,并通过矩阵初等变换计算n阶矩阵的逆矩阵。

相关知识
为了完成本关任务,你需要掌握:1.初等变换的定义,2.初等行变换求逆矩阵,3.初等列变换求逆矩阵。

初等变换的定义
对一个矩阵施行下面的变换称之为矩阵的初等变换:

对换矩阵的某两行或两列;
任一非零常数乘以矩阵的某行或某列;
常数乘以矩阵的某行(列)元素加到另一行(列)的对应元素上。
根据施行在行或是列上,初等变换可分为初等行变换和初等列变换。

初等行变换求逆矩阵
通过初等行变换可以将形如的矩阵转换为形如的矩阵。具体步骤如下:

初始i=1,将第i行的所有元素a[i,j],j∈[i,n]除以a[i,i]。

枚举第i+1行至第m行,将第k∈[i+1,m]行的元素进行初等变换:
 flag=a[k,i]
 a[k,j]=a[k,j]−flag×a[i,j],j∈[i,n]

若i<=n,则i=i+1,跳回第1−2步。否则将得到如下形式的矩阵(左半部分左下元素全为0):

初始i=m,将第i行的所有元素a[i,j],j∈[i,n]除以a[i,i]。

枚举第1行至第i−1行,将第k∈[1,i−1]行的元素进行初等变换:
 flag=a[k,i]
 a[k,j]=a[k,j]−flag×a[i,j],j∈[k,n]

若i>0,则i=i−1,跳回第4−5步。否则将得到如下形式的矩阵(左半部分右上元素全为0):

最终,左半部分的矩阵即为单位矩阵,右半部分的矩阵即为A 
−1
 。

初等列变换求逆矩阵
通过初等列变换可以将形如的矩阵转换为形如的矩阵。具体步骤同初等行变换类似。

编程要求
本关的编程任务是补全右侧代码片段Elementary_Row_Transformation和Elementary_Col_Transformation中Begin至End中间的代码,具体要求如下:

在Elementary_Row_Transformation中,矩阵R的左半部分是原矩阵,右半部分是单位矩阵,借助矩阵初等行变换,将矩阵R的左半部分变换为单位矩阵,右半部分变换为原矩阵的逆矩阵。

在Elementary_Col_Transformation中,矩阵C的上半部分是原矩阵,下半部分是单位矩阵,借助矩阵初等列变换,将矩阵C的上半部分变换为单位矩阵,下半部分变换为原矩阵的逆矩阵。

测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:
2
1 2
3 4
预期输出:
1.0000 0.0000 -2.0000 1.0000
0.0000 1.0000 1.5000 -0.5000

1.0000 0.0000
0.0000 1.0000
-2.0000 1.0000
1.5000 -0.5000

开始你的任务吧,祝你成功!

//
//  main.cpp
//  step3
//
//  Created by ljpc on 2018/11/29.
//  Copyright © 2018年 ljpc. All rights reserved.
//#include <iostream>
#include <algorithm>using namespace std;#define eps 1e-8
inline int sig(double x){return (x>eps)-(x<-eps); }struct Matrix{int m, n;double **val;Matrix(){}Matrix(int m_, int n_){m = m_;n = n_;this->val = (double**)malloc(sizeof(double*)*m);for(int i=0;i<m;i++){this->val[i] = (double*)malloc(sizeof(double)*n);}}void in(){for(int i=0;i<m;i++){for(int j=0;j<n;j++){scanf("%lf", &this->val[i][j]);}}}void out(){for(int i=0;i<m;i++){printf("%.4lf", this->val[i][0]+eps);for(int j=1;j<n;j++){printf(" %.4lf", this->val[i][j]+eps);}printf("\n");}}Matrix Elementary_Row_Transformation (){Matrix R = Matrix(this->n, this->n*2);for(int i=0;i<this->n;i++){for(int j=0;j<this->n;j++)R.val[i][j] = this->val[i][j];for(int j=this->n;j<this->n*2;j++)R.val[i][j] = ((j-this->n)==i)?1:0;}// 请在这里补充代码,完成本关任务/********* Begin *********/for(int i=0;i<R.m;i++){double flag = R.val[i][i];for(int j=i;j<R.n;j++){R.val[i][j] /= flag;}for(int k=i+1;k<R.m;k++){flag = R.val[k][i];for(int j=i;j<R.n;j++){R.val[k][j] -= flag * R.val[i][j];}}}for(int i=R.m-1;i>=0;i--){double flag = R.val[i][i];for(int j=i;j<R.n;j++){R.val[i][j] /= flag;}for(int k=i-1;k>=0;k--){flag = R.val[k][i];for(int j=k;j<R.n;j++){R.val[k][j] -= flag * R.val[i][j];}}}/********* End *********/return R;}Matrix Elementary_Col_Transformation (){Matrix C = Matrix(this->n*2, this->n);for(int j=0;j<this->n;j++){for(int i=0;i<this->n;i++)C.val[i][j] = this->val[i][j];for(int i=this->n;i<this->n*2;i++)C.val[i][j] = ((i-this->n)==j)?1:0;}// 请在这里补充代码,完成本关任务/********* Begin *********/for(int j=0;j<C.n;j++){double flag = C.val[j][j];for(int i=j;i<C.m;i++){C.val[i][j] /= flag;}for(int k=j+1;k<C.n;k++){flag = C.val[j][k];for(int i=j;i<C.m;i++){C.val[i][k] -= flag * C.val[i][j];}}}for(int j=C.n-1;j>=0;j--){double flag = C.val[j][j];for(int i=j;i<C.m;i++){C.val[i][j] /= flag;}for(int k=j-1;k>=0;k--){double flag = C.val[j][k];for(int i=j;i<C.m;i++){C.val[i][k] -= flag * C.val[i][j];}}}/********* End *********/return C;}
};int main(int argc, const char * argv[]) {int n;scanf("%d", &n);Matrix A(n,n);A.in();Matrix R = Matrix(n, n*2);R = A.Elementary_Row_Transformation();R.out();printf("\n");Matrix C = Matrix(n*2, n);C = A.Elementary_Col_Transformation();C.out();printf("\n");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/57986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 过期策略 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 过期策略 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 过期策略 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis &a…

python 制作 发货单 (生成 html, pdf)

起因&#xff0c; 目的: 某个小店&#xff0c;想做个发货单。 过程: 先写一个 html 模板。准备数据&#xff0c; 一般是从数据库读取&#xff0c;也可以是 json 格式&#xff0c;或是 python 字典。总之&#xff0c;是数据内容。使用 jinja2 来渲染模板。最终的结果可以是 h…

【Jenkins】解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题

解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题 1. 确定物理机docker和docker compose已经安装2. 编写Jenkins Agent结点docker-compose.yaml配置文件3. 修改docker运行时文件权限4. 启动容器并验证 最近接触到一个发布产物是一个 docker镜像的项…

AAPL: Adding Attributes to Prompt Learning for Vision-Language Models

文章汇总 当前的问题 1.元标记未能捕获分类的关键语义特征 如下图(a)所示&#xff0c; π \pi π在类聚类方面没有显示出很大的差异&#xff0c;这表明元标记 π \pi π未能捕获分类的关键语义特征。我们进行简单的数据增强后&#xff0c;如图(b)所示&#xff0c;效果也是如…

Android使用协程实现自定义Toast弹框

Android使用协程实现自定义Toast弹框 ​ 最近有个消息提示需要显示10s,刚开始使用协程写了一个shoowToast方法&#xff0c;传入消息内容、显示时间和toast显示类型即可&#xff0c;以为能满足需求&#xff0c;结果测试说只有5s&#xff0c;查看日志和源码发现Android系统中Toa…

【AI大模型】深入解析 存储和展示地理数据(.kmz)文件格式:结构、应用与项目实战

文章目录 1. 引言2. 什么是 .kmz 文件&#xff1f;2.1 .kmz 文件的定义与用途2.2 .kmz 与 .kml 的关系2.3 常见的 .kmz 文件使用场景 3. .kmz 文件的内部结构3.1 .kmz 文件的压缩格式3.2 解压缩 .kmz 文件的方法3.3 .kmz 文件的典型内容3.4 .kml 文件的结构与主要元素介绍 4. 深…

WPF+Mvvm案例实战(五)- 自定义雷达图实现

文章目录 1、项目准备1、创建文件2、用户控件库 2、功能实现1、用户控件库1、控件样式实现2、数据模型实现 2、应用程序代码实现1.UI层代码实现2、数据后台代码实现3、主界面菜单添加1、后台按钮方法改造&#xff1a;2、按钮添加&#xff1a;3、依赖注入 3、运行效果4、源代码获…

TikTok运营对IP有什么要求?

TikTok在进行直播带货时&#xff0c;网络环境的配置尤为关键&#xff0c;网络质量直接影响到直播效果&#xff0c;因此选择稳定的IP地址很重要。那么&#xff0c;TikTok直播时该选择什么样的IP地址呢&#xff1f;接下来&#xff0c;我们来深入分析一下。 TikTok对IP地址的要求 …

解读数字化转型的敏捷架构:从理论到实践的深度分析

在当今数字经济的推动下&#xff0c;企业要在瞬息万变的市场中保持竞争力&#xff0c;数字化转型已经不再是一种选择&#xff0c;而是不可避免的战略需求。然而&#xff0c;企业如何从理论到实践进行有效的转型&#xff0c;尤其是在复杂的技术环境中&#xff0c;如何通过正确的…

【FISCO BCOS】二十二、使用Key Manager加密区块链节点

#1024程序员节&#xff5c;征文# 落盘加密是对节点存储在硬盘上的内容进行加密&#xff0c;加密的内容包括&#xff1a;合约的数据、节点的私钥。具体的落盘加密介绍&#xff0c;可参考&#xff1a;落盘加密的介绍&#xff0c;今天我们来部署并对节点进行落盘加密。 环境&a…

信息学奥赛后的发展路径:科技创新、竞赛选拔还是学术研究?

参加信息学奥赛&#xff08;OI&#xff09;后&#xff0c;学生往往具备了较强的编程能力、逻辑思维和算法知识&#xff0c;而这些技能在多种发展路径上都有广泛应用。对于有志于深入发展的学生来说&#xff0c;选择合适的发展方向尤为重要。本文将详细讨论信息学奥赛后学生的三…

Linux中DHCP服务器配置和管理

文章目录 一、DHCP服务1.1、DHCP的工作流程1.2、DHCP的工作模式1.3、dhcp的主要配置文件 二、安装DHCP服务2.1、更新yum源2.2、安装DHCP服务软件包2.3、配置DHCP服务2.4、启用DHCP服务&#xff08;解决报错&#xff09;2.4.1、查看dhcpd服务的状态和最近的日志条目2.4.2、查看与…

<网络> 网络套接字编程(二)

文章目录 目录 文章目录 一、简单的TCP网络程序 1. 服务器创建套接字 2. 服务器绑定 3. 服务器监听 listen 4. 服务器获取连接 accept 5. 服务器处理请求 6. 客户端创建套接字 7. 客户端连接服务器 connect 8. 客户端发起请求 9. 服务器测试 10. 单执行流服务器弊端 二、多进程…

技术成神之路:设计模式(二十一)外观模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口&#xff0c;使得子系统更容易使用。 …

【Vulnhub靶场】DC-2

DC-2 靶场下载地址&#xff1a;https://download.vulnhub.com/dc/DC-2.zip 目标 本机IP&#xff1a;192.168.118.128 靶机IP&#xff1a;192.168.118.0/24 信息收集 常规我使用nmap三扫描&#xff0c;扫存活主机、扫端口、扫服务 第一步探测到存活主机IP为&#xff1a;192.1…

时序分解 | TTNRBO-VMD改进牛顿-拉夫逊算法优化变分模态分解

时序分解 | TTNRBO-VMD改进牛顿-拉夫逊算法优化变分模态分解 目录 时序分解 | TTNRBO-VMD改进牛顿-拉夫逊算法优化变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 (创新独家)TTNRBO-VMD改进牛顿-拉夫逊优化算优化变分模态分解TTNRBO–VMD 优化VMD分解层数K和…

MySQL任意版本安装卸载和数据库原理图绘制

MYSQL任意版本安装和卸载 安装&#xff1a; 1、解压文件 --- 不能出现中文路径 2、在解压目录&#xff08;安装目录&#xff09;下&#xff1a; 1>.创建data文件夹 2>.创建配置文件my.txt 然后修改成ini格式 3、修改配置文件 basedirD:\\mysql\\mysql-5.7.28-winx64…

后台进程注册的ContentObserver接收到的回调晚10秒钟

后台进程中的ContentObserver延迟回调晚10秒钟 在Android系统中&#xff0c;后台进程注册的ContentObserver会有一个延迟回调机制&#xff0c;通常延迟10秒左右。这种机制的设计是为了优化系统资源&#xff0c;减少后台进程频繁监听数据变化带来的资源消耗。 背景 当应用处于…

RabbitMQ集群搭建及使用

1. 概述 前提条件&#xff1a;linux服务器下已经安装好了docker服务。 本文档将搭建一个三台RabbitMQ的集群&#xff0c;包括三个RabbitMQ容器安装在同一服务器和三台不同的服务器。 2. 集群搭建 在一台服务器上创建三个RabbitMQ容器。 2.1.1. 创建容器 执行以下命令创建三…

Python实现PSO粒子群优化DBSCAN膨胀聚类模型(DBSCAN算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着大数据时代的到来&#xff0c;从海量数据中提取有用信息变得至关重要。聚类分析作为一种无监督…