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

线性基 学习笔记

什么是线性基?

先来回顾一下向量空间中的基。这个基代表着空间的一个极大线性无关子集,组中向量线性无关,且空间中的任意一个向量都可以唯一地由基中的向量来表示

那么回到线性基,它其实就类似于是一个向量空间的基

我们考虑一个问题:给定一个数组a,要求一个最小的数组d,使得a中的任意一个数可以由d中的若干个数字来通过异或得到,且d中任意多个数字的异或结果不为0

注意到异或操作其实就是在模2意义下的加法操作,我们如果将每一个数字按二进制位分解,就可以看成一个n维向量(我们假定数字<=2^n)

所以当前要求的东西如下:

给定一个向量组a,a[i]=(a_{i1},a_{i2},...,a_{in}),求一组向量d,d[i]=(d_{i1},d_{i2},...,d_{in})(向量个数为m),使得\forall \vec{i}\in a,存在唯一的一组解k满足\vec{i}=k_1*\vec{b_1}+k_2*\vec{b_2}+...k_m*\vec{b_m}(加法在模2意义下),且不存在一组解s,使得s_1*\vec{b_1}+s_2*\vec{b_2}+...s_m*\vec{b_m}=0.

这里k_i,s_i=0/1

(事实上这样一个线性基不一定是原数组的子集,但是略去这一点的话,它跟空间中的基的概念就有诸多相像的地方了。

这里列出对应的性质

1.数组中的任意一个数可以唯一地由线性基中的若干元素异或得到

2.线性基中任意多个元素的异或值不为0

3.线性基元素的异或集合等于原数组元素的异或集合

那么我们考虑一下如何求出这样一个集合并满足上述性质

好吧其实我也不知道前人是怎么搞出来这个东西的,但是可以意会一下

异或中一个极好的思考角度就是从二进制位入手。想要得到一个数字,说白了就是要让对应位为1或0.那么如果我们的线性基中,每一个数字都有一位,满足其它数字在这一位上都是0,那么或许就可以操控了。所以线性基其实就是按位分成n个数字,每一位对应一个数字(或许没有)

这里先给出求线性基的代码,再慢慢讲解(很简单的,别走)

void add(ll x)
{for(int i=63;i>=0;--i){if(x&(1ll<<i)){if(d[i]) x^=d[i];else {d[i]=x;break;}	}	}	
}

这是一个将元素尝试添加进线性基的代码。我们的操作就是,让线性基中每一个元素的最高位拥有唯一的1,就没了。这里如果一个数组的某一个1位已经存在对应的线性基元素了,我们直接将其取异或,知道它的最高位1是唯一的。如果没有这样的位,也就是最后x=0,就无法加入线性基

为什么这样是合理的?我们一个性质一个性质来看

不妨先看性质2 线性基中任意多个元素的异或值不为0

我们假设d[a]^d[b]^d[c]=0,并假设三者加入线性基的次序是a,b,c

显然d[a]^d[b]=d[c],所以在c尝试加入线性基的时候,就会加入失败。

得证

再看性质1  数组中的任意一个数可以唯一地由线性基中的若干元素异或得到

先考虑可行性:

假设数字A成功加入线性基的第i个位置

那么A^d[a]^d[b]^...^d[c]=d[i],反过来:A=d[a]^d[b]^...^d[c]^d[i].

如果A没有加入线性基

那就是因为线性基中存在一些数字的异或和=A

得证

再考虑唯一性:

如果存在两种方案使得d[a1]^d[a2]^..d[ai]=d[b1]^d[b2]^..d[bj]=A,那么取d[a1]^d[a2]^..d[ai]^d[b1]^d[b2]^..d[bj]=0,与性质2矛盾

得证

性质3  线性基元素的异或集合等于原数组元素的异或集合

线性基中的元素都是原数组元素互相异或得来的,所以该性质显然

所以说这样构造是合理的,其实就是按位贪心。


然后我们考虑一下用处:

求数组异或最大值

ans=0;
for(int i=60;i>=0;--i)
{ans=max(ans,ans^d[i]);
}

其实还是按位贪心,如果高位能取到1的话,就取,因为决策具有单调性。

求数组异或最小值

如果有元素不能插入线性基,那么最小值显然就是0,否则就是线性基里最小的元素,因为最小的元素无论异或谁都会变大


求数组异或的第k小

我们考虑将线性基重新构造,使得每一个数字的每一位1都是唯一的

如果i<j,aj的第i位是1,就将aj异或上ai。

这样,我们只需要将k按二进制拆分,对于1的位,就异或上对应的元素即可

例题

板子

求数组异或最大值

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const ll N=1e5+10;
ll n,k;
ll mas[N];
ll d[70];
void add(ll x)
{for(int i=60;i>=0;--i){if(x&(1ll<<i)){if(d[i]) x^=d[i]; else{d[i]=x;break;}}}
}
void solve()
{cin>>n;for(int i=1;i<=n;++i) cin>>mas[i];for(int i=1;i<=n;++i) add(mas[i]);ll ans=0;for(int i=60;i>=0;--i){ans=max(ans,ans^d[i]);}cout<<ans<<endl;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);//ll t;cin>>t;while(t--)solve();return 0;
}

彩灯

大意:
求数组的异或结果的种类数

思路:
我们考虑性质2,显然线性基中不同元素的异或结果一定不同,所以答案就是2^(线性基大小)

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const ll N=1e5+10;
ll n,m;
string s;
ll d[70];
vector<ll> vt;
void add(ll x)
{for(int i=60;i>=0;--i){if(x&(1ll<<i)){if(d[i]) x^=d[i];else{d[i]=x;break;}}}
}
void solve()
{cin>>n>>m;for(int i=1;i<=m;++i){cin>>s;ll cnt=0;for(int j=0;j<n;++j){cnt*=2ll;if(s[j]=='O') cnt++;}//cout<<cnt<<endl;vt.push_back(cnt);}for(auto i:vt) add(i);ll num=0;for(int i=0;i<=60;++i) if(d[i]>0) num++;ll ans=1;for(int i=1;i<=num;++i){ans=ans*2%2008;}cout<<ans<<endl;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();return 0;
}

元素

大意:

每一个元素有一个id和val,选择一个子集,任意多个id的异或结果不为0,且val最大

思路:

线性基中任意元素的异或结果不为0,所以其实就是要求一个val最大的线性基。那么我们只要按val倒序贪心即可

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const ll N=1e5+10;
ll n,m;
struct ty
{ll num,val;
}mas[N],d[70];
bool cmp(ty a,ty b)
{return a.val>b.val;
}
void add(ty a)
{for(int i=60;i>=0;--i){if(a.num&(1ll<<i)){if(d[i].num){a.num^=d[i].num;//	a.val+=d[i].val;}else {d[i]=a;break;}}}
}
void solve()
{cin>>n;for(int i=1;i<=n;++i){cin>>mas[i].num>>mas[i].val;}sort(mas+1,mas+1+n,cmp);for(int i=1;i<=n;++i) add(mas[i]);ll sum=0;
//	cout<<"sdf "<<endl;
//	for(int i=0;i<=60;++i) if(d[i].num) cout<<d[i].num<<" "<<d[i].val<<endl;
//	cout<<endl;for(int i=0;i<=60;++i) sum+=d[i].val;cout<<sum<<endl;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();return 0;
}

新Nim游戏

大意:

 (懒

思路:
Nim的一个结论就是元素异或和为0时,先手必败,否则先手必胜

所以当前先手的策略就是使得后手无论怎么拿,都不可能使元素异或和=0。也就是,我们要取尽可能少的数,使得局面成为一个线性基。因为总能构造出一个线性基(多了就拿掉呗),所以先手必胜

那么升序插入线性基即可

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const ll N=1e5+10;
ll n,m;
ll mas[N];
ll d[70];
ll sum=0;
void add(ll x)
{ll pre=x;for(int i=60;i>=0;--i){if(x&(1ll<<i)){if(d[i]) x^=d[i];else{d[i]=x;break;}}}if(x==0) sum+=pre;
}
void solve()
{cin>>n;for(int i=1;i<=n;++i) cin>>mas[i];sort(mas+1,mas+1+n,greater<ll>());for(int i=1;i<=n;++i) add(mas[i]);cout<<sum<<endl;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();return 0;
}

最大XOR路径

大意:

给一个 n 个点 m 条边(权值为di​)的无向有权图,可能有重边和子环。可以多次经过一条边,求1→n 的路径的最大边权异或和。

思路:

显然,一条边被走两次之后,贡献就是0,那么我们什么时候会这样做?当第二次经过时可以到达其它地方时

其实这里有一类边集是很特殊的,环。我们可以异或来得到整个环的值,再从起点出去,就类似于是一个额外贡献。

这启示我们,我们可以将图分为一个一个环和一条链。我们的主线是链,我们沿着链走,中间碰到有环可以走的话,我们可以走,也可以不走。那么就相当于求环的值的集合的一个线性基,然后求链的值与该线性基元素的异或的最大值即可。

这里还有两个问题:

1.从环回去要走重边,所以环的值要扣掉重边对应的部分

2.如何选择我们的主链?

事实上,如果有两条主链的话,就有了一个环

 我们取价值为a的路,可能不如b优,但是环的价值是a^b,那么在最后的操作中,a^(a^b),就得到了b。所以我们其实可以任意选择一开始的主链。另外,选择不同的主链,最后可能会得到不同的一个一个的环。如何保证不同链能得到相同的环?不能保证,环套环的情况可能会导致不同的遍历顺序得到不同的环,但是简单环的异或操作可以得到所有的简单环。具体可以看一下这里

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const ll N=1e5+10;
ll n,m;
struct ty
{ll t,l,next;
}edge[N<<1];
ll cn=0;
ll head[N];
ll res[N];
ll vis[N];
ll d[70];
void add(ll x)
{for(int i=63;i>=0;--i){if(x&(1ll<<i)){if(d[i]) x^=d[i];else {d[i]=x;break;}	}	}	
} 
ll ma(ll x)
{ll ans=x;for(int i=63;i>=0;--i){ans=max(ans,ans^d[i]);}return ans;
}
void add(ll a,ll b,ll c)
{edge[++cn].t=b;edge[cn].l=c;edge[cn].next=head[a];head[a]=cn;
}
void dfs(ll id,ll now)
{vis[id]=1;res[id]=now;for(int i=head[id];i!=-1;i=edge[i].next){ll y=edge[i].t;if(!vis[y]) dfs(y,now^edge[i].l);else add(now^edge[i].l^res[y]);}
}
void solve()
{memset(head,-1,sizeof head);cin>>n>>m;for(int i=1;i<=m;++i){ll a,b,c;cin>>a>>b>>c;add(a,b,c);add(b,a,c);}dfs(1,0);
//	for(int i=64;i>=0;--i) if(d[i]) cout<<d[i]<<' ';
//	cout<<endl;cout<<ma(res[n])<<endl;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();return 0;
}

Shortest Path Problem?

大意:
跟上一题一样,只是变成求路径异或最小值了

那么只是换个板子的事情

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const ll N=1e5+10;
ll n,m;
struct ty
{ll t,l,next;
}edge[N<<1];
ll cn=0;
ll head[N];
ll res[N];
ll vis[N];
ll d[70];
void add(ll x)
{for(int i=63;i>=0;--i){if(x&(1ll<<i)){if(d[i]) x^=d[i];else {d[i]=x;break;}	}	}	
} 
ll mi(ll x)
{ll ans=x;for(int i=63;i>=0;--i){ans=min(ans,ans^d[i]);}return ans;
}
void add(ll a,ll b,ll c)
{edge[++cn].t=b;edge[cn].l=c;edge[cn].next=head[a];head[a]=cn;
}
void dfs(ll id,ll now)
{vis[id]=1;res[id]=now;for(int i=head[id];i!=-1;i=edge[i].next){ll y=edge[i].t;if(!vis[y]) dfs(y,now^edge[i].l);else add(now^edge[i].l^res[y]);}
}
void solve()
{//1<<64就炸了 memset(head,-1,sizeof head);cin>>n>>m;for(int i=1;i<=m;++i){ll a,b,c;cin>>a>>b>>c;add(a,b,c);add(b,a,c);}dfs(1,0);
//	for(int i=64;i>=0;--i) if(d[i]) cout<<d[i]<<' ';
//	cout<<endl;cout<<mi(res[n])<<endl;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();return 0;
}

装备购买

大意:
求一组向量的极大无关组,其中每一个向量还有一个价值val,要求极大无关组的val总和最小

思路:
其实就是实数意义下的一个线性基。那么我们用高斯消元,像求线性基一样,如果当前最高位(向量最左边元素)没有对应的线性基,就加入,并更新后面对应的元素即可

至于val总和最小,跟之前一样,贪心即可

其实就是一个消元求解方程组的过程。

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define ldb long double
const ldb eps=1e-7;
const ll N=510;
ll n,m;
struct ty
{ldb val[N];ldb cost;friend inline bool operator <(const ty& a,const ty& b){return a.cost<b.cost;}
}mas[N];
ll d[N];
ll cnt=0;
ldb ans=0;
void solve()
{cin>>n>>m;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j) cin>>mas[i].val[j];}for(int i=1;i<=n;++i) cin>>mas[i].cost;sort(mas+1,mas+1+n);for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){if(abs(mas[i].val[j])<eps) continue;if(!d[j]){d[j]=i;//确定对应的基ans+=mas[i].cost;cnt++;break;}ldb ap=mas[i].val[j]/mas[d[j]].val[j];for(int k=j;k<=m;++k){mas[i].val[k]-=ap*mas[d[j]].val[k];}}}cout<<cnt<<' '<<(ll)ans<<endl;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();return 0;
}

未完待续~

相关文章:

线性基 学习笔记

什么是线性基&#xff1f; 先来回顾一下向量空间中的基。这个基代表着空间的一个极大线性无关子集&#xff0c;组中向量线性无关&#xff0c;且空间中的任意一个向量都可以唯一地由基中的向量来表示 那么回到线性基&#xff0c;它其实就类似于是一个向量空间的基 我们考虑一…...

算法-回溯算法-组合问题

77. 组合https://leetcode.cn/problems/combinations/ 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,…...

ABAP中的Null值与space 以及 BW中ADSO的Key值

写出来怪丢人&#xff0c;到现在还没搞懂这个。 在BW中创建ADSO&#xff0c;定义Key字段。可以看到ADSO表的定义中&#xff0c;所有的Key和Data属性如下&#xff1a; 所有的key会有关键字key打头&#xff0c;所有字段都有not null. 但是并不是有个字段是blank空的就不能更新进…...

JavaScript库之Lodash常用方法

Lodash 中文文档https://www.lodashjs.com/docs/lodash.omit/以下总结了在项目中常用的方法&#xff0c;其他的慢慢更新语言&#xff1a;cloneDeep这个方法类似_.clone&#xff0c;除了它会递归拷贝 value。&#xff08;注&#xff1a;也叫深拷贝&#xff09;参数value (*): 要…...

Kotlin新手教程二(Kotlin基本数据类型及基础语法)

一、基本数据类型 1.数字 由于Kotlin支持类型推断&#xff0c;所以在使用时若超出Int的范围则会被认定为其它类型&#xff1b;若需要显式指定Long型值&#xff0c;则需要在值后添加L后缀。 2.浮点数 3.比较两个数&#xff08; 和 &#xff09; Kotlin 中没有基础数据类型&a…...

git idea创建新分支,获取/合并主支代码的2个方法

其他sql格式也在更新中&#xff0c;可直接查看这个系列&#xff0c;要是没有你需要的格式&#xff0c;可在评论或私信我 个人目录 获取主支代码的2个方法1&#xff0c;创建一个分支&#xff0c;获取主支的所有代码&#xff08;场景&#xff1a;我需要一个自己的分支进行编写模…...

CF1714A Everyone Loves to Sleep 题解

CF1714A Everyone Loves to Sleep 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例解释题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1代码实现题目 链接 https://www.luogu.com.cn/problem/CF1714A 字面描述 题面翻译 题目描述 Vlad和其他人一样&am…...

oracle官方下载历史版本JDK版本

背景 日常工作中由于一些特殊原因&#xff0c;我们需要下载指定系统指定位数指定版本的jdk&#xff0c;这个时候去网上搜索下载就会遇到各种坑&#xff0c;病毒、诱导连接、诱导关注/注册、付费、错误版本等&#xff0c;所以最好的办法是去官网下载&#xff0c;下面列举两种方式…...

双击-jar包无法运行解决方法

我自己是通过探索出来的方法解决的&#xff0c;网上的方法适合普通问题 网络流传方法 那种-jar和run.bat的就是曲解了问题意思&#xff0c;问题不是如何运行&#xff0c;而是如何双击jar包就可以直接运行。 普通小问题就是修改注册表&#xff0c;将java路径写进去后面加个 %1…...

程序员的自我修养第七章——动态链接 (下)

接上一篇。 7.3 地址无关代码 对于现代机器来说&#xff0c;引入地址无关代码并不麻烦&#xff0c;我们展示下各种模型的地址引用方式&#xff1a; 1. 模块内部函数调用 2. 模块内部的数据访问&#xff0c;如全局变量、静态变量。 3. 模块外部的函数调用&#xff0c;跳转。 4.…...

蓝桥杯刷题——基础篇(二)

这部分题目&#xff0c;主要面向有志参加ACM与蓝桥杯竞赛的同学而准备的&#xff0c;蓝桥杯与ACM考察内容甚至评测标准基本都一样&#xff0c;因此本训练计划提供完整的刷题顺序&#xff0c;循序渐进&#xff0c;提高代码量&#xff0c;巩固基础。因竞赛支持C语言、C、Java甚至…...

PTA L1-049 天梯赛座位分配(详解)

前言&#xff1a;内容包括&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; 天梯赛每年有大量参赛队员&#xff0c;要保证同一所学校的所有队员都不能相邻&#xff0c;分配座位就成为一件比较麻烦的事情。为此我们制定如下策…...

Linux部分参数作用讲解

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

Java kafka

JAVA面试题--Kafka&#xff08;最新最全&#xff09; 目录概述需求&#xff1a;设计思路实现思路分析1.URL管理2.网页下载器3.爬虫调度器4.网页解析器5.数据处理器拓展实现性能参数测试&#xff1a;参考资料和推荐阅读)Survive by day and develop by night. talk for import b…...

DBA之路---Stream数据共享同步机制与配置方法

oracle的Stream解析–数据共享 在g版本常用&#xff0c;如果是c版本项目一般都会选择goldengate&#xff0c;比stream靠谱多了 Oracle中的stream是消息队列一种应用形式&#xff0c;原理如下&#xff1a; 收集oracle中的事件&#xff0c;将事件保存在队列里&#xff0c;然后将…...

CF1790E Vlad and a Pair of Numbers 题解

CF1790E Vlad and a Pair of Numbers 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1思路代码实现题目 链接 https://www.luogu.com.cn/problem/CF1790E 字面描述 题面翻译 共有 ttt 组数据。 每组数据你会得到一个正整数 xxx&…...

漏洞预警|Apache Kafka Connect JNDI注入漏洞

棱镜七彩安全预警 近日网上有关于开源项目Apache Kafka Connect JNDI注入漏洞&#xff0c;棱镜七彩威胁情报团队第一时间探测到&#xff0c;经分析研判&#xff0c;向全社会发起开源漏洞预警公告&#xff0c;提醒相关安全团队及时响应。 项目介绍 Karaf是Apache旗下的一个开…...

企业小程序开发步骤【教你创建小程序】

随着移动互联网的兴起&#xff0c;微信已经成为了很多企业和商家必备的平台&#xff0c;而其中&#xff0c;微信小程序是一个非常重要的工具。本文将为大家介绍小程序开发步骤&#xff0c;教你创建小程序。 步骤一、注册小程序账号 先准备一个小程序账号&#xff0c;在微信公…...

刚性电路板的特点及与柔性电路板的区别

打开市场上的任何一个电子产品&#xff0c;会发现里面都有一块或多块电路板。电路板是电子产品运行的核心&#xff0c;之前沐渥小编已经给大家介绍了柔性电路板&#xff0c;下面给大家介绍刚性电路板的基础知识。 刚性电路板俗称硬板&#xff0c;是由不容易变形的刚性基材制成的…...

扫码过磅+车牌识别,内蒙古蒙维过磅实现信息化管理

扫码过磅、车牌识别、对接SAP ERP系统设计思路&#xff1a; 无人值守系统升级改造包括车牌自动识别系统、信息化&#xff08;扫码等方式&#xff09;管理系统、智能自动控制系统等实现信息无纸化传递。远程监管地点设于公司东磅房&#xff0c;可以实现远程监测监控画面、称重过…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

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

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

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...