{0,1}上的序列数,使得序列至少包含一半

时间:2009-10-08 07:37:16

标签: algorithm runtime complexity-theory

如何计算{0,1}上的序列数,使每个序列至少包含一半?

3 个答案:

答案 0 :(得分:5)

长度为n的序列总数为2 ^ n。如果n是奇数,那么它们的一半(2 ^(n-1))至少有一半。 对于偶数n,你必须考虑到n!/((n / 2)!^ 2)序列恰好有一半。所以在这种情况下,我认为你总有 (1/2)*(2 ^ n + n!/((n / 2)!^ 2))。

答案 1 :(得分:1)

假设序列的总长度为n,并且包含n / 2的序列的数量为:

n!/((n/2)!^2)

编辑:

抱歉,我犯了一个错误。我的意思是n!/((n/2)!^2)但不是n!/(2*(n/2)!)。我认为它是combination个问题并使用了以下公式。 (将k替换为n/2

alt text

答案 2 :(得分:0)

编辑:当!我们(I)应该经常仔细阅读问题! 以下涉及枚举0和1的数量相等的序列数!实际问题是零的数量应该小于或等于1的数量!!!

Pierr的公式, n!/(2 *(n / 2)!)几乎是正确的,实际上是 n!/((n / 2)!*(n / 2)!)

但这可以使用一些解释(双关语;-))。

n是总长度,我们知道 n必须是偶数,因为问题需要相同数量的0和1。

让我们专注于放置0 。对于长度为n的序列,我们有 n / 2个零位,以放入序列的n个位置之一。我们只需要计算零位,因为在那之后就没有关于一位的选择:所有其他位置都需要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种方式和最后的0位的1种(即无选择)。那么完整的公式需要是(a)除以(n / 2)!,即:

  n! / (n/2)! * 1/(n/2)! 
= n! / ((n/2)! * (n/2)!)