作者:中二攻子

链接:https://ac.nowcoder.com/discuss/175409

来源:牛客网

本文含NTT、MTT、拆系数FFT、共轭优化FFT、多项式求逆与ln

约定:

1、

表示一个普通的项数为
的幂次多项式,
是他的点值表示。

2、

代表单位根,
表示
次单位根。

3、

代表一个数列。

4、

表示原根。

多项式系列之零 底层知识:

多项式的表示:

多项式可以通过系数数列

表示,
的系数。

多项式可以通过点值表示,对于一个

次多项式,取
种不同的

取值带入

,得到
个值,在取相同这
个数的意义下,可以唯一的表示这个多项式。

多项式乘法:

定义

,在系数表示之下相乘复杂度
,在点值表示之下
,复杂度

复数:

复数一般情况下可以表示成

的形式,
是实数,

复数的幅角:平面直角坐标系上点

所在的任意角。

复数的模长:

两个复数相乘:

,复数相乘之后,模长等于原来两个复数的模长的乘积,幅角的角度等于原来两个幅角的和。

复数可以加减乘除,可以和实数一样的带入

在单位圆上从

开始平均取
个点,从
开始编号,分别是

画图观察可得:

所代表的复数
所代表的复数

DFT&IDFT:

科学的数学函数意义上DFT是讲一个函数转化成三角函数的加减乘除的形式,三角函数的系数是原函数系数与点值之间的变换规律。IDFT是DFT的逆变换。

1、什么是

:在
意义下
互不相同,即
可以张成整个
下的域。

2、

存在的条件:
是奇素数。

3、如何求

:把
进行质因数分解
,如果对于任意的
,总有
,暴力枚举即可。

CRT合并:

求解

,得

带入二式,得

,用逆元直接除便可;否则通过
可求得
,若无解则方程组无解。

最后

多项式全集之一 FFT:

什么是FFT:

FFT是利用DFT的特殊性质,把

带入
从而
求一个系数多项式的点值表示,所以叫FDFT。

的具体应用:

1、可以方便的IDFT:

的系数是
,在
的DFT下点值是
的系数是
,在
的DFT下点值是

,否则根据等比数列求和公式得

由此可得:

综上所述,对于点值取的

相反数做DFT再除以
可得到系数。

2、可以快速的DFT:

直接将

带入多项式做DFT需要复杂度
,我们利用
的性质优化:

按照奇偶分裂,

我们令

我们可以发现

现在我们把

带入,令

我们知道取

时,
的取值,就可以算出
,而
的长度都为
的一半,所以可以递归计算。

非递归优化FFT:

1、优化原理:

画图可知,递归版FFT最底层结束状态第

个位置的项是
二进制翻转后的结果。我们可以
的得到最底层的结果,然后向上模拟回溯合并即可。

2、蝴蝶变换:

由上述式子:

可得在迭代时

都只与
有关,所以我们可以用临时变量记录下一层的两个信息向上迭代。

共轭复数优化FFT:

1、优化原理:

(在DFT时)

那么

2、证明:

:为方便起见,我们用
代替

而在IDFT时,我们需要

数论优化FFT(NTT):

的共性:

1、

都互不相同

2、

3、

,由于原根的互不相同,

4、

5、

因为有这些共性,所以

可以代替

喜闻乐见的模板:

FFT模板(共轭优化)

