【算法】FFT-1(递归实现)(不包括IFFT)

news2024/12/25 1:37:47

FFT

      • 多项式
      • 多项式乘法
      • 复数及运算
      • 导数
      • 泰勒公式及展开式
      • 欧拉公式
      • 单位根
    • FFT
      • Code
    • IFFT

多项式

我们从课本中可以知道,一个 n − 1 n-1 n1 次的多项式可以写成 a 0 + a 1 x + a 2 x 2 + a 3 x 3 + ⋯ + a n − 1 x n − 1 a_{0}+a_{1}x+a_{2}x^2+a_{3}x^3+\dots+a_{n-1}x^{n-1} a0+a1x+a2x2+a3x3++an1xn1

用高级一点的表示法就是:
一个 n − 1 n-1 n1 n n n 项多项式 f ( x ) f(x) f(x) 可以表示为:

f ( x ) = ∑ i = 0 n − 1 a i x i f(x)=\sum_{i=0}^{n-1}a_ix^i f(x)=i=0n1aixi

所以我们可以用每一项的系数来表示 f ( x ) f(x) f(x),即

f ( x ) = { a 0 , a 1 , a 2 , … , a n − 1 } f(x)=\{a_0,a_1,a_2,\dots,a_{n-1}\} f(x)={a0,a1,a2,,an1}

俗称系数表示法。

但是,当我们把这个多项式看成一个函数时,我们将 n n n 个不同的 x x x 带入,会得到 n n n 个不一样的 y y y,而我们就得到了 n n n 个点的坐标,它们确定唯一的多项式 f ( x ) f(x) f(x)

证明很简单,直接待定系数法就可以解决。

那么 f ( x ) f(x) f(x) 还可以用这 n n n 个点表示:

f ( x ) = { ( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x n − 1 , y n − 1 ) } f(x)=\{(x_0,y_0),(x_1,y_1),(x_2,y_2),\dots,(x_{n-1},y_{n-1})\} f(x)={(x0,y0),(x1,y1),(x2,y2),,(xn1,yn1)}

(其中 y i = f ( x i ) y_i=f(x_i) yi=f(xi))

俗称点值表示法。

多项式乘法

对于两个系数表示法表示的多项式 f ( x ) f(x) f(x) g ( x ) g(x) g(x),如果要计算它们的乘积 h ( x ) h(x) h(x),我们需要枚举 f ( x ) f(x) f(x) 的每一项和 g ( x ) g(x) g(x) 的每一项相乘,最后累计,时间复杂度 O ( n 2 ) O(n^2) O(n2)

那么换成点值表示呢?时间复杂度为 O ( n ) O(n) O(n)

Why?

设两个多项式 f ( x ) f(x) f(x) g ( x ) g(x) g(x) 分别为:

f ( x ) = { ( x 0 , y 1 0 ) , ( x 1 , y 1 1 ) , ( x 2 , y 1 2 ) , … , ( x n − 1 , y 1 n − 1 ) } f(x)=\{(x_0,y1_0),(x_1,y1_1),(x_2,y1_2),\dots,(x_{n-1},y1_{n-1})\} f(x)={(x0,y10),(x1,y11),(x2,y12),,(xn1,y1n1)}

(其中 y 1 i = f ( x i ) y1_i=f(x_i) y1i=f(xi))

g ( x ) = { ( x 0 , y 2 0 ) , ( x 1 , y 2 1 ) , ( x 2 , y 2 2 ) , … , ( x n − 1 , y 2 n − 1 ) } g(x)=\{(x_0,y2_0),(x_1,y2_1),(x_2,y2_2),\dots,(x_{n-1},y2_{n-1})\} g(x)={(x0,y20),(x1,y21),(x2,y22),,(xn1,y2n1)}

(其中 y 2 i = g ( x i ) y2_i=g(x_i) y2i=g(xi))

那么结果 h ( x ) h(x) h(x) 为:

h ( x ) = { ( x 0 , y 2 0 ⋅ y 1 0 ) , ( x 1 , y 2 1 ⋅ y 1 1 ) , ( x 2 , y 2 2 ⋅ y 1 2 ) , … , ( x n − 1 , y 2 n − 1 ⋅ y 1 n − 1 ) } h(x)=\{(x_0,y2_0 \cdot y1_0),(x_1,y2_1 \cdot y1_1),(x_2,y2_2 \cdot y1_2),\dots,(x_{n-1},y2_{n-1} \cdot y1_{n-1})\} h(x)={(x0,y20y10),(x1,y21y11),(x2,y22y12),,(xn1,y2n1y1n1)}

