如果给我一个序列X = {x1,x2,....xm}
,那么我将有(2^m)
个子序列。
任何人都可以解释我如何直观地得出这个公式?
我可以从3个元素开始,然后是4个然后是5个并且达到这个公式,但我认为我不理解。 '2'来自哪里?我不是在这里分成两半或任何东西。
谢谢你的帮助。
答案 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
不在此子集中,但b
和c
确实存在,因为它们各自的二进制数字是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^米。