namespace FFT{const double pi = acos(-1);struct cp{double x, y;cp() {x = y = 0;}cp(double X,double Y) {x = X; y = Y; }cp conj() {return (cp) {x, -y};}}a[3000005], b[3000005], c[3000005], I(0, 1), d[3000005];cp operator+ (const cp &a, const cp &b) {return (cp){a.x + b.x, a.y + b.y}; }cp operator- (const cp &a, const cp &b) {return (cp){a.x - b.x, a.y - b.y}; }cp operator* (const cp &a, const cp &b) {return (cp){a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x};}cp operator* (const cp &a, double b) {return (cp){a.x * b, a.y * b};}cp operator/ (const cp &a, double b) {return (cp){a.x / b, a.y / b};}struct p_l_e{int wz[3000005];void FFT(cp *a, int N, int op) {for(int i = 0; i < N; i++)if (i<wz[i]) swap(a[i],a[wz[i]]);for(int le = 2; le <= N; le <<= 1) {int mid = le >> 1;for(int i = 0; i < N; i += le) {cp x, y, w = (cp) {1, 0};cp wn = (cp){cos(op * pi / mid), sin(op * pi / mid)};for(int j = 0 ; j < mid; j++) {x = a[i + j]; y = a[i + j + mid] * w;a[i + j] = x + y;a[i + j + mid] = x - y;w = w * wn;}}}}void D_FFT(cp *a, cp *b, int N, int op){for(int i = 0; i < N; i++)    d[i] = a[i] + I * b[i];FFT(d, N, op);d[N] = d[0];for(int i = 0; i < N; i++){a[i] = (d[i] + d[N - i].conj()) / 2;b[i] = I * (-1) * (d[i] - d[N - i].conj()) / 2;}d[N] = cp(0, 0);}void mult(cp *a, cp *b, cp *c, int M){int N = 1, len = 0;while(N < M) N <<= 1, len++;for(int i = 0; i < N; i++)wz[i] = (wz[i >> 1] >> 1) | ((i & 1) << (len - 1));D_FFT(a, b, N, 1);for(int i = 0; i < N; i++)    c[i] = a[i] * b[i];FFT(c, N, -1);for(int i = 0; i < N; i++)    c[i].x = c[i].x / N;}}PLE;int n, m;void main() {scanf("%d%d", &n, &m); n++; m++;for(int i = 0; i < n; i++) scanf("%lf", &a[i].x);for(int i = 0; i < m; i++) scanf("%lf", &b[i].x);PLE.mult(a, b, c, n + m - 1); for(int i = 0; i < n + m - 1; i++)    printf("%d ", (int)round(c[i].x));return;}
}

NTT模板:

namespace NTT{typedef long long LL;const int mod = 998244353;const int g = 3;LL a[3000005], b[3000005], c[3000005];int n, m;LL qpow(LL a, LL b){LL ans = 1;while(b){if(b & 1)    ans = ans * a % mod;a = a * a % mod;b >>= 1;}return ans;}struct p_l_e{int wz[3000005];void NTT(LL *a, int N, int op) {for(int i = 0; i < N; i++) if(i < wz[i]) swap(a[i], a[wz[i]]);for(int le = 2; le <= N; le <<= 1) {int mid = le >> 1;LL wn = qpow(g, (mod - 1) / le);if(op == -1) wn = qpow(wn, mod - 2); for(int i = 0; i < N; i += le) {int w = 1, x, y;for(int j = 0; j < mid; j++) {x = a[i + j]; y = a[i + j + mid] * w % mod; a[i + j] = (x + y) % mod;a[i + j + mid] = (x - y + mod) % mod;w = w * wn % mod;}}}}void mult(LL *a, LL *b, LL *c, int M) {int N = 1, len = 0;while(N < M)    N <<= 1, len++;for(int i = 0; i < N; i++)    wz[i] = (wz[i >> 1] >> 1) | ((i & 1) << (len - 1));NTT(a, N, 1); NTT(b, N, 1);for(int i = 0; i < N; i++)    c[i] = a[i] * b[i] % mod;NTT(c, N, -1);LL t = qpow(N, mod - 2);for(int i = 0; i < N; i++)    c[i] = c[i] * t % mod;}}PLE;void main() {scanf("%d%d", &n, &m); n++; m++;for(int i = 0; i < n; i++)    scanf("%lld", &a[i]);for(int i = 0; i < m; i++)    scanf("%lld", &b[i]);PLE.mult(a, b, c, n + m - 1);for(int i = 0; i < n + m - 1; i++)    printf("%lld ", c[i]);}
}

多项式全集之二 任长任模的FFT:

三模NTT实现任模FFT:

1、为什么要用MTT:当

不是NTT模数或者多项式长度大于模数限制时,就要使用MTT。

2、MTT的使用原理:我们对初始多项式取模,那么如果在不取模卷积情况下,答案