好,我们就结束了

但是怎么将系数表示法转换为点值表示法呢?


复数及运算

高中课本里讲过复数,不过不知道也没关系,这里会讲。

定义:复数单位 i i i 满足 i 2 = − 1 i^2=-1 i2=1,则形如 a + b i a+bi a+bi 的数为复数。 ( a , b ∈ R ) (a,b\in R) (a,bR)

其中 a a a 叫做实部, b b b 叫做虚部, i i i 为虚数单位。

所以有 − 7 = 7 i \sqrt{-7}=\sqrt7i 7 =7 i

类似平面直角坐标系,在复平面直角坐标系中,复数为其中的一个点。

如下图:

点(3,2)表示的复数为 3 + 2 i 3+2i 3+2i

它也可以表示为( 1 3 , θ \sqrt 13,\theta 1 3,θ

定义:一个复数的模为它到原点的距离。

及复数 z = a + b i z=a+bi z=a+bi 的模记为 ∣ z ∣ = a 2 + b 2 |z|=\sqrt{a^2+b^2} z=a2+b2

一个复数的共轭复数为其虚部取反。

及复数 z = a + b i z=a+bi z=a+bi 的共轭复数为 z ˉ = a − b i \bar{z}=a-bi zˉ=abi z z ˉ = a 2 + b 2 z \bar{z} = a^2 +b^2 zzˉ=a2+b2

其实就跟共轭根式差不多。

复数的运算其实跟实数的运算差不多。

z 1 = a + b i z_1 = a + bi z1=a+bi z 2 = c + d i z_2 = c + di z2=c+di

加减法:实部和虚部分别相加减:

z 1 ± z 2 = ( a ± c ) + ( b ± d ) i z_1 \pm z_2 = (a \pm c) + (b \pm d)i z1±z2=(a±c)+(b±d)i

乘法:硬算出奇迹(拆完后合并同类项)

z 1 z 2 = ( a c − b d ) + ( b c + a d ) i z_1z_2 = (ac - bd) + (bc + ad)i z1z2=(acbd)+(bc+ad)i

( a 1 , θ 1 ) ( a 2 , θ 2 ) = ( a 1 a 2 , θ 1 + θ 2 ) (a_1,\theta_1)(a_2,\theta_2)=(a_1a_2,\theta_1+\theta_2) (a1,θ1)(a2,θ2)=(a1a2,θ1+θ2)

除法:化简

z 1 z 2 = a + b i c + d i = ( a + b i ) ( c − d i ) ( c + d i ) ( c − d i ) = a c − b d i 2 + b c i − a d i c 2 − d 2 i 2 = ( a c + b d ) + ( b c − a d ) i c 2 + d 2 \dfrac{z_1}{z_2} = \dfrac{a+bi}{c+di}=\dfrac{(a+bi)(c-di)}{(c+di)(c-di)}=\dfrac{ac-bdi^2+bci-adi}{c^2-d^2i^2}=\dfrac{(ac+bd)+(bc-ad)i}{c^2+d^2} z2z1=c+dia+bi=(c+di)(cdi)(a+bi)(cdi)=c2d2i2acbdi2+bciadi=c2+d2(ac+bd)+(bcad)i

导数

和初中的 y = … y=\dots y= 不一样,我们用 f ( x ) f(x) f(x) 来表示一个关于 x x x 的函数。

一般地,已知函数 y = f ( x ) y=f(x) y=f(x) x 0 , x 1 x_0,x_1 x0,x1 是其定义域内不同两点,记 Δ x = x 1 − x 0 , Δ y = y 1 − y 0 = f ( x 1 ) − f ( x 0 ) = f ( x 0 + Δ x ) − f ( x 0 ) \Delta x=x_1-x_0,\Delta y=y_1-y_0=f(x_1)-f(x_0)=f(x_0+\Delta x)-f(x_0) Δx=x1x0,Δy=y1y0=f(x1)f(x0)=f(x0+Δx)f(x0),则当 Δ x ≠ 0 \Delta x\neq 0 Δx=0 时,商 f ( x 0 + Δ x ) − f ( x 0 ) Δ x = Δ y Δ x \frac{f(x_0+\Delta x)-f(x_0)}{\Delta x}=\frac{\Delta y}{\Delta x} Δxf(x0+Δx)f(x0)=ΔxΔy 称作函数 y = f ( x ) y=f(x) y=f(x)在区间 $[x_0,x_0 +_\Delta x] $ 上的平均变化率。

Δ x \Delta x Δx 趋近于 0 0 0 时,平均变化率 Δ y Δ x = f ( x 0 + Δ x ) − f ( x 0 ) Δ x \frac{\Delta y}{\Delta x}=\frac{f(x_0+\Delta x)-f(x_0)}{\Delta x} ΔxΔy=Δxf(x0+Δx)f(x0) 趋近于一个常数 l l l,那么常数 l l l 称为函数 f ( x ) f(x) f(x) 在点 x 0 x_0 x0 的瞬时变化率。

趋近于可以用符号 → \to 表示,所以上面那句话可以这样表示:

Δ x → 0 \Delta x \to 0 Δx0 时, f ( x 0 + Δ x ) − f ( x 0 ) Δ x → l \frac{f(x_0+\Delta x)-f(x_0)}{\Delta x} \to l Δxf(x0+Δx)f(x0)l

或记作:

lim ⁡ Δ x → 0 f ( x 0 + Δ x ) − f ( x 0 ) Δ x = l \lim_{\Delta x \to 0} \frac{f(x_0+\Delta x)-f(x_0)}{\Delta x}=l limΔx0Δxf(x0+Δx)f(x0)=l

函数在 x 0 x_0 x0 的瞬时变化率,通常称为 f ( x ) f(x) f(x) x = x 0 x=x_0 x=x0 处的导数,并记作 f ′ ( x 0 ) f'(x_0) f(x0)

注意,是 f ′ f' f

那么对于函数 f ( x ) f(x) f(x) 怎么求导呢?

如下:

{ ( x a ) ′ = a x a − 1 ( c ) ′ = 0 ( e x ) ′ = e x ( ln ⁡ x ) ′ = 1 x ( sin ⁡ x ) ′ = cos ⁡ x ( cos ⁡ x ) ′ = sin ⁡ x } \begin{Bmatrix} (x^a)'=ax^{a-1} \\ (c)'=0 \\ (e^x)'=e^x \\ (\ln x)'=\frac{1}{x} \\ (\sin x)'=\cos x \\ (\cos x)'=\sin x \end{Bmatrix} (xa)=axa1(c)=0(ex)=ex(lnx)=x1(sinx)=cosx(cosx)=sinx

例如 f ( x ) = x 2 f(x)=x^2 f(x)=x2,则 f ′ ( x ) = 2 x f'(x)=2x f(x)=2x

最后再说一点 f ′ ( x ) f'(x) f(x) 表示函数 f ( x ) f(x) f(x) x x x 取值为几时切线的斜率。

泰勒公式及展开式

泰勒公式:

f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + ⋯ + f ( n ) ( x 0 ) n ! ( x − x 0 ) n + R n + 1 ( x ) f(x)=f(x_0)+f'(x_0)(x-x_0)+\frac{f''(x_0)}{2!}(x-x_0)^2+\dotsb +\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n+R_{n+1}(x) f(x)=f(x0)+f(x0)(xx0)+2!f′′(x0)(xx0)2++n!f(n)(x0)(xx0)n+Rn+1(x)

其中 R R R 为误差。

那么当 x 0 = 0 x_0=0 x0=0 时,得到麦克劳林公式:

f ( x ) = f ( 0 ) + f ′ ( 0 ) x + f ′ ′ ( 0 ) 2 ! x 2 + ⋯ + f ( n ) ( 0 ) n ! x n + R n + 1 ( x ) f(x)=f(0)+f'(0)x+\frac{f''(0)}{2!}x^2+\dotsb +\frac{f^{(n)}(0)}{n!}x^n+R_{n+1}(x) f(x)=f(0)+f(0)x+2!f′′(0)x2++n!f(n)(0)xn+Rn+1(x)

所以我们就有了以下几个展开式:

{ e x = 1 + x + x 2 2 ! + x 3 3 ! + ⋯ + x n n ! + ⋯ ln ⁡ ( 1 + x ) = x − x 2 2 + x 3 3 + ⋯ + ( − 1 ) n − 1 x n n + ⋯ sin ⁡ x = ∑ k = 0 ∞ ( − 1 ) k x 2 k + 1 ( 2 k + 1 ) ! cos ⁡ x = ∑ k = 0 ∞ ( − 1 ) k x 2 k ( 2 k ) ! } \begin{Bmatrix} e^x=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\dotsb+\frac{x^n}{n!}+\dotsb \\ \ln(1+x)=x-\frac{x^2}{2}+\frac{x^3}{3}+\dotsb+(-1)^{n-1}\frac{x^n}{n}+\dotsb \\ \sin x=\sum_{k=0}^{\infty}(-1)^k\frac{x^{2k+1}}{(2k+1)!} \\ \cos x=\sum_{k=0}^{\infty}(-1)^k\frac{x^{2k}}{(2k)!} \end{Bmatrix} ex=1+x+2!x2+3!x3++n!xn+ln(1+x)=x2x2+3x3++(1)n1nxn+sinx=k=0(1)k(2k+1)!x2k+1cosx=k=0(1)k(2k)!x2k

欧拉公式

接上文,展开 e i x e^{ix} eix,得:
e i x = 1 + i x − x 2 2 ! − i x 3 3 ! + x 4 4 ! + i x 5 5 ! − x 6 6 ! − i x 7 7 ! + ⋯   ) e^{ix}=1+ix-\frac{x^2}{2!}-i\frac{x^3}{3!}+\frac{x^4}{4!}+i\frac{x^5}{5!}-\frac{x^6}{6!}-i\frac{x^7}{7!}+\dotsb) eix=1+ix2!x2i3!x3+4!x4+i5!x56!x6i7!x7+)
e i x = ( 1 − x 2 2 ! + x 4 4 ! − x 6 6 ! + ⋯   ) + i ( x − x 3 3 ! + x 5 5 ! − 7 3 7 ! + ⋯   ) e^{ix}=(1-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+\dotsb) +i(x-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{7^3}{7!}+\dotsb) eix=(12!x2+4!x46!x6+)+i(x3!x3+5!x57!73+)

