给定序列中的子序列数

时间:2011-03-02 18:34:22

标签: algorithm

如果给我一个序列X = {x1,x2,....xm},那么我将有(2^m)个子序列。 任何人都可以解释我如何直观地得出这个公式? 我可以从3个元素开始,然后是4个然后是5个并且达到这个公式,但我认为我不理解。 '2'来自哪里?我不是在这里分成两半或任何东西。 谢谢你的帮助。

13 个答案:

答案 0 :(得分:21)

首先,您所谈论的内容称为设置。第二,正确的是,可以从集合中生成的不同子集的数量等于2 ^ m,其中m是该集合中的元素的数量。如果我们以3个元素为例,我们可以得出这个结果:

S = {a, b, c}

现在要生成每个子集,我们可以使用二进制数字来模拟元素的存在:

xxx where x is either 0 or 1

现在让我们列举所有可能性:

000 // empty sub-set
001
010
011
100
101
110
111 // the original set it self!

011为例。第一个数字为0,然后a不在此子集中,但bc确实存在,因为它们各自的二进制数字是1。现在,给定 m (例如上例中的3个)二进制数字,可以生成多少个二进制数(子集)?你现在应该回答这个问题;)

答案 1 :(得分:19)

对于实际上正在寻找子字符串的任何人(因为标题或网址可能会让您相信):

Subset: 2^n (Order doesn't matter in sets)
Subsequence: 2^n (Since we keep the original ordering, this is the same.)
Substring: n(n+1) * 1/2 (Elements must be consecutive)

答案 2 :(得分:6)

x_i可以在子序列中,也可以不在子序列中。这有点像。有2^m组合用于打开/关闭序列中的m数字。

答案 3 :(得分:5)

2来自哪里?每次添加一个元素时,你都会增加两倍的可能性。

答案 4 :(得分:4)

对于任何序列X = {x1,x2,.... xm},将有(2 ^ m)个子序列,因为你可以“选择”长度为0,1,2的子序列。 ..,m,即数学上是

“C(m,0)+ C(m,1)+ ... C(m,m)”,这导致2 ^ m。

例如,比如说字符串是“abc”,那么

C(3,0)= 1,“”

C(3,1)= 3,“a”,“b”,“c”

C(3,2)= 3,“ab”,“bc”,“ac”

C(3,3)= 1,“abc”

子序列的数量是8,即2 ^ 3。

有关详细信息,请访问http://en.wikipedia.org/wiki/Binomial_coefficient#Series_involving_binomial_coefficients

答案 5 :(得分:4)

对于长度为m的序列中的每个元素,您可以选择它或保留它。因此,有两种方法可以处理每个元素。因此,总数没有。处理所有m元素的方法是2*2*2...... m次= 2^m次。

答案 6 :(得分:1)

通过在选择或不选择m个元素中的每一个之间进行选择来定义每个子序列。由于有m个元素,每个元素都有两种可能的状态,因此可以获得2 ^ m的可能性。

答案 7 :(得分:1)

如果你有一个序列S,当你在S的末尾添加一个新的元素x时会发生什么?

S的所有子序列仍然是新序列的子序列。所有那些最后添加了x的子序列也是如此。

瞧!每次添加元素时,都会使子序列的数量加倍。

答案 8 :(得分:0)

每个元素都在子序列中或者不在子序列中。因此,从第一个x1开始,有两组子集:包含x1的子集和不包含x1的子集。对于较小的子问题{x2,...,xm},可以做同样的事情。因此,你最终得到2 ^ m。

答案 9 :(得分:0)

基本上,每个新数字的后续序列会有两倍,因为你将有(2^(m-1))个“等效”子序列向右移一个空格(假设水平排序并在右边添加)加上子序列所有元素。

答案 10 :(得分:0)

我最近开始算法课程。

我想更直观的思考答案的方法是想一个例子。

例如,我们有A =(1,2,3) 那我们可能有     0那是1路     1,2或3的3种方式     (1,2),(1,3),(2,3)也是3种方式     和     (1,2,3)==再一次

总子序列为2 ^ 3或8。 所以通用公式是     MC0 + MC1 + MC2,MC3 + ...... MCM

如果我错了,请纠正我。几分钟前我遇到了这个问题,这就是我对直观公式的看法。

答案 11 :(得分:0)

为了扩展已接受的答案,可以用数学术语来考虑子序列的数量。我们来看一个字符串的例子:'ABC'。

字符串'ABC'的子序列数:

=> C(3, 0) + C(3, 1) + C(3, 2) + C(3, 3) = 1 + 3 + 3 + 1 = 8 (2^3).

(注意:C(m,n)代表大小为'm'的字符串'n'的子序列数

可以通过列出所有内容轻松验证:

C(3, 0) = '', // Taking 0 letters at a time out of the given string.
C(3, 1) = 'A', 'B', 'C', // Taking 1 letter at a time.
C(3, 2) = 'AB', 'AC', 'BC', // Taking 2 letters at a time.
C(3, 3) = 'ABC'. // Taking 3 letters at a time.
(Total count = 8)

我们为子序列保持字母序列相同,因此,组合而不是置换

注:二项式系数之和,使用二项式定理= 2 ^ n。 证明如下:

From Binomial theorem,
(x + y)^n = C(n, 0) x^n y^0 + .... + C(n, n) x^0 y^n

Using x = 1, y = 1,
(1+1)^n = C(n, 0) 1^n 1^0 + .... + C(n, n) 1^0 1^n 
=> 2^n = C(n,0) + C(n,1) + .... + C(n,n)

这就是'2'来自二项式定理的地方。

答案 12 :(得分:0)

每次遇到一个字符时,要么将其包含在子序列中,要么不将其包含在结果中,这意味着如果您将字符串视为树的根,那么它将有两个子序列,一个是子序列包括当前没有的字符,这使它成为二叉树。平衡二叉树中的节点数是 n^m,其中 n 是分支因子,m 是树的高度,我们知道分支因子是 2,高度是字符串中的字符数,因此它是 2^米。