不会超过
。我们取三个NTT模数
,分别做多项式乘法,得到
分别
的答案,通过CRT合并可以得到
的答案,如果
那么就可以得到准确的答案,再对
取模即可。

3、CRT合并的小优化:

初始式子
把一式二式合并(LL范围内)。
再次合并(不需要
快速乘)。

4、常用NTT模数:

以下模数的共同

拆系数FFT(CFFT)实现任模FFT:

1、实现原理:运用实数FFT不取模做乘法,然后取模回归到整数。但是由于误差较大(值域是

),我们令

把系数
,对
交叉做四遍卷积,求出答案按系数贡献取模加入。

2、可按合并DFT的方法优化DFT次数。

算法实现任长FFT:

不是
的幂次的时候,我们从式子入手:

喜闻乐见的模板:

三模NTT模板(注意:不可以MTT回来,因为系数会取模)

namespace MTT{typedef long long LL;int n, m;LL p, mod;const LL p1 = 998244353;const LL p2 = 1004535809;const LL p3 = 104857601;const int g = 3189;LL a[300005], b[300005], c[300005], cpa[300005], cpb[300005];LL c3[300005], c1[300005], c2[300005];LL qpow(LL a, LL b, LL mod) {LL ans = 1;while(b) {if(b & 1)    ans = ans * a % mod;a = a * a % mod;b >>= 1;}return ans;}const LL inv12 = qpow(p1, p2 - 2, p2);const LL inv123 = qpow(p1 * p2 % p3, p3 - 2, p3);struct p_l_e{int wz[300005];void MTT(LL *a, int N, int op) {for(int i = 0; i < N; i++)if(i < wz[i]) swap(a[i], a[wz[i]]);for(int le = 2; le <= N; le <<= 1) {int mid = le >> 1;LL wn = qpow(g, (mod - 1) / le, mod);if(op == -1) wn = qpow(wn, mod - 2, mod);for(int i = 0; i < N ;i += le) {LL w = 1, x, y;for(int j = 0; j < mid; j++) {x = a[i + j];y = a[i + j + mid] * w % mod;a[i + j] = (x + y) % mod;a[i + j + mid] = (x - y + mod) % mod;w = w * wn % mod;}}}}void mult(LL *a, LL *b, LL *c, int M) {int N = 1, len = 0;while(N < M) N <<= 1, len++;for(int i = 0; i < N; i++)wz[i] = (wz[i >> 1] >> 1) | ((i & 1) << (len - 1));MTT(a, N, 1); MTT(b, N, 1);for(int i = 0; i < N; i++)    c[i] = a[i] * b[i] % mod;MTT(c, N, -1);LL t = qpow(N, mod - 2, mod);for(int i = 0; i < N; i++)    c[i] = c[i] * t % mod;}}PLE;LL CRT(LL c1, LL c2, LL c3) {LL x = (c1 + p1 * ((c2 - c1 + p2) % p2 * inv12 % p2));LL y = (x % p + p1 * p2 % p * ((c3 - x % p3 + p3) % p3 * inv123 % p3) % p) % p;return y;}void merge(LL *c1, LL *c2, LL *c3, LL *c, int N) {for(int i = 0; i < N; i++)c[i] = CRT(c1[i], c2[i], c3[i]);return;}void main() {scanf("%d%d%lld", &n, &m, &p); n++; m++;for(int i = 0; i < n; i++)    scanf("%lld", &a[i]);for(int i = 0; i < m; i++)    scanf("%lld", &b[i]);mod = p1; memcpy(cpa, a, sizeof(a)); memcpy(cpb, b, sizeof(b)); PLE.mult(cpa, cpb, c1, n + m - 1);mod = p2; memcpy(cpa, a, sizeof(a)); memcpy(cpb, b, sizeof(b)); PLE.mult(cpa, cpb, c2, n + m - 1);mod = p3; memcpy(cpa, a, sizeof(a)); memcpy(cpb, b, sizeof(b)); PLE.mult(cpa, cpb, c3, n + m - 1);merge(c1, c2, c3, c, n + m - 1);for(int i = 0; i < n + m - 1; i++)    printf("%lld ", (c[i] % p + p) % p);return;}
}