e i x = cos ⁡ x + i sin ⁡ x e^{ix}=\cos x+i\sin x eix=cosx+isinx

x = π x=\pi x=π 带入:

e i π = cos ⁡ π + i sin ⁡ π = − 1 e^{i\pi}=\cos \pi + i\sin \pi=-1 e=cosπ+isinπ=1

所以欧拉恒等式出来:

e i π + 1 = 0 e^{i\pi}+1=0 e+1=0

单位根

n n n 为正整数,若 x n = 1 x^n=1 xn=1 ,则 x x x n n n 次单位根。

下文默认 n = 2 m , m n=2^m,m n=2m,m为正整数。

根据上文的欧拉公式,我们可知 e 2 k π i = cos ⁡ 2 k π + i sin ⁡ 2 k π = 1 e^{2k \pi i}=\cos 2k\pi+i\sin 2k\pi=1 e2kπi=cos2+isin2=1,故 n n n 次单位根分别是: e 2 k π i n = cos ⁡ 2 k π n + i sin ⁡ 2 k π n , ( k = 0 , 1 , 2 , … , n − 1 ) e^{\frac{2k\pi i}{n}}=\cos \frac{2k\pi}{n}+i\sin \frac{2k\pi}{n},(k=0,1,2,\dots,n-1) en2kπi=cosn2+isinn2,(k=0,1,2,,n1)

