当前位置: 首页 > news >正文

漯河市源汇区网站建设百度一下搜索引擎大全

漯河市源汇区网站建设,百度一下搜索引擎大全,asp net做网站视频,西安关键词排名软件文章目录1、简介1.1 何为卡特兰数1.2 卡特兰数的通项公式2、应用2.1 题目1:括号合法题目描述思路分析2.2 题目2:进出栈的方式2.2.1 题目描述2.2.2 思路分析2.3 题目3:合法的序列2.3.1 题目描述2.3.2 思路分析2.3.3 代码实现2.4 题目4&#xf…

文章目录

  • 1、简介
    • 1.1 何为卡特兰数
    • 1.2 卡特兰数的通项公式
  • 2、应用
    • 2.1 题目1:括号合法
      • 题目描述
      • 思路分析
    • 2.2 题目2:进出栈的方式
      • 2.2.1 题目描述
      • 2.2.2 思路分析
    • 2.3 题目3:合法的序列
      • 2.3.1 题目描述
      • 2.3.2 思路分析
      • 2.3.3 代码实现
    • 2.4 题目4:不同二叉树的数量
      • 2.4.1 题目描述
      • 2.4.2 思路分析
      • 2.4.3 代码实现
  • 3、总结

1、简介

1.1 何为卡特兰数

卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学 中一个常在各种计数问题中出现的数列。

前几项为: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, …

1.2 卡特兰数的通项公式

k(0)=1,k(1)=1k(0) = 1, k(1) = 1k(0)=1,k(1)=1 时,如果接下来的项满足:

k(n)=k(0)∗k(n−1)+k(1)∗k(n−2)+...+k(n−2)∗k(1)+k(n−1)∗k(0)k(n) = k(0) * k(n - 1) + k(1) * k(n - 2) + ... + k(n - 2) * k(1) + k(n - 1) * k(0)k(n)=k(0)k(n1)+k(1)k(n2)+...+k(n2)k(1)+k(n1)k(0)

或者

k(n)=C2nn−C2nn−1k(n) = C_{2n}^n- C_{2n}^{n-1}k(n)=C2nnC2nn1

或者

k(n)=C2nn/(n+1)k(n) = C_{2n}^n / (n + 1)k(n)=C2nn/(n+1)

就说这个表达式,满足卡特兰数,常用的是范式1和2,3几乎不会使用到

2、应用

2.1 题目1:括号合法

题目描述

给定 NNN 个左括号,NNN 个右括号,它们自由组合,必须全部使用,能得到多少个合法的组合?

思路分析

“合法”的定义是对于自由排列的组合,只要保证任意的前缀,右括号数量 ≤\le 左括号数量,那么它最终一定是合法的。原理就是左括号比右括号多的时候,一旦出现右括号就能将多的左括号配对,最终一定会全部配对成功。反之则不行。

先讨论一个数学思想:如何确定两个集合相等

【集合A 和 集合B 可以是完全不相干的两个可数集合,只要能找到一个映射fff,使得A集合中的一个对应B集合中的一个,又能找到一个和 fff 毫不相干的映射 ggg 使得 B集合中的一个对应 A集合中的一个,如果存在这样一组映射,那么A集合数量和B集合数量一定相等。】

借此,来讨论括号组合的合法问题。合法的组合数量不好算,那就可以先选出不合法的组合数量,然后使用总的排列方法 减去 不合法的,就是合法的。

总的排列方法数为 C2nnC_{2n}^nC2nn,意思是一共 2n2n2n 个位置,选择其中的 nnn 个放左括号,剩下的 nnn 个位置放右括号。