拆系数FFT模板(注意:相同系数的两项可以合并一起IDFT。采用共轭优化法,只进行四次DFT)

namespace CFFT{typedef long long LL;int n, m, p ,sqrp; int a[300005], b[300005];const long double pi = acos(-1);struct cp{long double x, y;cp() {x = y = 0;}cp(long double X,long double Y) {x = X; y = Y; }cp conj() {return (cp) {x, -y};}}ka[300005], kb[300005], ta[300005], tb[300005], kk[300005], kt[300005], tt[300005], c[300005], I(0, 1), d[300005];cp operator+ (const cp &a, const cp &b) {return (cp){a.x + b.x, a.y + b.y}; }cp operator- (const cp &a, const cp &b) {return (cp){a.x - b.x, a.y - b.y}; }cp operator* (const cp &a, const cp &b) {return (cp){a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x};}cp operator* (const cp &a, long double b) {return (cp){a.x * b, a.y * b};}cp operator/ (const cp &a, long double b) {return (cp){a.x / b, a.y / b};}    struct p_l_e{int wz[300005];void FFT(cp *a, int N, int op){for(int i = 0; i < N; i++)if(i < wz[i])    swap(a[i], a[wz[i]]);for(int le = 2; le <= N; le <<= 1){int mid = le >> 1;cp x, y, w, wn = (cp){cos(op * 2 * pi / le), sin(op * 2 * pi / le)};for(int i = 0; i < N; i += le){w = (cp){1, 0};for(int j = 0; j < mid; j++){x = a[i + j];y = a[i + j + mid] * w;a[i + j] = x + y;a[i + j + mid] = x - y;w = w * wn;}}} }void D_FFT(cp *a, cp *b, int N, int op){for(int i = 0; i < N; i++)    d[i] = a[i] + I * b[i];FFT(d, N, op);d[N] = d[0];if(op == 1){for(int i = 0; i < N; i++){a[i] = (d[i] + d[N - i].conj()) / 2;b[i] = I * (-1) * (d[i] - d[N - i].conj()) / 2;}} else {for(int i = 0; i < N; i++){a[i] = cp(d[i].x, 0);b[i] = cp(d[i].y, 0);}}d[N] = cp(0, 0);}void mult(int *a, int *b, int M){int N = 1, len = 0;while(N < M) N <<= 1, len++;for(int i = 0; i < N; i++)wz[i] = (wz[i >> 1] >> 1) | ((i & 1) << (len - 1));for(int i = 0; i < N; i++){ka[i].x = a[i] >> 15;kb[i].x = b[i] >> 15;ta[i].x = a[i] & 32767;tb[i].x = b[i] & 32767;}D_FFT(ta, ka, N, 1); D_FFT(tb, kb, N, 1);for(int i = 0; i < N; i++){kk[i] = ka[i] * kb[i];kt[i] = ka[i] * tb[i] + ta[i] * kb[i];tt[i] = ta[i] * tb[i];}D_FFT(tt, kk, N, -1); FFT(kt, N, -1);for(int i = 0; i < N; i++){tt[i] = tt[i] / N;kt[i] = kt[i] / N;kk[i] = kk[i] / N;}}}PLE;void main() {scanf("%d%d%d", &n, &m, &p); n++; m++;for(int i = 0; i < n; i++)    scanf("%d", &a[i]),a[i] = a[i] % p;for(int i = 0; i < m; i++)    scanf("%d", &b[i]),b[i] = b[i] % p;PLE.mult(a, b, n + m - 1);for(int i = 0; i < n + m - 1; i++)printf("%lld ",(((((LL)round(kk[i].x)) % p) << 30) + ((((LL)round(kt[i].x)) % p) << 15) + ((LL)round(tt[i].x)) % p) % p);}
}

