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

[算法] 前缀函数与KMP算法

前缀函数

前缀函数 n x t [ i ] nxt[i] nxt[i]定义为 子串 s [ 1 … i ] s[1\dots i] s[1i]最长的相等的真前缀与真后缀的长度。

计算前缀函数

	scanf("%s",b+1);lb=strlen(b+1);int j=0;nxt[1]=0;for(int i=2;i<=lb;i++){while(j&&b[j+1]!=b[i]) j=nxt[j];if(b[j+1]==b[i]) j++;nxt[i]=j;}

在线算法,时间复杂度 O ( n ) O(n) O(n)

应用

[KMP算法] 给定一个模式串和一个待匹配串,找出前者在后者中的所有位置

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000010;
char a[maxn],b[maxn];
int la,lb,next[maxn];
int main(){scanf("%s%s",a+1,b+1);la=strlen(a+1);lb=strlen(b+1);int j=0;for(int i=2;i<=lb;i++){while(j&&b[j+1]!=b[i]) j=next[j];if(b[j+1]==b[i]) j++;next[i]=j;}j=0;for(int i=1;i<=la;i++){while(j&&b[j+1]!=a[i]) j=next[j];if(b[j+1]==a[i]) j++;if(j==lb){printf("%d\n",i-lb+1);j=next[j];}}for(int i=1;i<=lb;i++){printf("%d ",next[i]);}return 0;
}
//把模式串与待匹配串接在一起,一次解决
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000010;
char a[maxn],b[maxn],c[maxn<<1];
int la,lb,lc,nxt[maxn<<1];
int main(){scanf("%s%s",a+1,b+1);la=strlen(a+1);lb=strlen(b+1);lc=0;for(int i=1;i<=lb;i++) c[++lc]=b[i];//b是模式串 c[++lc]='#';for(int i=1;i<=la;i++) c[++lc]=a[i];//a是待匹配串 int j=0;nxt[1]=0;for(int i=2;i<=lc;i++){while(j&&c[j+1]!=c[i]) j=nxt[j];if(c[j+1]==c[i]) j++;nxt[i]=j;if(i>lb+1){if(nxt[i]==lb) printf("%d\n",(i-lb-1)-lb+1);} }for(int i=1;i<=lb;i++){printf("%d ",nxt[i]);}return 0;
}

找字符串的所有周期

字符串的周期:对字符串 s s s 0 < p ≤ ∣ s ∣ 0 < p \le |s| 0<ps,若 s [ i ] = s [ i + p ] s[i] = s[i+p] s[i]=s[i+p] 对所有 i ∈ [ 1 , ∣ s ∣ − p ] i \in [1, |s| - p] i[1,sp] 成立,则称 p p p s s s 的周期。

字符串的 b o r d e r border border:对字符串 s s s 0 ≤ r < ∣ s ∣ 0 \le r < |s| 0r<s,若 s s s 长度为 r r r 的前缀和长度为 r r r 的后缀相等,就称 s s s 长度为 r r r 的前缀是 s s s b o r d e r border border

s s s 有长度为 r r r b o r d e r border border 可以推导出 ∣ s ∣ − r |s|-r sr s s s 的周期。

n x t [ i ] nxt[i] nxt[i] ,可以得到 s s s 所有的 b o r d e r border border 长度,即 n x t [ n ] , n x t [ n x t [ n ] ] , … nxt[n],nxt[nxt[n]], \ldots nxt[n],nxt[nxt[n]],,由此可以得出 s s s 所有的周期。
其中最小正周期为 ∣ s ∣ − n x t [ n ] |s|-nxt[n] snxt[n]

统计模式串每个前缀的出现次数

问题一: 统计每个前缀 s [ 1 … i ] s[1 \dots i] s[1i] 在同一个字符串 s s s 的出现次数

以位置 i i i 为右端点,有长度为 n x t [ i ] nxt[i] nxt[i] 的前缀,有长度为 n x t [ n x t [ i ] ] nxt[nxt[i]] nxt[nxt[i]] 的前缀,有长度为 n x t [ n x t [ n x t [ i ] ] ] nxt[nxt[nxt[i]]] nxt[nxt[nxt[i]]] 的前缀,等等,直到长度变为 0。

for(int i=1;i<=n;i++) cnt[nxt[i]]++;
for(int i=n;i>=1;i--) cnt[nxt[i]]+=cnt[i];
for(int i=1;i<=n;i++) cnt[i]++;//加上前缀自身