接上文复数的知识,每个单位根在复平面上的坐标为 ( cos ⁡ 2 k π n , sin ⁡ 2 k π n ) (\cos \frac{2k\pi}{n},\sin \frac{2k\pi}{n}) (cosn2,sinn2)
如图:

在一个标准复平面坐标系上,以 1 1 1 为半径画一个圆, n n n次单位根可以想象为把这个圆平分为 n n n 分中每一个点。

我们用 ω n 1 , ω n 2 , ω n 3 , … , ω n n \omega_n^1,\omega_n^2,\omega_n^3,\dots,\omega_n^n ωn1,ωn2,ωn3,,ωnn 来表示 n n n 次单位根的每一个根,及方程的每一个解。

所以有 ω n k = cos ⁡ k 2 π n + i sin ⁡ k 2 π n \omega_n^k=\cos k\frac{2\pi}{n}+i\sin k\frac{2\pi}{n} ωnk=coskn2π+isinkn2π

如当 n = 4 n=4 n=4时, ω 4 = 1 , − 1 , i , − 1 \omega_4=1,-1,i,-1 ω4=1,1,i,1

如当 n = 1 n=1 n=1 时, ω 1 = 1 \omega_1=1 ω1=1

单位根的性质:

ω 2 n 2 k = ω n k = − ω n k + n 2 \omega_{2n}^{2k}=\omega_{n}^{k}=-\omega _n^{k+\frac{n}{2}} ω2n2k=ωnk=ωnk+2n