模板:
struct polynie {CP getw(int m, int k, int op) {return CP(cos(2 * pi * k / m), op * sin(2 * pi * k / m));}int wz[MAXN];CP A[MAXN], B[MAXN], C[MAXN];void FFT(CP *a, int N, int op) {rop(i, 0, N) if(i < wz[i]) swap(a[i], a[wz[i]]);for(int l = 2; l <= N; l <<= 1) {int mid = l >> 1;CP x, y, w, wn = CP(cos(pi / mid), sin(op * pi / mid));for(int i = 0; i < N; i += l) {w = CP(1, 0);rop(j, 0, mid) {x = a[i + j];y = w * a[i + j + mid];a[i + j] = x + y;a[i + j + mid] = x - y;w = w * wn;}}}}void mult(CP *a, CP *b, CP *c, int M) {int N = 1, len = 0;while(N < M) N <<= 1, len++;rop(i, 0, N) wz[i] = (wz[i >> 1] >> 1) | ((i & 1) << (len - 1));FFT(a, N, 1); FFT(b, N, 1);rop(i, 0, N) c[i] = a[i] * b[i];FFT(c, N, -1);rop(i, 0, N) c[i].x = c[i].x / N, c[i].y = c[i].y / N;}void blue_stein(CP *a, int M, int op) {int M2 = M << 1;memset(A, 0, sizeof(A));memset(B, 0, sizeof(B));memset(C, 0, sizeof(C));rop(i, 0, M) A[i] = a[i] * getw(M2, 1ll * i * i % M2, op);rop(i, 0, M2) B[i] = getw(M2, 1ll * (i - M) * (i - M) % M2, -op);mult(A, B, C, M2 + M - 1);rop(i, 0, M) a[i] = C[i + M] * getw(M2, 1ll * i * i % M2, op);if(op == -1) rop(i, 0, M) a[i].x = a[i].x / M, a[i].y = a[i].y / M;}
}PLE;

多项式全集之三 多项式求逆:

多项式求逆:

1、问题描述:

已知

,且
,求

2、推导过程:

由于

所以

那么

两边平方,得:

由于

的第
项为
一定有一项
,所以

两边同乘

,得:

喜闻乐见的模板:

namespace INV{typedef long long LL;int n, a[300005], b[300005];const int mod = 998244353;const int g = 3189;int qpow(int a, int b){int ans = 1;while(b){if(b & 1)    ans = 1ll * ans * a % mod;a = 1ll * a * a % mod;b >>= 1;}return ans;}struct p_l_e{int wz[300005], i_c[300005];void NTT(int *a, int N, int op){for(int i = 0; i < N; i++)if(i < wz[i]) swap(a[i], a[wz[i]]);for(int le = 2; le <= N; le <<= 1){int mid = le >> 1, wn = qpow(g, (mod - 1) / le);if(op == -1) wn = qpow(wn, mod - 2);for(int i = 0; i < N; i += le){LL w = 1; int x, y;for(int j = 0; j < mid; j++){x = a[i + j];y = w * a[i + j + mid] % mod;a[i + j] = (x + y) % mod;a[i + j + mid] = (x - y + mod) % mod;w = w * wn % mod;}}}}int init(int M){int N = 1, len = 0;while(N < M) N <<= 1, len++;    for(int i = 0; i < N; i++)wz[i] = (wz[i >> 1] >> 1) | ((i & 1) << (len - 1));return N;}void INV(int *a, int *b, int deg){if(deg == 1){b[0] = qpow(a[0], mod - 2); return;}INV(a, b, (deg + 1) >> 1);int N = init(deg + deg - 1);for(int i = 0; i < deg; i++) i_c[i] = a[i];for(int i = deg; i < N; i++) i_c[i] = 0;NTT(b, N, 1);NTT(i_c, N, 1);for(int i = 0; i < N; i++) b[i] = 1ll * b[i] * (2 - 1ll * b[i] * i_c[i] % mod + mod) % mod;NTT(b, N, -1);int t = qpow(N, mod - 2);for(int i = 0; i < N; i++) b[i] = 1ll * b[i] * t % mod;for(int i = deg; i < N; i++) b[i] = 0;}}PLE;void main(){scanf("%d", &n);for(int i = 0; i < n; i++)    scanf("%d", &a[i]);PLE.INV(a, b, n);for(int i = 0; i < n; i++)    printf("%d ",b[i]);}
}

多项式全集之四 多项式ln:

1、做法:

