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

【数据结构】数组(稀疏矩阵、特殊矩阵压缩、矩阵存储、稀疏矩阵的快速转置、十字链表)

稀疏矩阵、矩阵压缩、稀疏矩阵的快速转置、十字链表

目录

  • 稀疏矩阵、矩阵压缩、稀疏矩阵的快速转置、十字链表
    • 1.数组
    • 2.数组的顺序表示和实现
    • 3.特殊矩阵的压缩存储
      • (1). 上三角矩阵—列为主序压缩存储
      • (2). 下三角矩阵—**行为主序压缩存储**
      • (3). 对称矩阵
      • (4). 对角矩阵
    • 4. 稀疏矩阵
    • 5. 稀疏矩阵的压缩
      • (1). 三元组顺序表
      • (2). 行逻辑联接的顺序表
      • (3). 十字链表
    • 6. 稀疏矩阵的转置(普通转置 和 快速转置)
      • 方法一(普通转置)复杂度为O(T.mu×T.nu)
      • 方法二:快速转置 复杂度O(S.nu+S.tu)

前几期期链接:

  1. 【数据结构】栈与队列的概念和基本操作代码实现
  2. 【数据结构】树与二叉树的概念与基本操作代码实现

1.数组

k维数组的定义:
k 维数组 D = { a j 1 , j 2 , . . . , j k } k维数组D=\{ a_{j_1, j_2, ..., j_k} \} k维数组D{aj1,j2,...,jk}
k > 0 称为数组的维数, b i 是数组第 i 维的长度, j i 是数组元素第 i 维的下标 k>0称为数组的维数,b_i是数组第i维的长度,j_i是数组元素第 i维的下标 k>0称为数组的维数,bi是数组第i维的长度,ji是数组元素第i维的下标
a j 1 , j 2 , . . . , j k 属于 E l e m S e t ( 元素的性质相同 ) , Y i = 0 , . . . , b i − 1 ( i = 1 , 2 , … , k ) a_{j_1, j_2, ..., j_k}属于ElemSet(元素的性质相同),Y_{i}=0, ..., b_i -1 ( i=1, 2, …, k) aj1,j2,...,jk属于ElemSet(元素的性质相同)Yi=0,...,bi1(i=1,2,,k)

  1. 数组可以看作是一种特殊的线性表,即线性表数据元素本身又是一个线性表
    在这里插入图片描述

  2. 数组特点
    数组结构固定每一维的大小不可变
    数据元素同构(元素性质相同)

  3. 数组运算
    给定一组下标,存取、修改相应的数据元素,一般不做插入、删除操作。

2.数组的顺序表示和实现

二维数组有两种顺序映象的方式

  1. 以行序为主序:从数组的第一行开始依次存放每一行的数组元素;存放第i行时,从第一列开始顺次存放
    特点:有地址计算公式,可以随机访问
    二维数组任意元素的存储地址:
    L o c ( a i j ) = L o c ( a 11 ) + [ ( i − 1 ) n + ( j − 1 ) ] ∗ L Loc( a_{ij})=Loc(a_{11})+[(i-1)n+(j-1)]*L Loc(aij)=Loc(a11)+[(i1)n+(j1)]L
    L o c ( a 11 ) 称为基地址或基址 Loc(a_{11})称为基地址或基址 Loc(a11)称为基地址或基址
    在这里插入图片描述

  2. 以列序为主序:
    二维数组任意元素的存储地址:
    L o c ( a i j ) = L o c ( a 11 ) + [ ( j − 1 ) m + ( i − 1 ) ] ∗ L Loc( a_{ij})=Loc(a_{11})+[(j-1)m+(i-1)]*L Loc(aij)=Loc(a11)+[(j1)m+(i1)]L
    L o c ( a 11 ) 称为基地址或基址 Loc(a_{11})称为基地址或基址 Loc(a11)称为基地址或基址

可将二维数组的行为主序和列为主序的存储方式推广到一般情况,可得到 n 维数组数据元素存储位置的映象关系

3.特殊矩阵的压缩存储

宗旨:为值相同的矩阵元素只分配一个空间,对零元不分配存储空间.

(1) 特殊矩阵:非零元在矩阵中的分布有一定规则

  1. 上(下)三角矩阵
  2. 对称矩阵
  3. 对角矩阵

(2.)稀疏阵:零元多,分布无规律

(1). 上三角矩阵—列为主序压缩存储

