数学在算法中的应用

依然范特西╮ 提交于 2020-02-12 11:49:47

数学

快速幂

定义
快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
原理
比如说计算2的13次方,常见的方法是连续乘2 13次,时间复杂度为O(n);
但是快速幂算法可以压缩到O(log₂N)。
具体算法是这样的 将13化成二进制数 即1101(8421就是这么皮)我们可以一眼看出来,但计算机就不行了,得帮它算。转过来一想,不就是要知道二进制每一位的值吗,话不多说看代码(talk is cheaper,show me your code)

int b=13;
while(b>0){
  //判断b的最后一位
  if(b&1) {
  }
  b=b>>1;//右移一位
}

那么知道每一位又有什么用呢,下面的公式就是快速幂的原理
213=212428 2^{13}=2^{1}*2^{4}*2^{8}
比如说求a的b次方

//快速幂算法,代码虽短,技术含量不低哦
int quickpower(int a,int b){
  int ans=1,base=a;
  while(b>0){
  if(b&1) ans=ans*base;
  base=base*base;//基数自乘
  b=b>>1;/右移一位
  }
  return 0;
}

调和级数

公式Sn=1+12+13+14+15+...+1n=k=1n1k Sn=1+\frac{1}{2}+\frac{1}{3}+\frac{1}{4}+\frac{1}{5}+...+\frac{1}{n}=\sum\limits_{k=1}^n\frac{1}{k}
欧拉推导过求调和级数有限多项式和的表达式为k=1n1k=ln(n+1)+γ(γ0.5772156649) \sum\limits_{k=1}^{n}\frac{1}{k}=ln(n+1)+\gamma \quad (\gamma\approx 0.57721 56649)

已知
Sn=1+12+13+14+15+...+1n Sn=1+\frac{1}{2}+\frac{1}{3}+\frac{1}{4}+\frac{1}{5}+...+\frac{1}{n}
显然对于任意一个整数 k,当n足够大的时候Sn>k。
Sn>kln(n+1)+γ>kn>ekγ1  n=ekγ+0.5   Sn>k\quad \Rightarrow \,ln(n+1)+\gamma\gt k \Rightarrow \,n>e^{k-\gamma}-1 \;所以n=e^{k-\gamma}+0.5 \;(四舍五入)

组合数学

数论

卡特兰数

卡特兰数 0 1 2 3 4 5 6 7 8
1 1 2 5 14 42 132 429 1430

递推式
H(n)=H(n1)(4n2)n+1  (n2,nN+) H(n)=\frac{H(n-1)*(4n-2)}{n+1} \;(n\ge2,n\in N^+)
Catalan 数的常见公式:
H(n)=(2nn)n+1 H(n)= \frac{ \tbinom{2n}{n}}{n+1}
H(n)=(2nn)(2nn1) H(n)=\tbinom{2n}{n}-\tbinom{2n}{n-1}
常见问题

  • 排队买票问题
    有 2n个人排成一行进入剧场。入场费 5 元。其中只有 个人有一张 5 元钞票,另外 人只有 10 元钞票,剧院无其它钞票,问有多少中方法使得只要有 10 元的人买票,售票处就有 5 元的钞票找零?
  • 上班问题
    一位大城市的律师在她住所以北 n个街区和以东 n个街区处工作。每天她走 2n个街区去上班。如果他从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
  • 出栈序列问题
    一个栈(无穷大)的进栈序列为 有多少个不同的出栈序列?

洛谷 P1044 栈

#include <iostream>
using namespace std;
int n;
long long f[25];
int main() {
  f[0] = 1;
  cin >> n;
  for (int i = 1; i <= n; i++) 
  f[i] = f[i - 1] * (4 * i - 2) / (i + 1);//卡特兰公式
  
  cout << f[n] << endl;
  return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!