两边求导得

积分回去即可。

2、应用:

这个的组合意义是:无序组合。

表示一些东西,那么这些东西有序组合的方案数为

而无序组成的方案数为:

如果无序组合方案数好求,那么求

就能得到

例题

喜闻乐见的代码:

多项式

:
namespace PLE_ln{struct polyme {int li[SZ], wz[SZ];void NTT(int *a, int N, int op) {rop(i, 0, N) if(i < wz[i]) swap(a[i], a[wz[i]]);for(int l = 2; l <= N; l <<= 1) {int mid = l >> 1;int x, y, w, wn = qpow(g, (mod - 1) / l);if(op) wn = qpow(wn, mod - 2);for(int i = 0; i < N; i += l) {w = 1;for(int j = 0; j < mid; ++j) {x = a[i + j]; y = 1ll * w * a[i + j + mid] % mod;a[i + j] = (x + y) % mod;a[i + j + mid] = (x - y + mod) % mod;w = 1ll * w * wn % mod;}}}}void qd(int *a, int *b, int n) {rop(i, 0, n) b[i] = 1ll * a[i + 1] * (i + 1) % mod;}void jf(int *a, int *b, int n) {rop(i, 1, n) b[i] = 1ll * a[i - 1] * qpow(i, mod - 2) % mod;}void mult(int *a, int *b, int *c, int M) {int N = 1, len = 0;while(N < M) N <<= 1, len ++;rop(i, 0, N) wz[i] = (wz[i >> 1] >> 1) | ((i & 1) << (len - 1));NTT(a, N, 0); NTT(b, N, 0);rop(i, 0, N) c[i] = 1ll * a[i] * b[i] % mod;NTT(c, N, 1);int t = qpow(N, mod - 2);rop(i, 0, N) c[i] = 1ll * c[i] * t % mod;}void inv(int *a, int *b, int deg) {if(deg == 1) {b[0] = qpow(a[0], mod - 2) % mod; return;}inv(a, b, (deg + 1) >> 1);rop(i, 0, deg) li[i] = a[i];int N = 1, len = 0;while(N < deg + deg - 1) N <<= 1, len ++;rop(i, 0, N) wz[i] = (wz[i >> 1] >> 1) | ((i & 1) << (len - 1));rop(i, deg, N) li[i] = 0;NTT(li, N, 0); NTT(b, N, 0);rop(i, 0, N) b[i] = 1ll * b[i] * (2 - 1ll * li[i] * b[i] % mod + mod) % mod;NTT(b, N, 1);int t = qpow(N, mod - 2);for(int i = 0; i < N; i++) b[i] = 1ll * b[i] * t % mod;rop(i, deg, N) b[i] = 0;}}PLE;int a[SZ], da[SZ], ia[SZ], dla[SZ], la[SZ], n;void main() {scanf("%d", &n);rop(i, 0, n) scanf("%d", &a[i]);PLE.qd(a, da, n);PLE.inv(a, ia, n);PLE.mult(ia, da, dla, n + n - 1);PLE.jf(dla, la, n);rop(i, 0, n) printf("%d ", la[i]);}
}

与作者交流:https://ac.nowcoder.com/discuss/175409

更多算法和题解:https://ac.nowcoder.com/acm/contest/discuss