问题二: 统计每个前缀 s [ 1 … i ] s[1 \dots i] s[1i] 在另一个字符串 t t t 的出现次数

构造 s [ 1 … n ] s[1\dots n] s[1n]# t [ 1 … m ] t[1\dots m] t[1m]

	scanf("%s%s",a+1,b+1);la=strlen(a+1);lb=strlen(b+1);lc=0;for(int i=1;i<=lb;i++) c[++lc]=b[i];//b是模式串 c[++lc]='#';for(int i=1;i<=la;i++) c[++lc]=a[i];//a是待匹配串 int j=0;nxt[1]=0;for(int i=2;i<=lc;i++){while(j&&c[j+1]!=c[i]) j=nxt[j];if(c[j+1]==c[i]) j++;nxt[i]=j;}for(int i=lb+2;i<=lc;i++) cnt[nxt[i]]++;for(int i=lb;i>=1;i--) cnt[nxt[i]]+=cnt[i];for(int i=1;i<=lb;i++) printf("%d ",cnt[i]);

一个字符串中本质不同子串的数目

k k k 为当前 s s s 的本质不同子串数量,当前 s s s 的长度为 n n n
我们添加一个新的字符 c c c s s s 末尾。
显然,会有一些新的子串以字符 c c c 结尾。我们希望对这些以该字符结尾且我们之前未曾遇到的子串计数。

构造字符串 t = s [ 1 … n ] c t = s[1\dots n] c t=s[1n]c 并将其反转得到字符串 t ∼ t^{\sim} t
现在我们的任务变为计算有多少 t ∼ t^{\sim} t 的前缀未在 t ∼ t^{\sim} t 的其余任何地方出现。
如果我们计算了 t ∼ t^{\sim} t 的前缀函数最大值 n x t max ⁡ nxt_{\max} nxtmax,那么出现在 s ∼ s^{\sim} s 中的 t ∼ t^{\sim} t 前缀的最长长度为 n x t max ⁡ nxt_{\max} nxtmax。自然的,所有更短的前缀也出现了。

因此,当添加了一个新字符后新出现的子串数目为 ∣ s ∣ + 1 − n x t max ⁡ |s| + 1 - nxt_{\max} s+1nxtmax

所以对于每个添加的字符,我们可以在 O ( n ) O(n) O(n) 的时间内计算新子串的数目,故最终复杂度为 O ( n 2 ) O(n^2) O(n2)

值得注意的是,我们也可以重新计算在头部添加一个字符,或者从尾或者头移除一个字符时的本质不同子串数目。

字符串压缩

给定一个长度为 n n n 的字符串 s s s,我们希望找到其最短的「压缩」表示,也即我们希望寻找一个最短的字符串 t t t,使得 s s s 可以被 t t t 的一份或多份拷贝的拼接表示。

让我们计算 s s s 的前缀函数。通过使用该函数的最后一个值 n x t [ n − 1 ] nxt[n-1] nxt[n1],我们定义值 k = n − n x t [ n − 1 ] k = n - nxt[n-1] k=nnxt[n1]。我们将证明,如果 k k k 整除 n n n,那么 k k k 就是答案,否则不存在一个有效的压缩,故答案为 n n n

假定 n n n 可被 k k k 整除。那么字符串可被划分为长度为 k k k 的若干块。根据前缀函数的定义,该字符串长度为 n − k n - k nk 的前缀等于其后缀。但是这意味着最后一个块同倒数第二个块相等,并且倒数第二个块同倒数第三个块相等,等等。作为其结果,所有块都是相等的,因此我们可以将字符串 s s s 压缩至长度 k k k
诚然,我们仍需证明该值为最优解。实际上,如果有一个比 k k k 更小的压缩表示,那么前缀函数的最后一个值 n x t [ n − 1 ] nxt[n-1] nxt[n1] 必定比 n − k n - k nk 要大。因此 k k k 就是答案。

