Catalan数应用

Catalan数应用

  • Catalan数应用
    • 原理
    • 卡特兰数经典应用
      • 括号化
      • 买票找零
      • 组合数与阶乘计算

卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。
其前几项为 : 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, … Catalan数是许多计数问题的最终形式。

原理

  • 令h(0)=1,h(1)=1,catalan数满足递推式:
    h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0)(n>=2)

  • 另类递推公式:

    1. h(n)=h(n1)(4n2)/(n+1)
    2. x=(2nn)n+1(n=0,1,2,)
    3. h(n)=(2nn)(2nn1)(n=0,1,2,)

公式中(nm)=n!(nm)!

卡特兰数经典应用

括号化

矩阵链乘: f(n)=a1×a2×a3××an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?

思路:可以这样考虑,首先通过括号化,将公式分成两个部分,然后分别对两个部分进行括号化。比如分成(a1)×(a2×a3××an),然后再对(a1)(a2×a3××an)分别括号化;又如分成(a1×a2)×(a3××an),然后再对(a1×a2)(a3××an)括号化;以此类推,得公式

f(n)=f(1)f(n1)+f(2)f(n2)+f(3)f(n3)++f(n1)f(1)

f(1) = 1, f(2) = 1, f(3) = 2, f(4) = 5,结合递归式,不难发现f(n)=h(n-1)。

买票找零

原题描述如下:

2n个人排队买票,其中n个人持50元,n个人持100元。每张票50元,且一人只买一张票。初始时售票处没有零钱找零。请问这2n个人一共有多少种排队顺序,不至于使售票处找不开钱?

思路:队伍的序号标为0,1,…,2n-1,并把50元看作左括号,100元看作右括号,合法序列即括号能完成配对的序列。对于一个合法的序列,第0个一定是左括号,它必然与某个右括号配对,记其位置为k。那么从1到k-1、k+1到2n-1也分别是两个合法序列。那么,k必然是奇数(1到k-1一共有偶数个),设k=2i+1。那么剩余括号的合法序列数为f(2i)*f(2n-2i-2)个。取i=0到n-1累加即可。

f(2n)=i=0n1f(2i)f(2n2i2)(n1)

f(0)=0,(00)=0,即可得

f(2n)=(2nn)n+1(n1)

公式推导如下,出自从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指

构造生成函数:

g(x)=h0x2+h2x4++h2n2x2n+h2nx2n+2+

其中 h2n=f(2n)=n1i=0f(2i)f(2n2i2)(n1)

生成函数平方:

[g(x)]2==h0x2+h2x4++h2n2x2n+h2nx2n+2+h20x4+(h0h2+h2h0)x6++(h0h2n2+h2h2n4++h2n2h0)x2n+2+

则:

[g(x)]2g(x)=h20x4h2x4h0x2

对于题目,假设h0=f(0)=0,则根据递推公式后续项全为0,不合题意,那么h0=f(0)=1,可以推出h2=f(2)=1,带入公式,则有:

[g(x)]2g(x)+x2=0

解得g(x)=1±14x22
根据生成函数的各项系数为非负,舍去其一,在根据

(1+z)1/2=1+n=1(1)n1n×22n1(2n2n1)zn

可以得到

g(x)=n=11n(2n2n1)x2n

h2n=1n+1(2nn)

组合数与阶乘计算

#!/usr/bin/env python
# -*- coding: utf-8 -*-import operator'''factorial function:阶乘函数;也可用math.factorial'''
def factorial(n):return reduce(operator.mul, range(1, int(n+1)));'''combinational calculation:组合计算'''
def comb(n, m):return reduce(operator.mul, range(n-m+1, n+1)) / factorial(m)'''calculation on the arrangement:排列组合计算'''
def arr(n, m):return factorial(n) / factorial(n-m)if __name__ == "__main__":print factorial(10)print comb(6,3)print arr(10,7)

参考:

  • http://www.cnblogs.com/wuyuegb2312/p/3016878.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

统计整数n的二进制表示中1的个数

(1)逐位判断(位运算)int counter_ones(unsigned n){int counter 0;While (n) {counter n&1;n >>1;}return counter;}(2)一个整型不为0,那么二进制表示时,至少包含一位1。如果整数减去1,那么最右边的1变成0…

百度2015校园招聘软件开发笔试题及答案

简单题(本题共30分) 请简述Tcp-ip的3次握手以及4次挥手过程?并解释为何关闭连接需要4次挥手(10分) 详细答案参见TCP/IP协议三次握手与四次握手流程解析 TCP三次握手、四次挥手过程如下: 通常情况下,一个正常的TCP连接&#xf…

python常见数据结构

Python中常见的数据结构可以统称为容器(container)。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。 一、序列(列表、元组和字符串) 序列…

理解‘*‘,‘*args‘,‘**‘,‘**kwargs‘

原文Understanding ‘*’, ‘*args’,’**‘and’**kwargs’ 刚开始学习python的时候,对有关args,kwargs,*和**的使用感到很困惑。相信对此感到疑惑的人也有很多。我打算通过这个帖子来排解这个疑惑(希望能减少疑惑)。 让我们通过以下5步来理解: 通过…