蝴蝶优化算法_算法|FFT基础及各种常数优化,5万字笔记:公式推导+代码模板...相关推荐

  1. 粒子群优化算法_每日论文19:粒子群优化算法综述

    每日论文 第十九篇 2020/07/27 摘要:粒子群优化 (PSO)算法是一种新兴的优化技术 ,其思想来源于人工生命和演化计算理论.PSO通过粒子追随自己找到的最好解和整个群的最好解来完成优化.该算 ...

  2. python实现五大基本算法_算法基础:五大排序算法Python实战教程

    排序是每个算法工程师和开发者都需要一些知识的技能. 不仅要通过编码实现,还要对编程本身有一般性的了解. 不同的排序算法是算法设计如何在程序复杂性,速度和效率方面具有如此强大影响的完美展示. 让我们来看 ...

  3. python dfs算法_算法工程师技术路线图

    前言 这是一份写给公司算法组同事们的技术路线图,其目的主要是为大家在技术路线的成长方面提供一些方向指引,配套一些自我考核项,可以带着实践进行学习,加深理解和掌握. 内容上有一定的通用性,所以也分享到知 ...

  4. python信息找人的算法_算法篇-python查找算法

    上一篇的递归算法中,了解到算法的复杂度.递归就是在函数中调用本身. 在汉诺塔游戏例子中,如果你需要移动的盘子很多时,程序运行就会消耗很长时间来计算结果.可以回顾下 ->算法篇-python递归算 ...

  5. 算法导论 算法_算法导论

    算法导论 算法 Algorithms are an integral part of the development world. Before starting coding of any soft ...

  6. mysql设计思想_这些Mysql基础设计思路以及优化思路我都给你总结好了

    原标题:这些Mysql基础设计思路以及优化思路我都给你总结好了 1.定长和不定长要区分开 2.不常用的列和常用的列分开存 3.增加冗余,反范式化 4.btree索引,就是用树形结构存储在磁盘上,其中操 ...

  7. 多重背包单调队列优化思路_动态规划入门——多重背包与单调优化

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第14篇文章,也是动态规划专题的第三篇. 在之前的文章当中,我们介绍了多重背包的二进制拆分的解法.在大多数情况下,这种 ...

  8. jitter 如何优化网络_网络推广如何做好网站SEO优化

    网络推广做好网站整站SEO优化的方式有很多,如何才能做好SEO优化? 网络推广如何做好网站SEO优化 一.定位网站关键词 SEO给一个网站刚开始做优化的时候,不是立马就设置关键词,而是先分析该网站主要 ...

  9. 算法组合 优化算法_算法交易简化了风险价值和投资组合优化

    算法组合 优化算法 Photo by Markus Spiske (left) and Jamie Street (right) on Unsplash Markus Spiske (左)和Jamie ...

最新文章

  1. 微软发布屏蔽Win10升级的官方办法
  2. 人工智能芯片借鉴大脑学习机制实现终身学习
  3. 【网络流24题】试题库问题
  4. 2.对于所有对象都通用的方法_EJ
  5. Firefox3与WEB客户端开发相关的新特性
  6. 删除无序单链表中值重复出现的节点
  7. created写法_在vue中created、mounted等方法使用小结
  8. Oracle 的一些语句
  9. flowable BPMN的组件汉化
  10. Android 调用系统相机拍照,生命周期重走OnCreate,导致无数据的解决办法
  11. 网站整体流程_企业建设网站流程解析-上海回声网络
  12. Serv-U组建个人FTP服务器, ——完全图解教程:FTP架设、端口映射、动态域名申请...
  13. linux打印jvm内存堆栈_jvm内存堆栈监控之jmap篇
  14. KANO 模型——卡诺模型
  15. SpringBoot 整合ActiveMQ
  16. 【 MATLAB 】mod 函数介绍
  17. 微信公众号网页授权域名证书验证位置
  18. 客户之前使用的其他财务软件,现在需要把其他软件的财务凭证导入到用友T3软件中使用,如何能快速实现。
  19. Ubuntu1804安装及基本配置
  20. 点餐系统的开发,php后台+微信小程序 实现完整的餐厅点餐系统。

热门文章

  1. 【Java基础】一篇文章读懂多线程
  2. linux 正在运行的程序不能拷贝_如何实现在Windows上运行Linux程序,附示例代码
  3. jfinal整合quartz实现定时任务的两种方式
  4. Vuex——使用namespace的store使用mapState获取state为undefined
  5. 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第三章——自编解析与答案
  6. 百度贴吧——因百度账号策略调整导致长时间未登录的账号(最后登录在2017年6月1日以前)网页端无法登陆、移动端异常解决方案
  7. Linux——查看硬件配置命令
  8. php下载的文件不是汉字,php实现支持中文的文件下载功能示例
  9. iis里面的mime没有php扩展,IIS - 无后缀(无扩展名)的MIME类型配置
  10. 【python网络编程】创建TCP/UDP服务器进行客户端/服务器间通信