ω n 0 = ω n n = 1 \omega_n^0=\omega_n^n=1 ωn0=ωnn=1

ω 2 n 2 k = cos ⁡ 2 k 2 π 2 n + i sin ⁡ 2 k 2 π 2 n = ω n k \omega_{2n}^{2k}=\cos 2k \frac{2\pi}{2n}+i\sin 2k \frac{2\pi}{2n}=\omega_n^k ω2n2k=cos2k2n2π+isin2k2n2π=ωnk

ω n n 2 = cos ⁡ n 2 ⋅ 2 π n + i sin ⁡ n 2 ⋅ 2 π n = cos ⁡ π + i sin ⁡ π = − 1 \omega_n^{\frac{n}{2}}=\cos \frac{n}{2}\cdot \frac{2\pi}{n}+i\sin \frac{n}{2}\cdot \frac{2\pi}{n}=\cos \pi+i\sin \pi=-1 ωn2n=cos2nn2π+isin2nn2π=cosπ+isinπ=1

FFT

n n n 为偶数, k < n 2 k<\frac{n}{2} k<2n

A ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + ⋯ + a n − 1 x n − 1 A(x)=a_{0}+a_{1}x+a_{2}x^2+a_{3}x^3+\dots+a_{n-1}x^{n-1} A(x)=a0+a1x+a2x2+a3x3++an1xn1
A 1 ( x ) = a 0 + a 2 x + a 4 x 2 + ⋯ + a n − 2 x n 2 − 1 A_1(x)=a_0+a_2x+a_4x^2+\cdots+a_{n-2}x^{\frac{n}{2}-1} A1(x)=a0+a2x+a4x2++an2x2n1
A 2 ( x ) = a 1 + a 3 x + a 5 x 2 + ⋯ + a n − 1 x n 2 − 1 A_2(x)=a_1+a_3x+a_5x^2+\cdots+a_{n-1}x^{\frac{n}{2}-1} A2(x)=a1+a3x+a5x2++an1x2n1
所以有:
A ( x ) = A 1 ( x 2 ) + x A 2 ( x 2 ) A(x)=A_1(x^2)+xA_2(x^2) A(x)=A1(x2)+xA2(x2)
A ( ω n k ) = A 1 ( ω n 2 k ) + ω n k A 2 ( ω n 2 k ) A(\omega_n^k)=A_1(\omega_n^{2k})+\omega_n^kA_2(\omega_n^{2k}) A(ωnk)=A1(ωn2k)+ωnkA2(ωn2k)
A ( ω n k + n 2 ) = A 1 ( ω n 2 k + n ) + ω n k + n 2 A 2 ( ω n 2 k + n ) = A 1 ( ω n 2 k ) − ω n k A 2 ( ω n 2 k ) A(\omega_n^{k+\frac{n}{2}})=A_1(\omega_n^{2k+n})+\omega_n^{k+\frac{n}{2}}A_2(\omega_n^{2k+n})=A_1(\omega_n^{2k})-\omega_n^kA_2(\omega_n^{2k}) A(ωnk+2n)=A1(ωn2k+n)+ωnk+2nA2(ωn2k+n)=A1(ωn2k)ωnkA2(ωn2k)

发现了什么?没错,只有后面一坨是相反的,这说明我们可以 O ( 1 ) O(1) O(1) 通过第一个式子得出第二个式子

所以 k k k 只要枚举前 n 2 \frac{n}{2} 2n 个数就可以了,问题缩小了一半,而缩小后还能继续缩小,所以我们用类似线段树的分治(递归)来解决它,时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

Code

