数学在算法中的应用

数学

快速幂

定义:快速幂就是快速算底数的 n n n次幂。其时间复杂度为 O ( l o g ₂ N ) O(log₂N) O(logN), 与朴素的 O ( N ) O(N) O(N)相比效率有了极大的提高。

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

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

那么知道每一位又有什么用呢,下面的公式就是快速幂的原理
2 13 = 2 1 ∗ 2 4 ∗ 2 8 2^{13}=2^{1}*2^{4}*2^{8} 213=212428
比如说求 a a a b b 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;
}

调和级数

定义 调和级数是由调和数列各元素相加所得的和。

公式 S n = 1 + 1 2 + 1 3 + 1 4 + 1 5 + . . . + 1 n = ∑ k = 1 n 1 k 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} Sn=1+21+31+41+51+...+n1=k=1nk1
欧拉推导过求调和级数有限多项式和的表达式为 ∑ k = 1 n 1 k = l n ( n + 1 ) + γ ( γ ≈ 0.5772156649 ) \sum\limits_{k=1}^{n}\frac{1}{k}=ln(n+1)+\gamma \quad (\gamma\approx 0.57721 56649) k=1nk1=ln(n+1)+γ(γ0.5772156649)

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

组合数学

数论

卡特兰数

定义:卡塔兰数是组合数学中一个常在各种计数问题中出现的数列。

卡特兰数012345678
112514421324291430

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

  • 排队买票问题
    2 n 2n 2n个人排成一行进入剧场。入场费 5 元。其中只有 个人有一张 5 元钞票,另外 人只有 10 元钞票,剧院无其它钞票,问有多少中方法使得只要有 10 元的人买票,售票处就有 5 元的钞票找零?
  • 上班问题
    一位大城市的律师在她住所以北 n n n个街区和以东 n n n个街区处工作。每天她走 2 n 2n 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;
}
安装Docker安装插件,可以按照以下步骤进行操作: 1. 首先,安装Docker。可以按照官方文档提供的步骤进行安装,或者使用适合您操作系统的包管理器进行安装。 2. 安装Docker Compose插件。可以使用以下方法安装: 2.1 下载指定版本的docker-compose文件: curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 2.2 赋予docker-compose文件执行权限: chmod +x /usr/local/bin/docker-compose 2.3 验证安装是否成功: docker-compose --version 3. 在安装插件之前,可以测试端口是否已被占用,以避免编排过程中出错。可以使用以下命令安装netstat并查看端口号是否被占用: yum -y install net-tools netstat -npl | grep 3306 现在,您已经安装Docker安装Docker Compose插件,可以继续进行其他操作,例如上传docker-compose.yml文件到服务器,并在服务器上安装MySQL容器。可以参考Docker的官方文档或其他资源来了解如何使用DockerDocker Compose进行容器的安装和配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Docker安装docker-compose插件](https://blog.youkuaiyun.com/qq_50661854/article/details/124453329)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Docker安装MySQL docker安装mysql 完整详细教程](https://blog.youkuaiyun.com/qq_40739917/article/details/130891879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值