现在假设 n n n 不可以被 k 整除,我们将通过反证法证明这意味着答案为 n n n。假设其最小压缩表示 r r r 的长度为 p p p p p p 整除 n n n),字符串 s s s 被划分为 n / p ≥ 2 n / p \ge 2 n/p2 块。那么前缀函数的最后一个值 n x t [ n − 1 ] nxt[n-1] nxt[n1] 必定大于 n − p n - p np(如果等于则 n n n 可被 k k k 整除),也即其所表示的后缀将部分的覆盖第一个块。现在考虑字符串的第二个块。该块有两种解释:第一种为 r 0 r 1 … r p − 1 r_0 r_1 \dots r_{p-1} r0r1rp1,另一种为 r p − k r p − k + 1 … r p − 1 r 0 r 1 … r p − k − 1 r_{p-k} r_{p-k+1} \dots r_{p-1} r_0 r_1 \dots r_{p-k-1} rpkrpk+1rp1r0r1rpk1。由于两种解释对应同一个字符串,因此可得到 p p p 个方程组成的方程组,该方程组可简写为 r ( i + k ) m o d p = r i m o d p r_{(i + k) \bmod p} = r_{i \bmod p} r(i+k)modp=rimodp
r 0 r 1 r 2 … r k − 1 r k … r p − 1 r 0 r 1 r 2 … r p − 1 − k ⏞ n x t [ n − 1 ] r p − k … r p − 1 r 0 r 1 … r p − 1 − k r p − k … r p − 1 r 0 r 1 r 2 … r p − 1 − k ⏟ p r p − k … r p − 1 r 0 r 1 r 2 … r k − 1 r k … r p − 1 r 0 r 1 r 2 … r p − 1 − k r p − k … r p − 1 ⏟ n x t [ n − 1 ] \begin{gathered} \overbrace{r_0 ~ r_1 ~ r_2 ~ \dots ~ r_{k-1}~r_k~\dots~r_{p-1}r_0 ~ r_1 ~ r_2 ~ \dots ~ r_{p-1-k}}^{nxt[n-1]}~r_{p-k}~\dots~r_{p-1}\\ r_0 ~ r_1 ~ \dots ~ r_{p-1-k}~\underbrace{r_{p-k}~\dots~r_{p-1}r_0 ~ r_1 ~ r_2 ~ \dots ~ r_{p-1-k}}_{p}~r_{p-k}~\dots~r_{p-1}\\ r_0 ~ r_1 ~ r_2 ~ \dots ~ r_{k-1}~\underbrace{r_k~\dots~r_{p-1}r_0 ~ r_1 ~ r_2 ~ \dots ~ r_{p-1-k}~r_{p-k}~\dots~r_{p-1}}_{nxt[n-1]}\\ \end{gathered} r0 r1 r2  rk1 rk  rp1r0 r1 r2  rp1k nxt[n1] rpk  rp1r0 r1  rp1k p rpk  rp1r0 r1 r2  rp1k rpk  rp1r0 r1 r2  rk1 nxt[n1] rk  rp1r0 r1 r2  rp1k rpk  rp1
根据扩展欧几里得算法我们可以得到一组 x x x y y y 使得 x k + y p = gcd ⁡ ( k , p ) xk + yp = \gcd(k, p) xk+yp=gcd(k,p)。通过与等式 p k − k p = 0 pk - kp = 0 pkkp=0 适当叠加我们可以得到一组 x ′ > 0 和 y ′ < 0 x' > 0 和 y' < 0 x>0y<0 使得 x ′ k + y ′ p = gcd ⁡ ( k , p ) x'k + y'p = \gcd(k, p) xk+yp=gcd(k,p)。这意味着通过不断应用前述方程组中的方程我们可以得到新的方程组 r ( i + gcd ⁡ ( k , p ) ) m o d p = r i m o d p r_{(i + \gcd(k, p)) \bmod p} = r_{i \bmod p} r(i+gcd(k,p))modp=rimodp
由于 gcd ⁡ ( k , p ) \gcd(k, p) gcd(k,p) 整除 p p p,这意味着 gcd ⁡ ( k , p ) \gcd(k, p) gcd(k,p) r r r 的一个周期。又因为 n x t [ n − 1 ] > n − p nxt[n - 1] > n - p nxt[n1]>np,故有 n − n x t [ n − 1 ] = k < p n - nxt[n - 1] = k < p nnxt[n1]=k<p,所以 gcd ⁡ ( k , p ) \gcd(k, p) gcd(k,p) 是一个比 p p p 更小的 r r r 的周期。因此字符串 s s s 有一个长度为 gcd ⁡ ( k , p ) < p \gcd(k, p) < p gcd(k,p)<p 的压缩表示,同 p p p 的最小性矛盾。

相关文章:

[算法] 前缀函数与KMP算法

前缀函数 前缀函数 n x t [ i ] nxt[i] nxt[i]定义为 子串 s [ 1 … i ] s[1\dots i] s[1…i]最长的相等的真前缀与真后缀的长度。 计算前缀函数 scanf("%s",b1);lbstrlen(b1);int j0;nxt[1]0;for(int i2;i<lb;i){while(j&&b[j1]!b[i]) jnxt[j];if(b[j…...

电子学习中的关键游戏化元素

游戏化彻底改变了电子学习领域&#xff0c;提供了一种使学习具有吸引力、互动性和有效性的方法。通过将类似游戏的功能集成到教育平台中&#xff0c;教育工作者可以增强动力&#xff0c;提高知识记忆&#xff0c;并创造动态的学习体验。游戏化的关键要素为设计与学习者产生共鸣…...

通过端口测试验证网络安全策略

基于网络安全需求&#xff0c;项目中的主机间可能会有不同的网络安全策略&#xff0c;这当然是好的&#xff0c;但很多时候&#xff0c;在解决网络安全问题的时候&#xff0c;同时引入了新的问题&#xff0c;如k8s集群必须在主机间开放udp端口&#xff0c;否则集群不能正常的运…...

Mac配置maven环境及在IDEA中配置Maven

Mac配置maven环境及在IDEA中配置Maven 1. 介绍 Maven是一款广泛用于Java等JVM语言项目的工具&#xff0c;它以项目对象模型&#xff08;POM&#xff09;为基础进行项目管理&#xff0c;通过POM文件来定义项目信息和依赖关系。同时&#xff0c;它也是构建自动化工具&#xff0…...

TCP流套接字编程

TCP流套接字与UDP数据报套接字对比 API介绍 TCP协议核心的特点是面向字节流&#xff0c;是通过读取数据&#xff08;单位字节&#xff09;来完成通信。 TCP套接字与UDP套接字不同的点在于TCP是通过建立连接&#xff0c;使用输入流和输出流的方式完成通信。 ServerSocket 是…...

《硬件架构的艺术》笔记(七):处理字节顺序

介绍 本章主要介绍字节顺序的的基本规则。&#xff08;感觉偏软件了&#xff0c;不知道为啥那么会放进《硬件架构的艺术》这本书&#xff09;。 定义 字节顺序定义数据在计算机系统中的存储格式&#xff0c;描述存储器中的MSB和LSB的位置。对于数据始终以32位形式保存在存储器…...

IDEA2024如何创建Web项目以及配置Tomcat

在Web项目的开发过程中&#xff0c;Tomcat作为一款开源的Servlet容器&#xff0c;扮演着至关重要的角色。它不仅能够提供稳定的运行环境&#xff0c;还支持多种Java EE规范&#xff0c;为开发者提供了丰富的功能支持。因此&#xff0c;正确配置Tomcat服务器对于确保Web项目的顺…...

「Chromeg谷歌浏览器/Edge浏览器」篡改猴Tempermongkey插件的安装与使用

1. 谷歌浏览器安装及使用流程 1.1 准备篡改猴扩展程序包。 因为谷歌浏览器的扩展商城打不开&#xff0c;所以需要准备一个篡改猴压缩包。 其他浏览器只需打开扩展商城搜索篡改猴即可。 没有压缩包的可以进我主页下载。 也可直接点击下载&#xff1a;Chrome浏览器篡改猴(油猴…...

java学习记录12

ArrayList方法总结 构造方法 ArrayList() 构造一个初始容量为 10 的空列表。 ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。 实例方法 add(int index, E element) 在此list中的指定位置插入指定元素。 ArrayList<Integer> array…...

网络协议之DNS

一、DNS概述 域名系统&#xff08;Domain Name System&#xff0c;缩写&#xff1a;DNS&#xff09;是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网。DNS使用TCP和UDP端口53&#xff0c;通过递归查询请求的方式来…...

第02章_MySQL环境搭建(基础)

1. MySQL 的卸载 1.1 步骤1&#xff1a;停止 MySQL 服务 在卸载之前&#xff0c;先停止 MySQL8.0 的服务。按键盘上的 “Ctrl Alt Delete” 组合键&#xff0c;打开“任务管理器”对话 框&#xff0c;可以在“服务”列表找到“MySQL8.0” 的服务&#xff0c;如果现在“正在…...

反向代理模块

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…...

【强化学习的数学原理】第05课-蒙特卡洛方法-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、通过例子介绍蒙特卡洛二、 MC Basic 算法介绍三、MC Basic 算法例子例1&#xff1a;MC Baxic算法例2&#xff1a;episode le…...

Spring源码(十三):Spring全系列总结

Spring总结篇,不同于之前抽丝剥茧式地纵向深入源码,本次从横向的角度出发,希望可以带个读者一个完全不同的Spring视角。 2024年重置版,搞点不一样的东西。希望通过本篇的内容,将之前的文章全部给串起来。 相关前文: Spring Boot启动加载Spring Web请求处理流程Spring上…...

算法日记 33 day 动态规划(打家劫舍,股票买卖)

今天来看看动态规划的打家劫舍和买卖股票的问题。 上题目&#xff01;&#xff01;&#xff01;&#xff01; 题目&#xff1a;打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金…...

从零开始打造个人博客:我的网页设计之旅

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…...

用python将一个扫描pdf文件改成二值图片组成的pdf文件

使用墨水屏读书现在似乎越来越流行&#xff0c;这确实有一定的好处&#xff0c;例如基本不发热&#xff0c;电池续航时间超长&#xff0c;基本不能游戏所以有利于沉浸式阅读&#xff0c;还有不知道是不是真的有用的所谓防蓝光伤害。但是&#xff0c;如果阅读的书籍是扫描图片组…...

Electron开发构建工具electron-vite(alex8088)添加VueDevTools(VitePlugin)

零、介绍 本文章的electron-vite指的是这个项目&#x1f449;electron-vite仓库&#xff0c;electron-vite网站 本文章的VueDevTools指的是VueDevTools的Vite插件版&#x1f449;https://devtools.vuejs.org/guide/vite-plugin 一、有一个用electron-vite创建的项目 略 二、…...

服务器数据恢复—raid5阵列热备盘上线失败导致EXT3文件系统不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 两组分别由4块SAS硬盘组建的raid5阵列&#xff0c;两组阵列划分的LUN组成LVM架构&#xff0c;格式化为EXT3文件系统。 服务器故障&#xff1a; 一组raid5阵列中的一块硬盘离线。热备盘自动上线替换离线硬盘&#xff0c;但在热备盘上线同步数据…...

网络安全基础——网络安全法

填空题 1.根据**《中华人民共和国网络安全法》**第二十条(第二款)&#xff0c;任何组织和个人试用网路应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;遵守社会公德&#xff0c;不危害网络安全&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;煽动颠…...

go-rod vs Selenium:自动化测试工具的比较与选择

自动化测试是软件开发过程中的关键环节&#xff0c;它能够帮助我们发现缺陷、验证功能并提高软件质量。随着Web技术的快速发展&#xff0c;市场上出现了多种自动化测试工具&#xff0c;其中Selenium和go-rod是两个备受关注的选择。本文将从多个维度对这两个工具进行比较&#x…...

Ubuntu20.04+ROS 进行机械臂抓取仿真:环境搭建(一)

目录 一、从官网上下载UR机械臂 二、给UR机械臂添加夹爪 三、报错解决 本文详细介绍如何在Ubuntu20.04ROS环境中为Universal Robots的UR机械臂添加夹爪。首先从官方和第三方源下载必要的软件包&#xff0c;包括UR机械臂驱动、夹爪插件和相关依赖。然后&#xff0c;针对gazeb…...

Pytorch微调深度学习模型

在公开数据训练了模型&#xff0c;有时候需要拿到自己的数据上微调。今天正好做了一下微调&#xff0c;在此记录一下微调的方法。用Pytorch还是比较容易实现的。 网上找了很多方法&#xff0c;以及Chatgpt也给了很多方法&#xff0c;但是不够简洁和容易理解。 大体步骤是&…...

PPT分享 | IBM集团业务流程架构顶层规划-订单到交付-销售到回款方案

PPT下载链接见文末~ IBM业务流程规划方法是一套结构化、体系化的流程设计理论&#xff0c;其企业流程框架&#xff08;EPF&#xff09;是一种用于企业业务流程架构设计梳理的方法论。 一、IBM业务流程规划方法的核心 IBM的BPM&#xff08;业务流程管理&#xff09;流程管理体…...

后端并发编程操作简述 Java高并发程序设计 六类并发容器 七种线程池 四种阻塞队列

目录 并发集合 1. ConcurrentHashMap&#xff1a; 2. CopyOnWriteArrayList&#xff1a; 3. CopyOnWriteArraySet&#xff1a; 4. BlockingQueue系列&#xff1a; 5. ConcurrentSkipListMap 和 ConcurrentSkipListSet&#xff1a; 6. ConcurrentLinkedDeque&#xff1a;…...

基于LLama_factory的Qwen2.5大模型的微调笔记

Qwen2.5大模型微调记录 LLama-facrotyQwen2.5 模型下载。huggingface 下载方式Modelscope 下载方式 数据集准备模型微调模型训练模型验证及推理模型导出 部署推理vllm 推理Sglang 推理 LLama-facroty 根据git上步骤安装即可&#xff0c;要求的软硬件都装上。 llama-factory运行…...

resnet50,clip,Faiss+Flask简易图文搜索服务

一、实现 文件夹目录结构&#xff1a; templates -----upload.html faiss_app.py 前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…...

亚信安全与飞书达成深度合作

近日&#xff0c;亚信安全联合飞书举办的“走近先进”系列活动正式走进亚信。活动以“安全护航信息化 共筑数字未来路”为主题&#xff0c;吸引了众多数字化转型前沿企业的近百位领导参会。作为“走近先进”系列的第二场活动&#xff0c;本场活动更加深入挖掘了数字化转型的基础…...

Spring框架特性及包下载(Java EE 学习笔记04)

1 Spring 5的新特性 Spring 5是Spring当前最新的版本&#xff0c;与历史版本对比&#xff0c;Spring 5对Spring核心框架进行了修订和更新&#xff0c;增加了很多新特性&#xff0c;如支持响应式编程等。 更新JDK基线 因为Spring 5代码库运行于JDK 8之上&#xff0c;所以Spri…...

.net 8使用hangfire实现库存同步任务

C# 使用HangFire 第一章:.net Framework 4.6 WebAPI 使用Hangfire 第二章:net 8使用hangfire实现库存同步任务 文章目录 C# 使用HangFire前言项目源码一、项目架构二、项目服务介绍HangFire服务结构解析HangfireCollectionExtensions 类ModelHangfireSettingsHttpAuthInfoUs…...

python VS c++

一、语法特点 Python&#xff1a; 语法简洁、优雅&#xff0c;代码可读性极强&#xff0c;采用缩进来表示代码块&#xff0c;摒弃了像 C 那样使用大括号的传统方式&#xff0c;使得代码看上去十分清晰简洁。例如&#xff1a; ​ if 5 > 3:print("5大于3") elif 5 …...

windows C#-属性

属性提供了一种将元数据或声明性信息与代码(程序集、类型、方法、属性等)关联的强大方法。将属性与程序实体关联后&#xff0c;可以使用称为反射的技术在运行时查询该属性。 属性具有以下属性&#xff1a; 属性将元数据添加到您的程序中。元数据是有关程序中定义的类型的信息…...

Redis常见面试题总结(上)

Redis 基础 什么是 Redis&#xff1f; Redis &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的开源 NoSQL 数据库&#xff08;BSD 许可&#xff09;。与传统数据库不同的是&#xff0c;Redis 的数据是保存在内存中的&#xff08;内存数据库&#xf…...

小鹏汽车智慧材料数据库系统项目总成数据同步

1、定时任务处理 2、提供了接口 小鹏方面提供的推送的数据表结构&#xff1a; 这几个表总数为100多万&#xff0c;经过条件筛选过滤后大概2万多条数据 小鹏的人给的示例图&#xff1a; 界面&#xff1a; SQL: -- 查询车型 select bmm.md_material_id, bmm.material_num, bm…...

风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计

风尚云网前端学习&#xff1a;一个简易前端新手友好的HTML5页面布局与样式设计 简介 在前端开发的世界里&#xff0c;HTML5和CSS3是构建现代网页的基石。本文将通过一个简单的HTML5页面模板&#xff0c;展示如何使用HTML5的结构化元素和CSS3的样式特性&#xff0c;来创建一个…...

论文阅读:A fast, scalable and versatile tool for analysis of single-cell omics data

Zhang, K., Zemke, N.R., Armand, E.J. et al. A fast, scalable and versatile tool for analysis of single-cell omics data. Nat Methods 21, 217–227 (2024). 论文地址&#xff1a;https://doi.org/10.1038/s41592-023-02139-9 代码地址&#xff1a;https://github.com…...

【从零开始的LeetCode-算法】43. 网络延迟时间

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…...

一文理解 Python 编程语言中的 .strip() 方法

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ Python 中的 strip() 方法&#xff1a;初学者友好指南 在 Python 中&#xff0c;strip() 是一个极为实用的字符串方法&#xff0c;主要用于移除字符串首尾的特定字符。默认情况下&#xff0c;它会清除…...

solr 远程命令执行 (CVE-2019-17558)

漏洞描述 Apache Velocity是一个基于Java的模板引擎&#xff0c;它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目&#xff0c;旨在确保Web应用程序在表示层和业务逻辑层之间的隔离&#xff08;即MVC设计模式&#xff09;。 Apa…...

【cocos creator】下拉框

https://download.csdn.net/download/K86338236/90038176 const { ccclass, property } cc._decorator;type DropDownOptionData {optionString?: string,optionSf?: cc.SpriteFrame } type DropDownItemData {label: cc.Label,sprite: cc.Sprite,toggle: cc.Toggle }cccl…...

从 Llama 1 到 3.1:Llama 模型架构演进详解

编者按&#xff1a; 面对 Llama 模型家族的持续更新&#xff0c;您是否想要了解它们之间的关键区别和实际性能表现&#xff1f;本文将探讨 Llama 系列模型的架构演变&#xff0c;梳理了 Llama 模型从 1.0 到 3.1 的完整演进历程&#xff0c;深入剖析了每个版本的技术创新&#…...

电话机器人的最佳应用

电话机器人的最佳应用 作者&#xff1a;开源呼叫中心系统 FreeIPCC&#xff0c;Github地址&#xff1a;https://github.com/lihaiya/freeipcc 电话机器人在多个领域中都展现出了其独特的优势和广泛的应用前景。以下是对电话机器人最佳应用的详细归纳&#xff1a; 一、销售与营…...

[面试]-golang基础面试题总结

文章目录 panic 和 recover**注意事项**使用 pprof、trace 和 race 进行性能调试。**Go Module**&#xff1a;Go中new和make的区别 Channel什么是 Channel 的方向性&#xff1f;如何对 Channel 进行方向限制&#xff1f;Channel 的缓冲区大小对于 Channel 和 Goroutine 的通信有…...

Fakelocation Server服务器/专业版 ubuntu

前言:需要Ubuntu系统 Fakelocation开源文件系统需求 Ubuntu | Fakelocation | 任务一 任务一 更新Ubuntu&#xff08;安装下载不再赘述&#xff09; sudo -i # 提权 sudo apt update # 更新软件包列表 sudo apt upgrade # 升级已安装的软…...

Node.js的http模块:创建HTTP服务器、客户端示例

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战&#xff08;第2版&#xff09;&#xff08;Web前端技术丛书&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 要使用http模块&#xff0c;只需要在文件中通过require(http)引入即可。…...

Jackson 对象与json数据互转工具类JacksonUtil

下面是一个基于 Jackson 的工具类 JacksonUtil&#xff0c;用于在 Java 项目中实现对象与 JSON 数据之间的互相转换。该工具类具有简洁、易用、通用的特点。 package com.fy.common.util;import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core…...

【ArcGISPro】根据yaml构建原始Pro的conda环境

使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…...

对撞双指针(七)三数之和

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组…...

反向代理服务器的用途

代理服务器在网络中扮演着重要的角色&#xff0c;它们可以优化流量、保护服务器以及提高安全性。在代理服务器中&#xff0c;反向代理服务器是一种特殊类型&#xff0c;常用于Web服务器前&#xff0c;它具备多种功能&#xff0c;能够确保网络流量的顺畅传输。那么&#xff0c;让…...

一些好的AI技术学习平台和资料(动态更新)

1. 大模型 1.1 提示词&#xff08;Prompt&#xff09; 目前&#xff0c;大模型技术已经深入到工作生活的方方面面&#xff0c;各技术大厂的大模型也层出不穷&#xff0c;从开始的OpenAI一家独大&#xff0c;到当今世界的“百模大战”。从一些日常使用的角度来说&#xff0c;模…...