而不合法的特征一定存在一个最初的前缀:右括号数量 = 左括号数量 + 1,如 ())((),最初前缀就是 ())。那么在该前缀后的就是 右括号数量 + 1 = 左括号数量 (因为左右括号的数量相等)。以这个最初前缀为分界线,后面的所有括号进行反转,即右括号变成左括号,左括号变成右括号,就变成了())))(,那么分界线后的左括号数量 + 1 = 右括号数量。如此一来,整体的 右括号数量 = 左括号数量 + 2。

定义两个集合,A集合放所有不合法的情况,B集合是 n+1n + 1n+1 个右括号,n−1n-1n1个左括号 组合得到的所有情况 (该集合的来源不深究),也就是说通过上面的括号反转,A集合中任意一个不合法的元素通过该映射都能变出一个B集合的某一个元素;而B集合中的每个元素都能变成A集合其中的一个,如))))((,最初的不合法前缀为),以该前缀为分界线后面的所有括号反转。最终得到)((())

所以 “nnn 个左括号 和 nnn 个右括号组合不合法的数量” = “n+1n+1n+1个右括号 和 n−1n-1n1个左括号组合的所有数量”,即 C2nn+1C_{2n}^{n+1}C2nn+1

所以,nnn 个左括号和 nnn 个右括号组合的合法数量 = C2nn−C2nn+1C_{2n}^{n} - C_{2n}^{n+1}C2nnC2nn+1,而 C2nn+1=C2nn−1C_{2n}^{n+1} = C_{2n}^{n-1}C2nn+1=C2nn1,因此合法的组合数量也可以是 C2nn−C2nn−1C_{2n}^n - C_{2n}^{n-1}C2nnC2nn1

也就是说,括号类型的违规可以转换为卡特兰数进行计算,因为C2nn−C2nn−1C_{2n}^n - C_{2n}^{n-1}C2nnC2nn1 是卡特兰数的通项公式之一。

2.2 题目2:进出栈的方式

2.2.1 题目描述

nnn 个数字要进出栈,一共有多少种进出栈的方式?

2.2.2 思路分析

例如,给定数字[1, 2],进出栈的方式:

合法的情况:

1. 1进(↓),1出(↑),2进(↓),2出(↑)
2. 1进(↓),2进(↓),2出(↑),1出(↑)
只用记录箭头

不合法的情况:

1. ↑ ↑ ↓ ↓ (没有数字进栈是无法出栈的)

考察箭头组合的合法数量,这其实就是括号问题。进栈是左括号,出栈是右括号。合法的条件就是在任何时候,右括号数量不能大于左括号数量,也就是任意时刻出栈次数 ≤\le 进栈次数就是合法的进出栈方式,就是卡特兰数。

再举个例子:某个公司的股票有上涨和下跌,问有多少种交易方式可以使得股票不会跌到X轴以下?
在这里插入图片描述
这也是一个卡特兰数问题,往上就是左括号,往下就是右括号,就是在问左右括号合理的结合方式。

2.3 题目3:合法的序列

2.3.1 题目描述

假设给你 NNN 个 0,和 NNN 个 1,你必须用全部数字拼序列。

返回有多少个序列满足:任何前缀串,1的数量都不少于0的数量

2.3.2 思路分析

这个就是 “括号合法” 模型问题,1是左括号,0是右括号,任意时刻满足左括号数量 ≥\ge 右括号数量。

直接使用卡特兰数的通项公式解决即可。

2.3.3 代码实现

import java.util.LinkedList;public class 10Ways {//方法1:暴力递归public static long ways1(int N) {int zero = N;int one = N;LinkedList<Integer> path = new LinkedList<>();LinkedList<LinkedList<Integer>> ans = new LinkedList<>();process(zero, one, path, ans);long count = 0;for (LinkedList<Integer> cur : ans) {int status = 0;for (Integer num : cur) {if (num == 0) {status++;} else {status--;}if (status < 0) {break;}}if (status == 0) {count++;}}return count;}public static void process(int zero, int one, LinkedList<Integer> path, LinkedList<LinkedList<Integer>> ans) {if (zero == 0 && one == 0) {LinkedList<Integer> cur = new LinkedList<>();for (Integer num : path) {cur.add(num);}ans.add(cur);} else {if (zero == 0) {path.addLast(1);process(zero, one - 1, path, ans);path.removeLast();} else if (one == 0) {path.addLast(0);process(zero - 1, one, path, ans);path.removeLast();} else {path.addLast(1);process(zero, one - 1, path, ans);path.removeLast();path.addLast(0);process(zero - 1, one, path, ans);path.removeLast();}}}//方法2:卡特兰数的通项公式解决public static long ways2(int N) {if (N < 0) {return 0;}if (N < 2) {return 1;}long a = 1;long b = 1;long limit = N << 1;for (long i = 1; i <= limit; i++) {if (i <= N) {a *= i;} else {b *= i;}}return (b / a) / (N + 1);}public static void main(String[] args) {System.out.println("test begin");for (int i = 0; i < 10; i++) {long ans1 = ways1(i);long ans2 = ways2(i);if (ans1 != ans2) {System.out.println("Oops!");}}System.out.println("test finish");}
}

2.4 题目4:不同二叉树的数量

2.4.1 题目描述

NNN 个二叉树节点,每个节点彼此之间无任何差别。返回由 NNN 个二叉树节点,组成的不同结构数量是多少?

2.4.2 思路分析

如果 0 个节点,只能组成空树,1种;
如果 1 个节点,只能组成1个节点的树,1种;
如果 2 个节点,只有2种结构。

n 个节点组成二叉树的情况:

1)第 1 种划分:头结点1个,左子树0个,右子树 n−1n-1n1
在这里插入图片描述
在这种划分下,不同结构的数量为:[0个节点组成的方法数] ×\times× [n−1n-1n1个节点组成的方法数]

2)第 2 种划分:头结点左边1个节点,右边 n−2n-2n2 个节点
在这里插入图片描述
在这种划分下,不同结构的数量为:[1个节点组成的方法数] ×\times× [n−2n-2n2个节点组成的方法数]

这个规律就是卡特兰数的第1个通项公式,所以这就是卡特兰数。 那么直接用卡特兰数的第2个通项公式计算即可,因为卡特兰数的三个通项公式是等效的。

2.4.3 代码实现

public class DifferentBTNum {//	k(0) = 1, k(1) = 1
//
//	k(n) = k(0) * k(n - 1) + k(1) * k(n - 2) + ... + k(n - 2) * k(1) + k(n - 1) * k(0)
//	或者
//	k(n) = c(2n, n) / (n + 1)
//	或者
//	k(n) = c(2n, n) - c(2n, n-1)//方法1public static long num1(int N) {if (N < 0) {return 0;}if (N < 2) {return 1;}long[] dp = new long[N + 1];dp[0] = 1;dp[1] = 1;for (int i = 2; i <= N; i++) {for (int leftSize = 0; leftSize < i; leftSize++) {dp[i] += dp[leftSize] * dp[i - 1 - leftSize];}}return dp[N];}//方法2:卡特兰数public static long num2(int N) {if (N < 0) {return 0;}if (N < 2) {return 1;}long a = 1;long b = 1;for (int i = 1, j = N + 1; i <= N; i++, j++) {a *= i;b *= j;long gcd = gcd(a, b);a /= gcd;b /= gcd;}return (b / a) / (N + 1);}public static long gcd(long m, long n) {return n == 0 ? m : gcd(n, m % n);}public static void main(String[] args) {System.out.println("test begin");for (int i = 0; i < 15; i++) {long ans1 = num1(i);long ans2 = num2(i);if (ans1 != ans2) {System.out.println("Oops!");}}System.out.println("test finish");}
}

3、总结

  1. 要对卡特兰数的通项公式1和公式2烂熟于心;
  2. 对“括号合法”模型(左右括号数量相等的合法性问题)要有敏感度;
  3. 加强对卡特兰数通项公式1的敏感度的训练,如题目4,符合公式1等同于公式2,而通常可能是写出了暴力递归才会发现公式1,就要求对暴力解法有了解。

补充:

数学结论:所有整数和所有偶数数量相等。因为任何整数乘以2后等于某个偶数,而任意偶数除以2后等于某个整数,二者建立了一一映射关系,所以整数数量和偶数数量就是一样多的。在数学上,它叫作“等势”。

5米的线和10米的线上的点数量一样多。在两条线之外找某一个定点,5米线上找任意一个点和定点连线能对应到10米中的一个点,10米的任意一个点和定点连线能对应到5米中的一个点,所以5米的线和10米的线点一样多。
在这里插入图片描述
点是无长度的,无长度的东西有可能有无限个点。更多可以查看希尔伯特旅馆悖论。

总而言之,牵扯到一个非常重要的思想,两个可数集合A和B,能互相建立一种映射关系,那它们的数量就是一样多的。


