【发布时间】:2010-12-04 21:43:12
【问题描述】:
如何计算 {0,1} 上的序列数,使每个序列至少包含一半?
【问题讨论】:
-
这听起来像是家庭作业,对吧?
-
这不是一个真正的家庭作业问题,但它可能是相关的。
标签: algorithm runtime complexity-theory
如何计算 {0,1} 上的序列数,使每个序列至少包含一半?
【问题讨论】:
标签: algorithm runtime complexity-theory
长度为n的序列总数为2^n。如果 n 是奇数,则它们中的一半 (2^(n-1)) 至少有一半。 即使是 n,您也必须考虑到有 n!/((n/2)!^2) 个序列正好是一半。所以在这种情况下,我认为你总共有 (1/2)*(2^n + n!/((n/2)!^2))。
【讨论】:
假设序列的总长度为n,包含n/2个1的序列数为:
n!/((n/2)!^2)
编辑:
对不起,我弄错了。我的意思是n!/((n/2)!^2),但不是n!/(2*(n/2)!)。我将其视为combination 问题并使用了以下公式。 (用n/2替换k)
【讨论】:
编辑:该死!我们(我)应该始终仔细阅读问题!
下面涉及枚举 0 和 1 的数量相等的序列的数量!实际问题是0的个数应该小于等于1的个数!!!
皮尔的公式,n!/(2*(n/2)!)几乎是正确的,实际上是,n!/((n/2)!*(n /2)!)
但这可能需要一点解释(双关语;-))。
n 是总长度,我们知道 n 必须是偶数,因为问题需要相同数量的 0 和 1。
让我们专注于放置 0。对于长度为 n 的序列,我们有 n/2 个零位,用于放入序列的 n 个位置之一。我们只需要计算 0 位,因为在那之后将没有关于 1 位的选择:所有其他位置都需要一个 1。
所以... n/2 个零位,对于 n 个位置...有 n 种方法来选择第一个位置,然后有 (n-1) 种方法来选择第二个位置 (两个位不能占据相同的位置)等。 因此,这个选择的数量是
n! / (n/2)!
例如,对于 n=6,我们有
6 * 5 * 4 choices,
which, by multiplying and dividing by (3*2*1) is equivalent to
= 6 * 5 * 4 * (3 * 2 * 1) / (3 * 2 * 1)
= 6! / 3!
= n! / (n/2)! (a)
现在...其中一些选择 [关于将第一位、第二位等放在哪里] 导致相同的组合,因为所有零位都是相同的,因此是否一个假设 x 位置的“第一个”位和位置 y 的“第二”位,或者第一个到 y 和第二个到 x,我们会有相同的组合。有 (n/2) 个!排列这些 n/2 位的方法。在 n = 6 的示例中,有 3 种方法可以选择“第一位”位的位置,2 种方法选择第 2 位,1 种方法选择最后一个零位。完整的公式则需要 (a) 除以 (n/2)!,即:
n! / (n/2)! * 1/(n/2)!
= n! / ((n/2)! * (n/2)!)
【讨论】: