多项式与快速傅里叶变换(FFT)

2023-11-14

    上次算导老师讲分治高精度乘法(n^1.8左右的复杂度),并且说acm里就有这个、、、、然后我小声bb说acm里高精度快速乘是nlogn的,然后一阵虚因为自己不会FFT。今天算法课又提到了并且我和同学吹牛快速傅里叶变换只要nlogn巴拉巴拉,然后又一阵虚、、、今天晚上就来学一下、、、

    两个多项式相乘所需时间是n方,而FFT能把多项式相乘的时间复杂度降为nlogn。

    FFT最常见用途是信号处理:将时间域上信号(一个把时间映射到振幅的函数)表示成不同频率的相移正弦曲线的加权叠加。

    定义多项式的次数:如果一个多项式A(x)的最高次非零系数是a_k(系数0~k),那么称A(x)的次数是k,记degree(A) = k。

    定义多项式的次数界:任何严格大于k的整数都是A(x)的次数界。如果一个多项式次数界是n,那么它的次数可能是n-1到0。

    对于多项式乘法,如果A(x)和B(x)的次数界都是n,那么它们的乘积是一个次数界为2n-1的多项式,对于所有属于定义域的x都有C(x)=A(x)B(x)。乘积C(x)可以表示成:   \sum_{j=0}^{2n-2}{c_jx^j}其中c_j=\sum_{k=0}^{j}{a_k b_j_-_k}

    对于这个c_j=\sum_{k=0}^{j}{a_k b_j_-_k},如果写出向量a、b、c,那么称向量c为向量a、b的卷积,表示成c=a\bigotimes b。卷积与傅里叶变换有着密切的关系。利用一点性质,即两函数的傅里叶变换的乘积等于它们卷积后的傅里叶变换,能使傅里叶分析中许多问题的处理得到简化。

    卷积的定义简单定义:卷积是分析数学中一种重要的运算。设:f(x),g(x)是R1上的两个可积函数,作积分:

可以证明(我不会证明),关于几乎所有的实数x,上述积分是存在的。这样,随着x的不同取值,这个积分就定义了一个新函数h(x),称为函数fg的卷积。然后把该定义推广到离散的数列上,发现c_j=\sum_{k=0}^{j}{a_k b_j_-_k}是和上述定义的积分形式一致的。

    多项式的两种表达方式:系数表示法和点值表示法。系数表示法就是把系数存进数组显然相乘是n^2的复杂度。点值是用n个点来确定一个次数界为n的多项式(显然对于次数界为n的多项式能用n个互异的点来确定)。

    点值表示法的乘法计算:对于f(x)和s(x)这两个次数界为n的函数,各选n个点(x_0,y_0),(x_1,y_1)到(x_n_-_1,y_n_-_1)以及(x_0,z_0)到(x_n_-_1,z_n_-_1),那么f(x)s(x)为(x_0,y_0z_0),(x_1,y_1z_1)……(x_n_-_1,y_n_-_1z_n_-_1)。显然点值表达法的运算复杂度是线性的。

    FFT思路就是把两个多项式从系数改为点值表达(DFT),用点值表达算完后再变回系数表达(IDFT)。因为C(x)是2n-1次数界的,所以要从A(x)、B(x)上各选2n个点,相乘后才能得到2n个点来唯一确定C(x)。

    现在我们有了系数表达的多项式,要表示出点值表达有很多选法,而选法是有很多的。我们要用一种特殊的选点法来计算。

    在分析FFT之前先解决一个小问题:证明由点值表达转换回系数表达(点转系数的计算称为插值)后得到的系数是唯一的。其实就是我们知道了矩阵等式:\begin{bmatrix} 1 & x_0 & ... & x_0^n^-^1 & \\ 1& x_1 & ... & x_1^n^-^1 & \\ ... & ... & ... & ... & \\ 1& x_n_-_1 & ... & x_n_-_1^n^-^1 & \end{bmatrix}\begin{bmatrix} a_0\\ a_1\\ ...\\ a_n_-_1 \end{bmatrix}=\begin{bmatrix} y_0\\ y_1\\ ...\\ y_n_-_1 \end{bmatrix}。已知了左边的方阵和等号右边的矩阵y,求系数矩阵a。显然左边的矩阵的行列式是范德蒙行列式,所以左边的矩阵可逆,所以系数矩阵a唯一。

    现在开始分析插值(由点值表达转换回系数表达)怎么计算,如果裸的求上述矩阵的逆是\theta (n^3)的复杂度,比原来的还复杂,还有专门的求插值的基于拉格朗日定理的\theta(n^2)算法,在这里意义也不大。

    为了选合适的点,先了解一下单位复根的定义性质。

    n次单位复根是满足\omega^n=1的复数\omega,n次单位复根恰好有n个:e^{ \frac{2\pi ik}{n}}(k=0,1,2...n - 1)。用欧拉公式可证。称\omega_n为主n次单位根,其它单位根都是它的幂次。n个n次单位复根在乘法意义下形成了一个与群(Z_n,+)结构相似的群(比如有等式\omega_n^n=\omega_n^0=1;\omega _n^j\omega_n^k=\omega_n^{(j+k)mod n})。

    一些性质:消去引力:对任何非负整数n、k以及正整数d有\omega_n^{n/2}=(e^{2\pi i/dn})^d^k=(e^{2\pi i/n})^k=\omega_n^k

  比如:对于任意偶数n>0,有\omega_n^{n/2}=\omega_2=-1

                    折半引理 : 如果n>0为偶数,那么n个n次单位复根的平方的集合就是n/2个n/2次单位复根的集合。

 折半引理对于用分治策略来对多项式的系数与点值表达进行相互转换是非常重要的,它保证子问题规模只有原问题的一半。

                   求和引理:\sum_{i=0}^{n-1}{(\omega_n^k)^i}=0(证明用等比数列求和公式)。