在这里插入图片描述

存储方式:列为主序压缩存储和行为主序压缩存储,存储空间是一维的,将二维数组以一维方式存储。
特点:均可以随机访问数组元素。

上三角矩阵—列为主序压缩存储–数组sa[M]

(1)下三角为0时:
i≤j时,aij为非0元,存放地址Loc(aij)的计算公式:
L o c ( a i j ) = L o c ( a 11 ) + ( ( j − 1 ) ⋅ j 2 + i − 1 ) ⋅ L , ( c o n d i t i o n : i ≤ j ) Loc(a_{ij})= Loc(a_{11})+(\frac{(j-1)\cdot j}{2}+i-1)\cdot L , (condition:i≤j ) Loc(aij)=Loc(a11)+(2(j1)j+i1)L,(condition:ij)

一维存储空间用一维数组sa[M]表示, Loc(aij)计算公式(a11存于sa[0],地址为0 ):
L o c ( a i j ) = 0 + ( ( j − 1 ) ⋅ j 2 + i − 1 ) ⋅ 1 , ( c o n d i t i o n : i ≤ j ) Loc(a_{ij})= 0+(\frac{(j-1)\cdot j}{2}+i-1)\cdot 1, (condition:i≤j ) Loc(aij)=0+(2(j1)j+i1)1,(condition:ij)
数组sa的大小: M = ( n + 1 ) ⋅ n 2 M=\frac{(n+1)\cdot n}{2} M=2(n+1)n
在这里插入图片描述

aij(i≤j)存于下标为k的一维数组元素中:
L o c ( a i j ) = k = ( j − 1 ) ⋅ j 2 + i − 1 Loc(aij)=k=\frac{(j-1)\cdot j}{2}+i-1 Loc(aij)=k=2(j1)j+i1

(2)下三角为常数时
常数的存放的位置为: ( n + 1 ) ⋅ n 2 \frac{(n+1)\cdot n}{2} 2(n+1)n
数组sa的大小: M = ( n + 1 ) ⋅ n 2 + 1 M=\frac{(n+1)\cdot n}{2}+1 M=2(n+1)n+1
在这里插入图片描述

(2). 下三角矩阵—行为主序压缩存储

在这里插入图片描述

存储方式:列为主序压缩存储和行为主序压缩存储,存储空间是一维的,将二维数组以一维方式存储。
行为主序压缩存储:从第一行开始依次存放每一行的“非0(C)元”

特点:均可以随机访问数组元素。

下三角矩阵—行为主序压缩存储–数组sa[M]

(1)上三角为0时:
j≤i时,aij为非0元,存放地址Loc(aij)的计算公式:
L o c ( a i j ) = L o c ( a 11 ) + ( ( i − 1 ) ⋅ i 2 + j − 1 ) ⋅ L , ( c o n d i t i o n : j ≤ i ) Loc(a_{ij})= Loc(a_{11})+(\frac{(i-1)\cdot i}{2}+j-1)\cdot L , (condition:j≤i ) Loc(aij)=Loc(a11)+(2(i1)i+j1)L,(condition:ji)

一维存储空间用一维数组sa[M]表示, Loc(aij)计算公式(a11存于sa[0],地址为0 ):
L o c ( a i j ) = 0 + ( ( i − 1 ) ⋅ i 2 + j − 1 ) ⋅ 1 , ( c o n d i t i o n : j ≤ i ) Loc(a_{ij})= 0+(\frac{(i-1)\cdot i}{2}+j-1)\cdot 1, (condition:j≤i ) Loc(aij)=0+(2(i1)i+j1)1,(condition:ji)
数组sa的大小: M = ( n + 1 ) ⋅ n 2 M=\frac{(n+1)\cdot n}{2} M=2(n+1)n
在这里插入图片描述

aij(i≤j)存于下标为k的一维数组元素中:
L o c ( a i j ) = k = ( i − 1 ) ⋅ i 2 + j − 1 Loc(aij)=k=\frac{(i-1)\cdot i}{2}+j-1 Loc(aij)=k=2(i1)i+j1

上三角为常数时
常数的存放的位置为: ( n + 1 ) ⋅ n 2 \frac{(n+1)\cdot n}{2} 2(n+1)n
数组sa的大小: M = ( n + 1 ) ⋅ n 2 + 1 M=\frac{(n+1)\cdot n}{2}+1 M=2(n+1)n+1
在这里插入图片描述