void fft(int limit,complex *a,int type)
{
    if(limit==1) 
		return ;
    complex a1[limit>>1],a2[limit>>1];
    for(int i=0;i<=limit;i+=2)
        a1[i>>1]=a[i],a2[i>>1]=a[i+1];
    fft(limit>>1,a1,type);
    fft(limit>>1,a2,type);
    complex Wn=complex(cos(2.0*Pi/limit),type*sin(2.0*Pi/limit)),w=complex(1,0);
    for(int i=0;i<(limit>>1);i++,w=w*Wn)
        a[i]=a1[i]+w*a2[i],a[i+(limit>>1)]=a1[i]-w*a2[i];
}

IFFT

但是光有点值还是不够的,我们还要转换为数值,这就是 IFFT。
至于还有一个迭代优化。
我们下篇博客再讲。

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

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

相关文章

从 0 搭建 Vite 3 + Vue 3 Js版 前端工程化项目

之前分享过一篇vue3+ts+vite构建工程化项目的文章,针对小的开发团队追求开发速度,不想使用ts想继续使用js,所以就记录一下从0搭建一个vite+vue3+js的前端项目,做记录分享。 技术栈 Vite 3 - 构建工具 Vue 3 Vue Router - 官方路由管理器 Pinia - Vue Store你也可以选择vue…

2023年【G2电站锅炉司炉】考试试卷及G2电站锅炉司炉模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G2电站锅炉司炉考试试卷是安全生产模拟考试一点通生成的&#xff0c;G2电站锅炉司炉证模拟考试题库是根据G2电站锅炉司炉最新版教材汇编出G2电站锅炉司炉仿真模拟考试。2023年【G2电站锅炉司炉】考试试卷及G2电站锅炉…

Unity 接入TapADN播放广告时闪退 LZ4JavaSafeCompressor

通过跟踪安卓日志&#xff0c;发现报如下错误 Didnt find class "com.tapadn.lz4.LZ4JavaSafeCompressor" 解决方案&#xff1a; 去掉Minify这边的勾选&#xff0c;再打包即可。

香港优才计划是什么意思?一文详解2023年最新政策!

香港优才计划是什么意思&#xff1f;一文详解2023年最新政策&#xff01; 目前香港优才计划申请火热&#xff0c;但是还是有很多新手不太了解这个项目&#xff0c;跟风申请绝对不是什么好事&#xff0c;先了解清楚再考虑也是对自己对家人的一种交代。这篇文章就再来科普下。 优…

AWVS 使用方法归纳

1.首先确认扫描的网站&#xff0c;以本地的dvwa为例 2.在awvs中添加目标 输入的地址可以是域名也可以是ip&#xff0c;只要本机可以在浏览器访问的域名或ip即可 添加地址及描述之后&#xff0c;点击保存&#xff0c;就会展现出目标设置选项 business criticality译为业务关键…

SpringCloud之服务网关Gateway组件使用——详解

目录 一、网关介绍 1.什么是服务网关 2. 为什么需要网关 3.网关组件在微服务中架构 二、服务网关组件 1. zuul 1.x 2.x(netflix 组件) 1.1 zuul版本说明 2. gateway (spring) 2.1 特性 2.2 开发网关动态路由 2.2.1.创建项目引入网关依赖 2.2.2 快捷方式配置路由 2.2…

C++学习——类和对象(上)

C学习——类和对象 一、面向对象和面向过程的初步认识二、什么是类 一、面向对象和面向过程的初步认识 我们之前学习了C语言&#xff0c;我们知道 ① C语言&#xff1a;C语言是一门面向过程的语言&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函…

Web安全之SQL注入:明明设置了强密码,为什么还会被别人登录?

一、背景 让我们先来看一个案例。某天&#xff0c;当你在查看应用的管理后台时&#xff0c;发现有很多异常的操作。接着&#xff0c;你很快反应过来了&#xff0c;这应该是黑客成功登录了管理员账户。于是&#xff0c;你立刻找到管理员&#xff0c;问他是不是设置了弱密码。管…

jenkins 代码执行 (CVE-2017-1000353)漏洞复现

jenkins 代码执行 (CVE-2017-1000353)漏洞复现 名称: jenkins 代码执行 &#xff08;CVE-2017-1000353&#xff09; 描述: ​Jenkins 可以通过其网页界面轻松设置和配置,其中包括即时错误检查和内置帮助。 插件 通过更新中心中的 1000 多个插件,Jenkins 集成了持续集成和持续…