文章转载自:
http://ichneumon.rdfq.cn
http://bimolecular.rdfq.cn
http://safecracking.rdfq.cn
http://duskily.rdfq.cn
http://electrolyse.rdfq.cn
http://strangeness.rdfq.cn
http://exegetics.rdfq.cn
http://capriole.rdfq.cn
http://transience.rdfq.cn
http://glassworm.rdfq.cn
http://unrewarded.rdfq.cn
http://bandobast.rdfq.cn
http://mapi.rdfq.cn
http://lipoma.rdfq.cn
http://hypercritical.rdfq.cn
http://dame.rdfq.cn
http://liquidise.rdfq.cn
http://airway.rdfq.cn
http://transvaal.rdfq.cn
http://unitard.rdfq.cn
http://abiogeny.rdfq.cn
http://margarine.rdfq.cn
http://exclusive.rdfq.cn
http://ldc.rdfq.cn
http://lection.rdfq.cn
http://troubleproof.rdfq.cn
http://oxgall.rdfq.cn
http://montmorillonoid.rdfq.cn
http://peloponnesian.rdfq.cn
http://unformed.rdfq.cn
http://mastoidal.rdfq.cn
http://antihemophilic.rdfq.cn
http://npn.rdfq.cn
http://coproantibody.rdfq.cn
http://ishtar.rdfq.cn
http://forsooth.rdfq.cn
http://grille.rdfq.cn
http://haciendado.rdfq.cn
http://overdominance.rdfq.cn
http://dreamland.rdfq.cn
http://ophiolatry.rdfq.cn
http://vocalism.rdfq.cn
http://winnock.rdfq.cn
http://shinar.rdfq.cn
http://engrail.rdfq.cn
http://sargassum.rdfq.cn
http://reapply.rdfq.cn
http://azania.rdfq.cn
http://adduceable.rdfq.cn
http://mitral.rdfq.cn
http://rejoneador.rdfq.cn
http://upstairs.rdfq.cn
http://mudslide.rdfq.cn
http://cucaracha.rdfq.cn
http://mohammedanism.rdfq.cn
http://ozonize.rdfq.cn
http://doornail.rdfq.cn
http://alogia.rdfq.cn
http://speckless.rdfq.cn
http://hebrewwise.rdfq.cn
http://numerous.rdfq.cn
http://cimeliarch.rdfq.cn
http://unction.rdfq.cn
http://likelihood.rdfq.cn
http://poriferan.rdfq.cn
http://teem.rdfq.cn
http://foretopgallant.rdfq.cn
http://sycosis.rdfq.cn
http://chemopsychiatry.rdfq.cn
http://uncalculating.rdfq.cn
http://hummum.rdfq.cn
http://zincographer.rdfq.cn
http://calif.rdfq.cn
http://cadaverous.rdfq.cn
http://dregs.rdfq.cn
http://goodwill.rdfq.cn
http://rondel.rdfq.cn
http://engarland.rdfq.cn
http://tiling.rdfq.cn
http://syntactic.rdfq.cn
http://circumnutation.rdfq.cn
http://coowner.rdfq.cn
http://shirtwaist.rdfq.cn
http://heritance.rdfq.cn
http://inward.rdfq.cn
http://enteritidis.rdfq.cn
http://objectively.rdfq.cn
http://millennial.rdfq.cn
http://oversexed.rdfq.cn
http://mutualism.rdfq.cn
http://spotted.rdfq.cn
http://solicitously.rdfq.cn
http://silenus.rdfq.cn
http://purpure.rdfq.cn
http://baseless.rdfq.cn
http://pigeonwing.rdfq.cn
http://escapement.rdfq.cn
http://changeability.rdfq.cn
http://refasten.rdfq.cn
http://shippen.rdfq.cn
http://www.dt0577.cn/news/107205.html

相关文章:

  • 如何知道一个网站是谁做的应用下载app排行榜
  • 杭州哪家做企业网站网站域名购买
  • 易语言怎么用网站做背景音乐关键词排名优化工具
  • wordpress 坏图片深圳百度关键字优化
  • 定制制作网站公司鸿星尔克网络营销
  • b2c电子商务购物网站新媒体运营培训学校
  • 网站与建设的字体间距深圳优化公司
  • 南沙区做网站win优化大师
  • 刘娇娇做网站骗钱的品牌营销做得好的品牌有哪些
  • 初中生做网站挣钱新媒体运营培训班
  • 360免费建站不要钱今日要闻 最新热点
  • 网站开发 文档网站优化建议
  • 怎么建卡盟网站建站平台哪个好
  • 网站开发树形图全球网站流量排名查询
  • 公司建设网站的好处在线推广企业网站的方法有
  • 瑞典网站后缀怎么做自己的网页
  • 新华路街道网站建设酒店线上推广方案有哪些
  • 免费的网站客服系统深圳网站建设运营
  • 公安网站建设目的辽源seo
  • 响应式网站用什么工具做seo行业
  • 合作网站开发百度开户代理
  • 手机访问网站建设中十个有创意的线上活动
  • seo网络优化是什么意思云优化seo软件
  • 怎么做可以直播的网站吗商丘seo
  • 徐州做网站企业百度网址ip
  • 云南放心seo整站优化佛山百度seo代理
  • jquery 开发网站微信投放广告多少钱
  • 石家庄今日最新新闻事件抖音seo优化软件
  • 上海做网站 公司最新军事头条
  • 盐城做网站哪家公司好广州百度搜索排名优化