(3). 对称矩阵

存放方式:只存上三角阵或只存下三角阵都可以
在这里插入图片描述

地址计算公式 : 参考上三角和下三角矩阵的地址计算公式

(4). 对角矩阵

对角矩阵 –2d+1对角阵主对角线和主对角线上面d条对角线、主对角线下面d条对角线上的数据元素分布不规律,非0(C).
在这里插入图片描述

2d+1 对角阵特点:**第一行和最后一行每行有d+1个数据元素**,余下每行**最多**2d+1个数据元素

压缩存储方法:第一行和最后一行每行存 d+1 个数据元素,余下每行存 2d+1 个数据元素
在这里插入图片描述

2d+1-对角阵行为主序压缩存储地址计算公式:
矩阵元素下标从0开始的地址计算公式:
L o c ( a i j ) = L o c ( a 00 ) + ( 2 d + 1 ) ∗ i − d + j − ( i − d ) = L o c ( a 00 ) + ( 2 d + 1 ) ∗ i + j − i Loc(a_{ij})=Loc(a_{00})+(2d+1)*i-d+j-(i-d) =Loc(a_{00})+(2d+1)*i+j-i Loc(aij)=Loc(a00)+(2d+1)id+j(id)=Loc(a00)+(2d+1)i+ji
0 ≤ i , j < n , ∣ i − j ∣ ≤ d 0≤i,j<n, |i-j|≤d 0i,j<n,ijd

§矩阵元素下标从1开始的地址计算公式:
L o c ( a i j ) = L o c ( a 11 ) + ( 2 d + 1 ) ∗ ( i − 1 ) − d + j − i + d = L o c ( a 11 ) + ( 2 d + 1 ) ∗ ( i − 1 ) + j − i Loc(a_{ij})=Loc(a_{11})+(2d+1)*(i-1)-d+j-i+d= Loc(a_{11})+(2d+1)*(i-1)+j-i Loc(aij)=Loc(a11)+(2d+1)(i1)d+ji+d=Loc(a11)+(2d+1)(i1)+ji
1 ≤ i , j ≤ n , ∣ i − j ∣ ≤ d 1≤i,j≤n, |i-j|≤d 1i,jn,ijd

4. 稀疏矩阵

稀疏矩阵: 矩阵元素零元多,在矩阵中随机出现
假设 m行 n列的矩阵含 t个非零元素,则稀疏因子: δ = t m ⋅ n δ =\frac{t}{m\cdot n} δ=mnt
通常认为 δ ≤ 0.05 的矩阵为稀疏矩阵。

压缩存储原则:只存储每个非零元的行、列下标及其值和矩阵的行列维数

在这里插入图片描述

常规存储方法缺点:

(1) 零值元素占了很大空间;
(2) 计算中进行了很多和零值的运算,遇除法,还需判别除数是否为零。

解决问题的原则:

(1) 尽可能少存或不存零值元素;
(2) 尽可能减少没有实际意义的运算;
(3) 操作方便。 即:尽可能快地找到与下标值(i,j)对应的元素,尽可能快地找到同一行或同一列的非零值元。

5. 稀疏矩阵的压缩

稀疏矩阵的压缩存储方法:

1. 三元组顺序表
2. 行逻辑联接的顺序表
3. 十字链表

(1). 三元组顺序表

三元表结构:
在这里插入图片描述

//三元表结构:
typedef struct{  int i, j;       //非零元的行、列下标 int e;   //非零元的值
} Triple;//稀疏矩阵的结构
#define MAXSIZE 100  //非零元最大个数
typedef struct{  Triple data[MAXSIZE + 1];       //三元组表,data[0]未用int mu, nu, tu; //矩阵行、列数、非零元个数
} TSMatrix;

特点:
有序的双下标法行序有序存储
便于进行依行顺序处理的矩阵运算
若需存取某一行中的非零元,需**从头开始查找**。

压缩存储后,元素aij的存储位置与其下标无关,而取决于之前的非零元个数
非零元以行为主序顺序存放

(2). 行逻辑联接的顺序表


#define MAXRC 500 
//行逻辑联接的顺序表
typedef struct {Triple data[MAXSIZE + 1];int  rpos[MAXRC + 1]; // 每一行非0元存放的起始位置int  mu, nu, tu;
} RLSMatrix; // 行逻辑链接顺序表类型

