多晶硅还原炉尾气回收中红外气体分析仪ULTRAMAT 23选型与运维要点
2026/10/10 19:48:39
数组是最简单的,也最基础的数据结构。数组是一个有序的数据集合,用索引(或者叫下标)访问数据。在大多数编程语言,比如C/C++/java/javascript中,数组的索引都是以0开始。它的逻辑结构是一段连续的空间(因为虚拟内存的原因,实际情况下大数组可能由多个不连续的内存页组成)。
如下图所示:
| 索引 | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| 数据 | 1 | 1 | 2 | 3 | 5 | 8 |
上图中,第一行表示数据第二行表示索引
一维数组,我会以一个案例来开始。
假设有这么一个需求,求11个点能构成多少种二叉树。比如3个点,可以构成五种二叉树:
按照序言里的步骤,我们第一步是仔细研究需求。从上图看,所有的树都是线性结构。那么不同在哪里?可见这个问题其实是数学里的组合计数问题。
以3个点为例子,作为二叉树必须要有根节点。那么利用分类归纳法,可以这样计算出来。
场景1 只有左节点
场景2 左右节点都存在
场景3 只有右节点
以上场景实际上是什么问题?是结点的左右分配问题!那么假设N个结点能组成二叉树的数目为C(n)
defc(n):ifn<2:return1array=[0]*(n+1)array[1]=array[0]=1foriinrange(2,n+1):forjinrange(0,i):array[i]+=array[j]*array[i-j-1]returnarray[n]需要注意的是python中没有严格意义上的数组。为了严谨,这里附上java代码。
publicstaticintcatalan(intn){if(n<2){return1;}int[]array=newint[n+1];array[1]=array[0]=1;for(inti=2;i<n+1;i++){for(intj=0;j<i;j++){array[i]+=array[j]*array[i-j-1];}}returnarray[n];}这个数列就是著名的明安图数列,也叫卡特兰数列。不过在我们这个例子中,与卡特兰数列错了一位而已。
我们的例子中c(0)=1 c(1)=1 c(2)=2……
而卡特兰数列是c(1)=1 c(2)=1 c(3)=2……
递归公式,与卡特兰数列一模一样。
这个题目属于数学专业研究生的组合计数学课程。其实我是反对把知识分什么中学知识、大学知识、硕士阶段、博士阶段的。我们要做的仅仅是,按照编程的套路,先仔细分析需求,选择合适的数据结构,然后设计算法,编写代码,就可以了。