MongoDb随笔,PyMongo简单使用

安装MongoDb 【更新2021-07-06】 https://www.mongodb.com/try/download/community 下载对应系统的软件版本(CentOS7.9 mongod 4.4.6)rpm -ivh mongodb-org-server-4.4.6-1.el7.x86_64.rpm安装服务systemctl start mongod启动服务rpm -ivh mongodb-org…

python中classmethod与staticmethod的差异及应用

类中三种函数的应用 #!/usr/bin/env python # -*- coding: utf-8 -*-class TClassStatic(object):def __init__(self, data):self.data datadef printself(*arg):# for item in arg:# print item.dataprint("printself: ", arg)staticmethoddef smethod(*arg):prin…

python3元类简介(metaclass)

在Python中可以用内置函数type查看对象的类型,isinstance查看某个对象是某个类实例,通过type可以实现动态类,以及通过metaclass实现动态类 type()与isinstance()判断对象类型 Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v…

linux ps 命令使用

Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。 linux上进程有5种状态 ps命令使…

UML序列图总结

序列图主要用于展示对象之间交互的顺序。 序列图将交互关系表示为一个二维图。纵向是时间轴,时间沿竖线向下延伸。横向轴代表了在协作中各独立对象的类元角色。类元角色用生命线表示。当对象存在时,角色用一条虚线表示,当对象的过程处于激活…

UML用例图总结

用例图主要用来描述 用户、需求、系统功能单元 之间的关系。它展示了一个外部用户能够观察到的系统功能模型图。 【用途】:帮助开发团队以一种可视化的方式理解系统的功能需求。 用例图所包含的元素如下: 1. 参与者(Actor) 表示与您的应用程序或…

动态规划--换零钱

题目描述 想兑换100元钱&#xff0c;有1,2,5,10四种钱&#xff0c;问总共有多少兑换方法 递归解法 #include<iostream> using namespace std; const int N 100; int dimes[] {1, 2, 5, 10}; int arr[N1] {1}; int coinExchangeRecursion(int n, int m) //递归…

学生表 课程表 成绩表 教师表常用SQL语句

学生表 课程表 成绩表 教师表 50个常用sql语句 建表 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 ---- If database exists the same name datatable deletes it. IF EXISTS(SELECT TABLE_NAME FRO…

Linux网络编程常见面试题

概述 TCP和UDP是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议。 TCP&#xff1a;传输控制协议&#xff0c;一种面向连接的协议&#xff0c;给用户进程提供可靠的全双工的字节流&#xff0c;TCP套接口是字节流套接口(stream socket)的一种。UDP&#xff1a;用户…

sizeof与offsetof有关的结构体详解

sizeof与offsetof在程序中经常遇到&#xff0c;但在面试中其应用使得许多小伙伴吃闭门羹&#xff0c;被面试官问得哑口无言。接下来对两者的应用做详细介绍。 关于sizeof 定义 sizeof乃C/C中的一个操作符(operator), 简单的说其作用就是返回一个对象或者类型所占的内存字节数…

linux线程间同步(1)读写锁

读写锁比mutex有更高的适用性&#xff0c;可以多个线程同时占用读模式的读写锁&#xff0c;但是只能一个线程占用写模式的读写锁。 1. 当读写锁是写加锁状态时&#xff0c;在这个锁被解锁之前&#xff0c;所有试图对这个锁加锁的线程都会被阻塞&#xff1b; 2. 当读写锁在读加…

linux线程间同步(1)互斥锁与条件变量

线程的最大特点是资源的共享性&#xff0c;但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步&#xff0c;最常用的是互斥锁、条件变量和信号量以及读写锁。 互斥锁(mutex) 互斥锁&#xff0c;是一种信号量&#xff0c;常用来防止两个进程或线…

Linux下压缩包生成与解压命令以及进度

不同后缀压缩包的打包与加压命令 .tar 解包&#xff1a;tar xvf FileName.tar打包&#xff1a;tar cvf FileName.tar DirName .gz 解压1&#xff1a;gunzip FileName.gz解压2&#xff1a;gzip -d FileName.gz压缩&#xff1a;gzip FileName .tar.gz 和 .tgz 解压&#xff1a;…

经典面试题

谷歌面试题&#xff1a;1024! 末尾有多少个0&#xff1f; 末尾0的个数取决于乘法中因子2和5的个数。显然乘法中因子2的个数大于5的个数&#xff0c;所以我们只需统计因子5的个数。 是5的倍数的数有&#xff1a; 1024 / 5 204个;对于25,50这些数据统计一次,但实际的是包含两个…

共享内存:mmap函数实现

内存映射的应用: 以页面为单位,将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能;将特殊文件进行匿名内存映射&#xff0c;可以为关联进程提供共享内存空间;为无关联的进程提供共享内存空间&#xff0c;一般也是将…

MSYS2开发环境搭建

MSYS2开发环境搭建 软件安装 下载msys2-x86_64软件包 https://www.msys2.org/&#xff0c;双击安装到某根目录下&#xff0c;比如D:\msys64。 pacman是MSYS2自带的软件管理工具&#xff1a; 可通过修改msys64\etc\pacman.d下的三个文件修改软件源&#xff0c;可供选择的源有…