在这里插入图片描述

(3). 十字链表

用三元组表存储稀疏矩阵,在单纯的存储和做类似转置之类的运算时可以节约存储空间,且运算速度较快;
但当进行矩阵相加等运算时,稀疏矩阵的非零元位置和个数都会发生变化。使用三元组表必然会引起数组元素的大量移动

  1. 采用链表存放稀疏矩阵的非0元
  2. 将稀疏矩阵每行的非0元按照列升序的顺序放在一个单链表中
  3. 将稀疏矩阵每列的非0元按照行升序的顺序放在一个单链表中

即:
稀疏矩阵的每个非0元即位于一个行单链表,也同时位于一个列单链表
用一维数组保存每行非0元的单链表的头指针
用一维数组保存每列非0元的单链表的头指针

十字链表 :每个非零元用含有五个域的结点表示(非零元的所在行、列、值,及同行、同列的下一个非零元)
在这里插入图片描述

//十字链表
typedef struct OLNode{ int row, col; //非零元所在行、列int val; //非零元的值struct OLNode*right, *down;//同行、同列的下一个非零元
}OLNode,* OLink;typedef struct{ OLink rhead[M],chead[N]; //行、列指针数组int mu, nu, tu; //行、列数及非零元个数
}CrossList;

6. 稀疏矩阵的转置(普通转置 和 快速转置)

解决思路:

  1. 将矩阵行、列维数互换,非零元个数不变
  2. 将每个三元组中的i和j相互调换,非零元值不变
  3. 重排次序,使T.data中元素以T的行(M的列)为主序
    在这里插入图片描述

方法一(普通转置)复杂度为O(T.mu×T.nu)

按矩阵T中三元组表T.data的次序依次在矩阵M的三元组表M.data中找到相应三元组进行转置
为找到M.data中第i列所有非零元素,需对M.data扫描一遍
由于M.data以M行序为主序,所以得到的恰是T.data中应有的顺序