分享一套MES源码,可以直接拿来搞钱的好项目

目前国内智能制造如火如荼&#xff0c;工厂信息化、数字化是大趋势。如果找到一个工厂&#xff0c;搞定一个老板&#xff0c;搞软件的朋友就能吃几年。 中国制造业发达&#xff0c;工厂林立&#xff0c;但是普遍效率不高&#xff0c;需要信息化提高效率。但是矛盾的地方在于&a…

删除链表的倒数第N个节点,剑指offerII(21),力扣

目录 题目地址&#xff1a; 题目&#xff1a; 相似类型题&#xff1a; 我们直接看本题题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 解题分析&#xff1a; 解题思路&#xff08;双指针&#xff09;&#xff1a; 代码实现&#xff1a; 代码说明&#xff1a; 代…

算法训练 第九周

一、移动零 1.双指针 我们可以设定两个指针i和j&#xff0c;其中i用来遍历整个数组&#xff0c;j用来遍历存放不为零的数的位置&#xff0c;当nums[i]不等于零时&#xff0c;就让nums[i]和nums[j]进行交换&#xff0c;然后j,当我们遍历完整个数组之后就完成了操作&#xff0c;…

基于Python的网络爬虫设计与实现

基于Python的网络爬虫设计与实现 摘要&#xff1a;从互联网时代开始&#xff0c;网络搜索引擎就变得越发重要。大数据时代&#xff0c;一般的网络搜索引擎不能满足用户的具体需求&#xff0c;人们更加注重特定信息的搜索效率&#xff0c;网络爬虫技术应运而生。本设计先对指定…

初识Linux(2).妈妈再也不用担心我Linux找不到门了。

文章目录 前言 1.man指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a; 2.cp指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a;把123.txt复制到a目录中类似window如下操作&#xff1a; 3.mv例如&#xff1a;类似window如下操作&#xff1a; 4.nano例…

Mysql快速查找用逗号分割的列中含有某个字符的行:FIND_IN_SET

看标题比较绕口&#xff0c;但是我举一个例子你就清楚了 这是一个查询&#xff1a;我现在想要的是attr_val中含有黑色属性的行&#xff1a; 你用模糊匹配可以&#xff0c;用REGEXP也行&#xff0c;下面介绍一种mysql自带的函数&#xff1a;FIND_IN_SET。它的用法是&#xff1a…

深度学习之基于百度飞桨PaddleOCR图像字符检测识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介主要特点使用步骤 二、功能三、系统四. 总结 一项目简介 # Introduction to PaddleOCR Image Character Detection and Recognition System Based on Baidu…

干货分享 | TSMaster采样点配置方法与消除错误帧流程

当通讯节点间采样点参数和波特率参数不匹配造成一些错误帧时&#xff0c;我们如何在TSMaster中设置以及调整波特率参数和采样点参数&#xff0c;来减少以及消除总线上出现的错误帧&#xff0c;进一步提高通信质量。本文着重讲解讲解如何借用TSmaster更加便捷地获取相应的采样点…

nodejs669在线图书借阅管理系统vue前端

系统的设计与实现主要实现角色有管理员和用户,管理员在后台管理用户模块、用户表模块、图书借阅模块、图书归还模块、图书分类模块、token表模块、收藏表模块、书籍信息模块、图书资讯模块、留言板模块、书籍信息评论表模块、注册用户模块、配置文件模块、处罚记录模块、在线客…

Linux中执行java命令报错:cannot execute binary file: Exec format error

网上很多文章 都是说操作系统和JDK&#xff0c;32位和64位不兼容问题 当你非常确定你的操作系统是64位&#xff0c;并且JDK也是64位的时候 或者非常确定你的操作系统是32位&#xff0c;并且JDK也是32位的时候 怎么办&#xff1f; 使用以下命令&#xff0c;查看你的操作系统…

浏览器兼容性问题及其解决方案

一、认识浏览器 四大内核&#xff1a; Blink、Gecko、WebKit、Trident (不再活跃) 主流浏览器&#xff1a; IE(Trident内核)、Firefox(火狐&#xff1a;Gecko内核)、Safari(苹果&#xff1a;webkit内核)、Google Chrome(谷歌&#xff1a;Blink内核)、Opera(欧朋&#xff1a;B…