UTF8gbsn
本讲其实主要是在讲数值部分.所以内容偏理论也比较少.
卡塔兰数(Catalan Numbers)
关于这个Catalan numbers的直接定义我们先给出来.
然后再来看看它在实际生活中的一些例子.
C 0 = 1 C n + 1 = ∑ k = 0 n C k C n − k , n ⩾ 0 \left. \begin{aligned} C_0&=1\\ C_{n+1}&=\sum_{k=0}^{n}C_kC_{n-k}, n\geqslant 0 \end{aligned} \right. C0Cn+1=1=k=0∑nCkCn−k,n⩾0
这个数列的枚举如下.
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900,
2674440, 9694845, 35357670, 129644790, 477638700, 1767263190,
6564120420, 24466267020, 91482563640, 343059613650, 1289904147324,
4861946401452, 18367353072152, 69533550916004, 263747951750360,
1002242216651368
我们来看几个例子.
-
出栈次序问题:一个栈(无穷大)的进栈序列为1,2,3,…n,有多少个不同的出栈序列?
-
找零钱(找一半):
有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零? -
三角网格 :
形如这样的直角三角形网格,从左上角开始,只能向右走和向下走,问总共有多少种走法? -
括号排列: 矩阵连乘:
P = a 0 ⋅ a 1 ⋅ a 2 ⋯ a n P=a_0\cdot a_1\cdot a_2\cdots a_n P=a0⋅a1⋅a2⋯an,共有(n+1)项,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?或者说:有n对括号,可以并列或嵌套排列,共有多少种情况? -
球盒问题:
球分两种颜色,黑色和白色分别各有n只,盒子数量和球的个数相同,每个盒子里面只能放一只球,并且必须满足如下限制,即每一个白球必须和一只黑球配对(白球在黑球前,允许嵌套)。例.用0表示白猫,1表示黑猫,则:
0011,010101,001011合法。
1100,101010,010101不合法。
-
最适合理解的模型:
n个0和n个1组成一个2n位的2进制数,要求从左到右扫描时,1的累计数始终都小于等于0的累计数,求满足条件的数有多少? -
类似题目
-
(1).将多边行划分为三角形问题。将一个凸多边形区域分成三角形区域的方法数?
-
(2).有N个节点的二叉树共有多少种情形?
-
(3).一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果他从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
-
(4).在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
-
上面的例子来自于百度百科.
牛顿法
牛顿法是一个求根的方法. 我们先来看看迭代公式.
x i + 1 = x i − f ( x i ) f ′ ( x i ) x_{i+1}=x_{i}-\frac{f\left(x_{i}\right)}{f^{\prime}\left(x_{i}\right)} xi+1=xi−f′(xi)f(xi)
乘法的复杂度
朴素的两个n位乘法的复杂度为 θ ( n 2 ) \theta(n^2) θ(n2), 即便采用下面的方法.
x = x 1 ⋅ r n / 2 + x 0 x 1 = high half y = y 1 ⋅ r n / 2 + y 0 x 0 = low half 0 ≤ x 0 , x 1 < r n / 2 0 ≤ y 0 , y 1 < r n / 2 \begin{aligned} x &=x_{1} \cdot r^{n / 2}+x_{0} \quad x_{1}=\text { high half } \\ y &=y_{1} \cdot r^{n / 2}+y_{0} \quad x_{0}=\text { low half } \\ 0 & \leq x_{0}, x_{1}<r^{n / 2} \\ 0 & \leq y_{0}, y_{1}<r^{n / 2} \end{aligned} xy00=x1⋅rn/2+x0x1= high half =y1⋅rn/2+y0x0= low half ≤x0,x1<rn/2≤y0,y1<rn/2
z = x ⋅ y = x 1 y 1 ⋅ r n + ( x 0 ⋅ y 1 + x 1 ⋅ y 0 ) r n / 2 + x 0 ⋅ y 0 z=x \cdot y=x_{1} y_{1} \cdot r^{n}+\left(x_{0} \cdot y_{1}+x_{1} \cdot y_{0}\right) r^{n / 2}+x_{0} \cdot y_{0} z=x⋅y=x1y1⋅rn+(x0⋅y1+x1⋅y0)rn/2+x0⋅y0
时间复杂度也是 θ ( n 2 ) \theta(n^2) θ(n2)
更快的乘法
Karatsuba’s Method:
z 0 = x 0 ⋅ y 0 z 2 = x 1 ⋅ y 1 z 1 = ( x 0 + x 1 ) ⋅ ( y 0 + y 1 ) − z 0 − z 2 = x 0 y 1 + x 1 y 0 z = z 2 ⋅ r n + z 1 ⋅ r n / 2 + z 0 \begin{aligned} z_{0} &=x_{0} \cdot y_{0} \\ z_{2} &=x_{1} \cdot y_{1} \\ z_{1} &=\left(x_{0}+x_{1}\right) \cdot\left(y_{0}+y_{1}\right)-z_{0}-z_{2} \\ &=x_{0} y_{1}+x_{1} y_{0} \\ z &=z_{2} \cdot r^{n}+z_{1} \cdot r^{n / 2}+z_{0} \end{aligned} z0z2z1z=x0⋅y0=x1⋅y1=(x0+x1)⋅(y0+y1)−z0−z2=x0y1+x1y0=z2⋅rn+z1⋅rn/2+z0
这个时间复杂度为:
T ( n ) = 3 T ( n / 2 ) + θ ( n ) = θ ( n l o g 2 3 ) = θ ( n 1.5849625 ⋯ ) T(n)=3T(n/2)+\theta(n)=\theta(n^{log_2 3})=\theta(n^{1.5849625\cdots}) T(n)=3T(n/2)+θ(n)=θ(nlog23)=θ(n1.5849625⋯)
还有更快的算法么? 请自行搜索 Integer multiplication in time O ( n l o g n ) O(n log n) O(nlogn)