DFT:

我们希望计算次数界为n的系数表示的多项式A(x)在n个n次单位复根处的值。系数为a=(a_0,a_1...a_n-1),对于k=0, 1, 2,...n-1定义y_k=A(\omega_n^k)=\sum_{j=0}^{n-1}{a_j\omega_n^{kj}},则称向量y=(y_0,y_1,,,y_n_-_1)就是系数向量a=(a_0,a_1...a_n-1)的离散傅里叶变换(DFT)。我们也记为y=DFT_n(a)

FFT:

上述DFT过程是\theta(n^2)的,而用快速傅里叶变换(FFT)就可以\theta(n\log n)求。

一下分析假设n是2的幂次,非二的幂次可以通过加点来凑成2的幂次。

FFT利用分治策略,新定义两个新的次数界为n/2的多项式A^{[0]]}(x)=a_0+a_2x^2+a_4x^4...a_n_-_2x^{n/2-1}A^{[1]}(x)=a_1+a_3x+a_5x^2...+a_n_-_1x^{n/2-1},于是有A(x)=A^{[0]}(x^2)+xA^{[1]}(x^2),问题规模分为了一半。

合并子问题之前先算几个东西:设y_k^{[0]}=A^{[0]}(\omega_{n/2}^k),y_k^{[1]}=A^{[1]}(\omega_{n/2}^k)。根据消去引理有\omega_{n/2}^k=\omega_n^{2k},所以有y_k^{[0]}=A^{[0]}(\omega_{n}^{2k}),y_k^{[1]}=A^{[1]}(\omega_{n}^{2k})。所以对于k=0,1,2,,,,n/2-1有

\\y_k\\=y_k^{[0]}+\omega_n^ky_n^{[1]}\\=A^{[0]}(\omega_n^{(2k)})+\omega_n^kA^{[1]}(\omega_n^{2k})\\=A(\omega_n^k)

\\y_{k+n/2}\\=y_k^{[0]} = y_k{[0]}-\omega_n^ky_k^{[1]}\\=y_k^{[0]}+(-1)\omega_n^ky_k^{[1]}\\=y_k^{[0]}+\omega_n^{n/2}\omega_n^ky_k^{[1]}\\=y_k^{[0]}+\omega_k^{k+(n/2)}y_k^{[1]}\\=A^{[0]}(\omega_n^{2k})+\omega_n^{k+(n/2)}A^{[1]}(\omega_n^{2k})\\=A^{[0]}(\omega_n^{2k+n})+\omega_n^{k+(n/2)}A^{[1]}(\omega_n^{2k+n})\\=A(\omega_n^{k+(n/2)})

所以y可以线性时间内合并子问题,于是得递归式算出总复杂度\theta(nlogn)

IDFT:

把DFT写成矩阵形式,\begin{bmatrix} 1 & x_0 & ... & x_0^n^-^1 & \\ 1& x_1 & ... & x_1^n^-^1 & \\ ... & ... & ... & ... & \\ 1& x_n_-_1 & ... & x_n_-_1^n^-^1 & \end{bmatrix}\begin{bmatrix} a_0\\ a_1\\ ...\\ a_n_-_1 \end{bmatrix}=\begin{bmatrix} y_0\\ y_1\\ ...\\ y_n_-_1 \end{bmatrix},对应写成V_na=y,其中V_n是范德蒙矩阵,n是2的幂次,求a=V_n^{-1}y

    定理:若V_n的(j, k)处元素为\omega_n^{kj},对于j,k=0,1,2,,,,n-1,V_n^{-1}的(j, k)处元素为\omega_n^{-kj}/n

    证明:我们证明V_nV_n^{-1}=I_n,其中I_n是nxn的单位矩阵。

              [V_n_V_n^{-1}]_{j,j^`}\\=\sum _{k=0}^{n-1}((\omega_n^{-kj}/n)\omega_n^{kj^{`}})\\=\sum_{k=0}^{n-1}{\omega_n^{k(j-j^`)}/n}

其中如果j=j^`  ,那么和为1;否则根据求和引理得和为0.。注意j-j^`  不能整除n。证毕。

所以可以推导出a_j=\frac{1}{n}\sum_{k=0}^{n-1}{y_k\omega_n^{-kj}},观察该式和DFT里的y_k=A(\omega_n^k)=\sum_{j=0}^{n-1}{a_j\omega_n^{kj}},只要把a和y互换,用\omega_n^{-1}替换\omega_n,并且将计算结果除n,就能同样\theta(nlogn)解决点值表示转换回系数表示的问题。

然后总结一下系数转点\theta(nlogn),点之间相乘\theta(n),点转回系数\theta(nlogn),总复杂度\theta(nlogn)



从下午六点学到了晚上十二点半,现在是第二天早上了又搞了半个小时终于搞完辣!!!呼啦啦!!!代码还没学,学个板子再回来更新。



2018.10.10 更新。

关于实现递归版本的就不写(copy)了,写(copy)一下迭代版本的。

蝴蝶操作(不重要):

    合并子问题时的代码:

\\FOR (k = 0) TO (n/2-1)\\y_k = y_k^{[0]}+\omega y_k^{[1]}\\y_{k+(n/2)}=y_k^{[0]}-\omega y_k^{[1]}\\\omega = \omega\omega_n

其中\omega随着迭代而变化,称其为旋转因子,因为在复数域上它在旋转。

注意到这中间包含了两次\omega y_k^{[1]}的运算,可以用变量t存一下,只算一次。称其为蝴蝶操作。(在用电路实现FFT里很有用但是在代码里只是小常数而已......)

观察此地归树,我们注意到如果把初始向量a中的元素按其在叶节点中出现次序进行安排,就可以对递归的FFT来追踪,不过是从底往上追踪。其实每次按照奇偶性分两组满足一个叫蝴蝶定理的东西,也就的图里展示的规律——原序列和后序列的每个数在二进制上相反。于是我们就能由原序列直接得到后序列,也就是递归树的叶子层,然后两两合并就行,避免了递归。

然后取反也是有套路的:求反序存进R数组,R是这么求的:没看懂说真的。。。当板子用吧。

        int len1 = strlen(str1);
        int len2 = strlen(str2);
        int len = 1, LL = 0;
        while(len < len1 * 2 || len < len2 * 2) len <<= 1, LL++;
        for(int i = 0; i < len; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (LL - 1));

len1是多项式A的次数界,其他同理。

给出模板,hdu1402

/**
len is power of 2
on == 1 mean DFT
on == -1 mean IDFT
*/
#include <queue>
#include <cstdio>
#include <cstring>
#include <utility>
#include <iostream>
#include <map>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
#define N 800010
#define M 3645
const int INF = 0x3f3f3f3f;
const double eps = 1e-5;
const double PI = acos(-1);
#define fi first
#define se second
#define rep(i, lll, nnn) for(int i = (lll); i <= (nnn); i++)

struct Complex {
  double x, y;
  Complex(double x = 0.0, double y = 0.0):x(x), y(y){}
  Complex(const Complex & t) {
      x = t.x; y = t.y;
  }
  Complex operator * (const Complex & t) {
      return Complex(x * t.x - y * t.y, x * t.y + y * t.x);
  }
  Complex operator + (const Complex & t) {
      return Complex(x + t.x, y + t.y);
  }
  Complex operator - (const Complex & t) {
      return Complex(x - t.x, y - t.y);
  }
};

const int MAXN = 200010;
int R[MAXN];
void change(Complex y[], int len)
{
    for(int i = 0; i < len; i++) {
        if(i < R[i]) swap(y[i], y[R[i]]);
    }
}

void fft(Complex y[], int len, int on) {
    change(y, len);
    for(int h = 2; h <= len; h<<= 1) {
        Complex wn(cos(-on * 2 * PI / h), sin(-on * 2 * PI / h));
        for(int j = 0; j < len; j += h) {
            Complex w(1, 0);
            for(int k = j; k < j + h / 2; k++) {
                Complex u = y[k];
                Complex t = w * y[k + h / 2];
                y[k] = u + t;
                y[k + h / 2] = u - t;
                w = w * wn;
            }
        }
    }
    if(on == -1) {
        for(int i = 0; i < len; i++) {
            y[i].x /= len;
        }
    }
}

Complex x1[MAXN], x2[MAXN];
char str1[MAXN / 2], str2[MAXN / 2];
int sum[MAXN];

int main()
{
    while(scanf("%s%s", str1, str2) == 2) {
        int len1 = strlen(str1);///次数界
        int len2 = strlen(str2);
        int len = 1, LL = 0;
        while(len < len1 * 2 || len < len2 * 2) len <<= 1, LL++;///扩充成2的幂次
        for(int i = 0; i < len; i++) ///求反序列
            R[i] = (R[i >> 1] >> 1) | ((i & 1) << (LL - 1));
        for(int i = 0; i < len; i++)
            x1[i] = Complex(str1[len1 - 1 - i] - '0', 0);
        for(int i = len1; i < len; i++)
            x1[i] = Complex(0, 0);
        for(int i = 0; i < len2; i++)
            x2[i] = Complex(str2[len2 - 1 - i] - '0', 0);
        for(int i = len2; i < len; i++)
            x2[i] = Complex(0, 0);
///DFT
        fft(x1, len, 1);
        fft(x2, len, 1);
///点乘
        for(int i = 0; i < len; i++) {
            x1[i] = x1[i] * x2[i];
        }
///IDFT
        fft(x1, len, -1);

        for(int i = 0; i < len; i++) {
            sum[i] = (int)(x1[i].x + 0.5);
        }
        for(int i = 0; i < len; i++) {
            sum[i + 1] += sum[i] / 10;
            sum[i] %= 10;
        }
        len = len1 + len2 - 1;
        while(sum[len] <= 0 && len > 0) len--;
        for(int i = len; i >= 0; i--) {
            printf("%c", sum[i] + '0');
        }
        puts("");
    }

    return 0;
}

 

    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多项式与快速傅里叶变换(FFT) 的相关文章

  • 为什么我的输出是空白图像?

    这是我编写的一些用于显示图像幅度谱的代码 orig imdata imread Original Image png spec orig fft2 double orig imdata spec orig2 abs spec orig sp
  • 在matlab中进行FFT移位的有效方法(不使用fftshift函数)

    http www mathworks com help techdoc ref fftshift html http www mathworks com help techdoc ref fftshift html 如果您检查该链接 这就是
  • C# 中用于语音认证的互相关和 FFT

    这是与其他问题类似的问题 但不是重复的问题 但是 我仍然无法得到正确的结果 我基本上试图记录两个 Wav 文件 1 基本文件 2 临时文件 然后将其转换为字节并传递给 Aforge FFT 然后传递给相关性 很少有混乱 当我录制文件时 我使
  • 复数如何捕获 FFT 结果中的相位、幅度和频率?

    据我了解 幅度和相位是在 fft 结果的实部和虚部中捕获的 但每个样本如何捕获相位呢 相位与时域中提供的 N 个离散样本相关吗 也就是说 如果输入样本一秒钟包含 44100 个样本 那么 FFT 的每个结果值是否代表相位的 1 44100
  • 从 *.wav 文件中提取幅度列表以在 Python 中使用

    我在编程和转换方面遇到了一些麻烦 我正在设计一个人工智能来识别乐器演奏的音符 并需要从波形文件中提取原始声音数据 我的目标是对文件中的时间块执行 FFT 运算以供 AI 使用 为此 我需要音频文件的幅度列表 但我似乎找不到可行的转换技术 这
  • 我应该从 getFft 看到什么样的输出?

    好吧 我正在努力创建一个 Android 音频可视化应用程序 问题是 我从 getFft 方法中得到的结果与谷歌所说的它应该产生的结果不一致 我一直追溯到 C 源代码 但我对 C 或 FFT 不够熟悉 无法真正理解正在发生的事情 我将尝试包
  • iOS FFT 绘制频谱

    我读过这些问题 使用 Apple FFT 和加速框架 https stackoverflow com questions 3398753 using the apple fft and accelerate framework 使用 Acc
  • fftw c2c:转换后的真实数据中缺少对称性

    最近我遇到了一些关于fftw的使用及其c2c转换的问题 参见 3d c2c fft 与 fftw 库 https stackoverflow com questions 10374656 3d c2c fft with fftw libra
  • Matlab fft 函数交换索引

    我编写了一个简单且非常小的 Matlab 代码 用于计算给定数组 或向量 的离散傅里叶变换 我手动计算出来并得到了答案 我的 Matlab 代码也给出了相同的答案 但fft通过交换索引给出了与此不同的答案 以下是我所做的手动计算 这是第二张
  • 简单就地离散傅立叶变换 (DFT)

    我正在编写一个非常简单的就地 DFT 我正在使用此处显示的公式 http en wikipedia org wiki Discrete Fourier transform Definition http en wikipedia org w
  • 傅里叶变换+emgucv

    谁能告诉我这段代码有什么问题吗 基本上我正在尝试计算图像的 dft 并将其显示为屏幕上的图像 Image
  • numpy fft 对于小素数乘积的长度来说速度很快,但是有多小呢?

    我见过几个例子 表明如果输入长度是 2 3 5 7 等的乘积 那么 numpy 的 fft 实现速度很快 但是这里仍然被认为是 小 的最大素数是多少呢 请注意 scipy 的 FFT 的基数为 2 3 4 和 5 参考 https docs
  • Python 中频谱图的 FFT

    我将如何使用 Python 从 WAV PCM 文件读取频率峰值 然后能够生成它的图像以进行频谱图分析 我正在尝试制作一个程序 允许您读取任何音频文件 将其转换为 WAV PCM 然后找到峰值和截止频率 Python 波库 http doc
  • 在 Android 上查找音调

    如何从我的语音记录中找到最小 最大 平均 标准偏差音调 我使用 AudioRecord 来录制我的声音 frequency 8000 channelConfiguration AudioFormat CHANNEL CONFIGURATIO
  • matplotlib imshow 编辑 x 轴

    我想显示图像的幅度谱 我可以使用以下代码来做到这一点 import numpy as np import matplotlib pyplot as plt import pylab pylab gray pic pylab imread C
  • 绘制图像的傅里叶变换时出现问题。 “ValueError:x 和 y 不能大于二维,但具有形状 (2592,) 和 (2592, 1, 3)”

    我正在尝试获取图像的 fft 然后使用 matplotlib 绘制该 fft 的 fraq 然而 这个错误信息 ValueError x 和 y 不能大于二维 但具有形状 2592 和 2592 1 3 我尝试像这样重塑我的 np arra
  • C 中的二维傅里叶变换

    我使用该网站的方程实现了 2D DFT 和 IDFThttp homepages inf ed ac uk rbf HIPR2 fourier htm http homepages inf ed ac uk rbf HIPR2 fourie
  • DSP 库 - RFFT - 奇怪的结果

    最近我一直在尝试在我的STM32F4 Discovery评估板上进行FFT计算 然后将其发送到PC 我已经调查了我的问题 我认为我对制造商提供的 FFT 函数做错了 我正在使用 CMSIS DSP 库 现在我一直在用代码生成样本 如果工作正
  • 我的傅立叶逆变换中的尖峰

    我正在尝试在 MATLAB 中比较两个数据集 为此 我需要通过傅里叶变换数据来过滤数据集 对其进行过滤 然后对其进行逆傅里叶变换 然而 当我对数据进行逆傅里叶变换时 我在红色数据集的两端都出现了一个尖峰 图片显示了第一个尖峰 它在开始时应该
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉

随机推荐

  • HttpCanary使用指南——各种神奇的插件

    HttpCanary更多资料 点我 作为目前Android平台最强大的抓包工具 HttpCanary从设计之初就规划了插件功能 2 6 0版本之前称为 模组 基于NetBare框架的虚拟网关 拦截器设计 HttpCanary可以实现非常多的
  • 2020春秋招聘图像处理 人工智能方向 各大厂面试常见题整理一(附答案)(阿里腾讯华为字节)

    因为本人近期也要紧临毕业 面临招聘面试 所以整体别人公开的面经 做一个整理 并且加上自己认为的答案 欢迎各位读者对答案进行指正和交流 深度残差的作用 直观上 深度加深 出现梯度消失和梯度爆炸的问题 在论文中 出现了一个奇怪的现象 就是56层
  • Hive命令的使用

    命令行界面 Command Line Interface CLI 是Hive交互最常见也是最方便的方式 在命令行界面可以执行Hive支持的觉大多数功能 如查询 创建等 hive e 有时 并不需要一直打开命令行界面 也就是说执行完查询后立刻
  • Vue-ref用法

    用ref操作模版中的dom元素 1 在模版中 声明ref名称 div ref引用Dom节点 div 2 用法 change this refs chagneBack style color red 用ref操作组件 1 在组件引用中声明re
  • Redis 汇总

    Redis 0 声明 1 概述 1 1 Redis是什么 1 2 Redis优缺点 1 3 为什么要用 Redis 为什么要用缓存 1 4 Redis为什么这么快 2 常用数据结构 2 1 String 应用场景 2 2 List 应用场景
  • Jetpack Compose多平台用于Android和IOS

    JetBrains和外部开源贡献者已经努力工作了几年时间来开发Compose Multiplatform 并最近发布了适用于iOS的Alpha版本 自然地 我们对其功能进行了测试 并决定通过使用该框架在iOS上运行我们的Dribbble复制
  • Matlab中求数据概率分布的方法

    一 问题描述 对已有的一些列数据进行分析 想得到该数据的分布和统计特性 如概率密度函数 概率分布 累计概率密度等等 例如 已有一段时间的声音测量数据 求该数据的分布特性 并给出噪声的95 置信区间统计参数以表征该声音监测数据的总体水平 二
  • HTTP响应的结构是怎么样的?

    HTTP响应由三部分组成 状态行 响应头 响应正文 状态行 包括协议版本的Version 状态码 Status Code 回应短语 响应头 包括搭建服务器的软件 发送响应的时间 回应数据的格式等信息 响应正文 就是响应的具体数据 HTTP请
  • PROJ.4学习——初识PROJ

    PROJ 4介绍 初始认识 前言 PROJ是一个通用的坐标转换软件 它将地理空间坐标从一个坐标系转换为另一个坐标系 这包括地图投影和大地坐标变换 PROJ包含命令行应用程序 可以方便地从文本文件或直接从用户输入转换坐标 除了命令行实用程序之
  • eclipse安装教程(2021最新版)超级易懂到吐血

    第一步 下载JDK 下载地址 http www oracle com technetwork java javase downloads index html 第二步 根据自己电脑的系统 选择相应的版本x64代表64位 x86代表32位 点
  • 螺杆真空泵安装流程图_螺杆式真空泵基本知识送给刚入行的新朋友

    螺杆式真空泵是容积式真空泵中的新兴成员 出现于上世纪90年代前后 发展较晚 但作为一种理想干泵 螺杆式真空泵在面世后获得了快速发展 现在就跟小编去了解一下它的基本知识吧 一 螺杆式真空泵特点 螺杆式真空泵脱胎于螺杆式压缩机与螺杆液体输送泵
  • 精英反向与二次插值改进的黏菌算法-附代码

    精英反向与二次插值改进的黏菌算法 文章目录 精英反向与二次插值改进的黏菌算法 1 黏菌算法 2 改进黏菌算法 2 1 精英反向学习机制 2 2 二次插值方法 3 实验结果 4 参考文献 5 Matlab代码 6 python代码 摘要 针对
  • 关于集合Collection

    集合框架 概念 1 Collection是所有集合的顶级接口 2 集合和数组一样 可以保存一组元素 并且提供了操作元素的相关方法 使用更方便 3 Collection 下面有多种实现类 因此我们有更多的数据结构可以选择 Collection
  • 蓝桥杯2020年第十一届省赛真题-子串分值

    题目 题目链接 题解 思维 考虑每个字符对最终答案的贡献 每个字符的贡献为其左侧连续与之不相同的字符个数 1乘以其右侧与之不相同的字符个数 1 样例 ababc 第一个字符a的贡献 0 1 1 1 2 a ab 第二个字符b的贡献 1 1
  • Java使用poi-tl1.9.1生成Word文档的几个小技巧

    目录 前言 一 poi tl简介 1 什么是poi tl 2 常见的word生成对比 3 poi tl功能点 二 poi tl文档生成 1 模板准备 2 目标参数填充 3 生成效果 三 可能会遇到的问题 1 混合图表生成报错 2 图表参数设
  • Linux /etc/resolv.conf DNS服务器IP地址修改被覆盖问题

    为了临时修改DNS服务器IP地址 可能会选择手动修改 etc resolv conf 文件 而在重启Network Manager服务后 sudo systemctl restart NetworkManager resolv conf 文
  • mvc三层架构(用户信息管理系统)

    mvc三层架构 实战项目 用户信息管理系统 一 三层架构 View 层 用于接收用户提交请求的代码 Service 层 系统的业务逻辑主要在这里完成 Dao 层 直接操作数据库的代码 二 三层架构图 三 用户信息管理系统 利用MVC三层架构
  • 金蝶K3客户端:组件KdSvrMgr无法正常工作 排查分析步骤

    远程组件配置工具无法测试通过 并出错 对于以上错误 在其他的地方还会表现为 拒绝的权限 这样子的信息 其实问题实质是一样的 分析如下 1 远程中间层机器和本机网络不通 可以使用ping命令确认是否网络通畅 如果网络通了还是问题依旧 进入分析
  • LeetCode 448. Find All Numbers Disappeared in an Array

    原题网址 https leetcode com problems find all numbers disappeared in an array Given an array of integers where 1 a i n n siz
  • 多项式与快速傅里叶变换(FFT)

    上次算导老师讲分治高精度乘法 n 1 8左右的复杂度 并且说acm里就有这个 然后我小声bb说acm里高精度快速乘是nlogn的 然后一阵虚因为自己不会FFT 今天算法课又提到了并且我和同学吹牛快速傅里叶变换只要nlogn巴拉巴拉 然后又一