//复杂度为O(T.mu×T.nu)
Status TransposeSMatrix(TSMatrix M, TSMatrix &T){ int col, p, k;T.mu=M.nu;  T.nu=M.mu; T.tu=M.tu; if(T.tu){ //有非零元,转置k=1;//k为T.data表下标for(col=1;col<=M.nu;col++)//查找M每一列的非零元for( p=1;p<=M.tu;p++)//扫描M的所有非零元if( M.data[p].j==col ){ T.data[k].i=M.data[p].j;T.data[k].j=M.data[p].i;T.data[k].e=M.data[p].e; k++;}return OK;}return ERROR;
}//T(n)=O(M.nu×M.tu)
//若M.tu与M.mu×M.nu同数量级则 T(n)=O(M.mu×M.nu^2)

方法二:快速转置 复杂度O(S.nu+S.tu)

//复杂度O(S.nu+S.tu) 
//若S.tu与S.mu×S.nu同数量级则 T(n)=O(S.mu×S.nu)
void TransPose_F(TSMatrix S,TSMatrix &Transpose_S){//S为原来矩阵//Transpose_S为转置后矩阵Transpose_S.mu=S.nu;Transpose_S.nu=S.mu;Transpose_S.tu=S.tu;if(S.tu){//判断是否为空int col;//列int num[MAXSIZE]={0};// 记录原三元组中列号为 col 的项的数目。 辅助数组int cpot[MAXSIZE]={0};// 记录原三元组中列号为 col 的项在新三元组中的首位置。 辅助数组//扫描第一次 记录元素矩阵S中列数为j的个数for(int i=1;i<=S.tu;i++){//记录元素矩阵S中列数为j的个数num[S.data[i].j]++;}cpot[1]=1;//初始化第一个元素的地址//扫描第二次 记录原三元组中列号为 col 的项在新三元组中的首位置for(col=2;col<=S.nu;col++){//列号为 col 的项在新三元组中的首位置cpot[col]=cpot[col-1]+num[col-1];}//扫描第三次 转置for(int t=1;t<=S.tu;t++){col=S.data[t].j;//列数int s=cpot[col];//地址  下标Transpose_S.data[s].e=S.data[t].e;Transpose_S.data[s].i=S.data[t].j;Transpose_S.data[s].j=S.data[t].i;cpot[col]++;//下标 后移}}
}

感谢阅读!
前几期期链接:

  1. 【数据结构】栈与队列的概念和基本操作代码实现
  2. 【数据结构】树与二叉树的概念与基本操作代码实现

相关文章:

【数据结构】数组(稀疏矩阵、特殊矩阵压缩、矩阵存储、稀疏矩阵的快速转置、十字链表)

稀疏矩阵、矩阵压缩、稀疏矩阵的快速转置、十字链表 目录 稀疏矩阵、矩阵压缩、稀疏矩阵的快速转置、十字链表1.数组2.数组的顺序表示和实现3.特殊矩阵的压缩存储&#xff08;1&#xff09;. 上三角矩阵—列为主序压缩存储&#xff08;2&#xff09;. 下三角矩阵—**行为主序压…...

nginx 配置访问地址和解决跨域问题(反向代理)

1、配置访问地址&#xff08;通过ip访问&#xff09; //配置ip访问地址 location ^~/auditApp{alias /usr/local/front-apps/cbd/auditApp;index index.html;if (!-e $request_filename) {rewrite ^/(.*) /auditApp/index.html last;break;}} 2、解决跨域问题&…...

支持向量机(SVM)白话之个人理解(学习记录)

本文仅有文字理解部分&#xff0c;没有相应的数学公式推导过程&#xff0c;便于新手理解。 一、什么是支持向量机 首先我们看下面这张图&#xff0c;在图中圆形和三角形分别代表不同的数据类型&#xff0c;如何画出一条直线使两者能够显著地区分开来呢&#xff1f; 答案可以多…...

【运输层】TCP 的可靠传输是如何实现的?

目录 1、发送和接收窗口&#xff08;滑动窗口&#xff09; &#xff08;1&#xff09;滑动窗口的工作流程 &#xff08;2&#xff09;滑动窗口和缓存的关系 &#xff08;3&#xff09;滑动窗口的注意事项 2、如何选择超时重传时间 &#xff08;1&#xff09;加权平均往返…...

K8s技术全景:架构、应用与优化

一、介绍 Kubernetes的历史和演进 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化应用程序的部署、扩展和管理。它最初是由Google内部的Borg系统启发并设计的&#xff0c;于2014年作为开源项目首次亮相。 初始阶段 Kubernetes的诞生…...

Java的异常机制

异常机制 三种类型 检查型异常&#xff1a;程序员无法预见的运行时异常&#xff1a;在编译时会被忽略错误ERROR&#xff1a;错误在代码中被忽略&#xff0c;在编译时检查不到 异常处理机制 抛出异常捕获异常异常处理的五个关键字&#xff1a;try&#xff0c;catch&#xff…...

考虑预同步的虚拟同步机T型三电平逆变器并离网MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 三相 T 型三电平逆变器电路如图所示&#xff0c;逆变器主回路由三个单相 T 型逆变器组成。 直流侧输入电压为 UPV&#xff0c;直流侧中点电位 O 设为零电位&#xff0c;交流侧输出侧是三相三线制连…...

记一次k8s取证检材过期的恢复

复盘盘古石k8s的时候碰到了证书过期的问题&#xff0c;在此记录解决方法 报错信息&#xff1a;192.168.91.171:6443 was refused - did you specify the right host or port? 查看证书是否过期 kubeadm alpha certs check-expiration或 openssl x509 -in /etc/kubernetes/…...

【网站项目】自助购药小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

Ubuntu22.04修改默认窗口系统为X11

Ubuntu22.04安装默认窗口系统为Wayland&#xff08;通过设置->关于可以看到&#xff09;。 一、用Ubuntu on Xorg会话登录 用户登录时&#xff0c;点“未列出”&#xff0c;输入用户名后&#xff0c;在登录界面底部的齿轮图标中&#xff0c;选择 "Ubuntu on Xorg&quo…...

延时队列实现实战:如何利用 RabbitMQ 实现延时队列,以满足特定延迟处理需求

实现延时队列&#xff0c;可以通过RabbitMQ的死信队列&#xff08;Dead-letter queue&#xff09;特性&#xff0c;“死信队列”是当消息过期&#xff0c;或者队列达到最大长度时&#xff0c;未消费的消息会被加入到死信队列。然后&#xff0c;我们可以对死信队列中的消息进行消…...

关于在Ubuntu上配置mysql踩的一些坑

最近准备换工作了&#xff0c;回顾了下学校时期做的那个webserver&#xff0c;又在linux下mysql踩了一些坑&#xff0c;特此记录下来 程序编译错误mysql.h: No such file or directory 云服务器缺少mysql必要的运行组件&#xff0c;安装&#xff1a; sudo apt-get install l…...

JSBridge原理 - 前端H5与客户端Native交互

1. 概述&#xff1a; 在混合应用开发中&#xff0c;一种常见且成熟的技术方案是将原生应用与 WebView 结合&#xff0c;使得复杂的业务逻辑可以通过网页技术实现。实现这种类型的混合应用时&#xff0c;就需要解决H5与Native之间的双向通信。JSBridge 是一种在混合应用中实现 …...

【Java EE】Spring请求如何传递参数详解

文章目录 &#x1f38d;传递单个参数&#x1f334;传递多个参数&#x1f340;传递对象&#x1f384;后端参数重命名&#xff08;后端参数映射&#xff09;&#x1f332;传递数组&#x1f38d;传递集合&#x1f334;传递JSON数据&#x1f338;JSON概念&#x1f338;JSON的语法&a…...

菜鸟笔记-Numpy常用函数用法汇总

NumPy&#xff08;Numerical Python的简称&#xff09;是Python中用于处理数组和矩阵的库&#xff0c;提供了大量的数学函数来操作这些数组。通过前面的学习&#xff0c;慢慢也能发现一些规律&#xff0c;以下是NumPy的一些常用函数及其用法汇总&#xff1a; 数组创建 numpy.a…...

tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图

文章目录 前言一、实现步骤1. 获取所需特征点的索引2. 使用opencv.js 计算俯仰角、水平角和翻滚角cv.solvePnP介绍cv.solvePnP原理运行代码查看效果 3.绘制姿态示意直线添加canvas元素计算姿态直线坐标并绘制 总结 前言 在计算机视觉领域&#xff0c;估算脸部姿态是一项具有挑…...

Linux命令-dpkg-divert命令(Debian Linux中创建并管理一个转向列表)

说明 dpkg-divert命令 是Debian Linux中创建并管理一个转向&#xff08;diversion&#xff09;列表&#xff0c;其使得安装文件的默认位置失效的工具。 语法 dpkg-divert(选项)(参数)选项 --add&#xff1a;添加一个转移文件&#xff1b; --remove&#xff1a;删除一个转移…...

flex: 1 是哪些属性的缩写?

flex&#xff1a;1是哪些属性的缩写? flex&#xff1a;1 是 flex-grow: 1, flex-shrink: 1,flex-basis: 0% 的缩写&#xff1b; 解释下flex-grow flex-grow是将剩余的空间&#xff0c;根据flex-grow的值平分&#xff0c;然后加到flex-basis上 <!doctype html> <htm…...

python基于opencv实现数籽粒

千粒重是一个重要的农艺性状&#xff0c;通过对其的测量和研究&#xff0c;我们可以更好地理解作物的生长状况&#xff0c;优化农业生产&#xff0c;提高作物产量和品质。但数籽粒数目是一个很繁琐和痛苦的过程&#xff0c;我们现在用一个简单的python程序来数水稻籽粒。代码的…...

OpenCV图像处理——基于OpenCV的ORB算法实现目标追踪

概述 ORB&#xff08;Oriented FAST and Rotated BRIEF&#xff09;算法是高效的关键点检测和描述方法。它结合了FAST&#xff08;Features from Accelerated Segment Test&#xff09;算法的快速关键点检测能力和BRIEF&#xff08;Binary Robust Independent Elementary Feat…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

Caliper 配置文件解析:config.yaml 和 fisco-bcos.json 附加在caliper中执行不同的合约方法

Caliper 配置文件解析:config.yaml 和 fisco-bcos.json Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO…...

Python_day48随机函数与广播机制

在继续讲解模块消融前&#xff0c;先补充几个之前没提的基础概念 尤其需要搞懂张量的维度、以及计算后的维度&#xff0c;这对于你未来理解复杂的网络至关重要 一、 随机张量的生成 在深度学习中经常需要随机生成一些张量&#xff0c;比如权重的初始化&#xff0c;或者计算输入…...

LeetCode 2894.分类求和并作差

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路一详解&#xff08;遍历 判断&#xff09;&#xff1a; 思路二详解&#xff08;数学规律/公式&#xff09;&#xff1a; 代码&#xff1a; Java思路一&#xff08;遍历 判断&a…...