包含至少3个连续元素的{1,2,3,...,N}的子集数

时间:2012-09-07 04:53:14

标签: math combinatorics

假设我们有一个类似{1,2,3}的集合,那么只有一种方法可以选择3个连续的数字......它就是集合{1,2,3} ......

对于一组{1,2,3,4},我们有3种方式:123 234 1234

(从技术上讲,这些是无序的数字集,但连续写它们有帮助)

  • f(5); {1,2,3,4,5} - > 8种方式:123 1234 1235 12345 234 2345 345 1345
  • f(6); {1,2,3,4,5,6} - > 20种方式:......
  • f(7); {1,2,3,4,5,6,7} - > 47种方式:......

因此,对于给定的N,我可以通过应用强力,并计算具有3个或更多连续数的所有这样的子集来得到答案。

这里我只是想找出一种模式,一种技术来获得给定N的所有这种子集的数量。

问题进一步推广到.....在一组大小N中发现m个连续数。

5 个答案:

答案 0 :(得分:5)

在这个问题和“某个地方连续至少有三个连续1的N位二进制数的数量之间存在一个双射”(如果在子集中排除,则双射数为0)如果包含在子集中则为1)。

这是一个众所周知的问题,如果您搜索number of n-digit binary strings with m consecutive 1s,那么搜索2^n - tribonacci(n+3)的搜索结果应该是Google的足够信息,第二次点击是Finding all n digit binary numbers with r adjacent digits as 1

或者你可以查看http://oeis.org/search?q=0%2C0%2C1%2C3%2C8%2C20%2C47(基于你在前几个术语中使用的强制执行) - 得到{{1}}的明确公式,请参阅here对于tribonacci数的显式公式。它还给出了递归关系。给出的类比是“在公平硬币的n个翻转中获得至少1次3头的概率(超过2 ^ n)”

我只能假设一般问题的答案是2 ^ n - F m (n + m),其中F m 是m th n-step Fibonacci number编辑:seem to be the case

答案 1 :(得分:0)

这听起来像是我的作业,所以我会让你开始。 FoOne方法是考虑运行的最低和最高成员,L和H.如果设置大小为N且您的最小运行长度为M,那么对于L的每个可能位置P,您可以计算出多少个位置我有..... ....

答案 2 :(得分:0)

不确定您的意思是否连续。如果没有,那么对于{1,2,3,4},有4种可能性:{1,2,3} {2,3,4} {1,3,4} {1,2,3,4} < / p>

我认为你可以用N!/ 3来计算解决方案!哪个N! = N *(N-1)(N-2) ... * 1.

答案 3 :(得分:0)

使用一些python代码,我们可以调查一下:

y = set()

def cons(li, num):
    if len(li) < num:
        return
    if len(li) == num:
        y.add(tuple([i for i in li]))
    else:
        y.add(tuple([i for i in li]))
        cons(li[1:], num)
        cons(li[:-1], num)

这个解决方案会非常慢(实际上它的复杂程度是指数),但是尝试一些小的列表大小,我认为你应该能够选择这种模式。

答案 4 :(得分:0)

快速回答:

Sequences(n) = (n-1)*(n-2) / 2

答案很长:

你可以通过归纳来做到这一点。首先,我将重新陈述问题,因为你的问题陈述不够明确。

  • 规则1:对于所有连续数字组1..n其中n为2或更多

  • 规则2:计算连续数m..m + q的子集S(n),其中q为2或更多

S(N = 3)

通过检查我们只找到一个 - 123

S(N = 4)

通过检查我们发现3! - 123 234和1234

请注意,S(4)包含S(3),加上两个新的......都包括新数字4 ... hmm。

S(N = 5)

通过检查我们发现...... S(n = 4)以及345 2345和12345.这是3 + 3 =总共6个。

我认为这里形成了一种模式。让我们定义一个新函数T。

  • 规则3:对于某些T,S(n)= S(n-1)+ T(n)......

我们知道S(n)包含数字n,并且现在应该发现S(n)还包含(作为子组件)所有包含数字n的长度为3到n的序列。我们知道它们不能在S(n-1)中,所以它们必须在T(n)中。

  • 规则4:T(n)包含以n结尾的所有序列,长度为3到n。

S(n)中有多少个序列?

让我们回顾一下S(3)S(4)和S(5),并加入T(n):

  • S(3)= S(3)
  • S(4)= S(3)+ T(4)
  • S(5)= S(4)+ T(5)= S(3)+ T(4)+ T(5)

让我们概括一下:

    对于从4到n的所有f,
  • S(n)= S(3)+ T(f)。

那么在给定的T中有多少?

回顾第5条规则 - 它描述了多少个序列?

对于T(4),它描述了以4结尾的所有序列3和更长的序列(即234)

对于T(5),它描述了所有序列3和更长的结尾为5.(即345 2345 = 2)

T count Examples
4 2     1234 234
5 3     12345 2345 345
6 4     123456 23456 3456 456

看起来非常像T(n)只是n-2!

所以

S(6) = T(6) + T(5) + T(4) + S(3)
  10 = 4    + 3    + 2    + 1

和     S(7)= 15 = 5 + 4 + 3 + 2 + 1     S(8)= 21 = 6 + 5 + 4 + 3 + 2 + 1

将其转换为公式

什么是2 * S(8)?

42 = 6 + 5 + 4 + 3 + 2 + 1 + 1 + 2 + 3 + 4 + 5 + 6

添加每对最大和最小数字:

42 = 7 + 7 + 7 + 7 + 7 + 7

42 = 7 * 6

但那是2 * S(8),所以

S(8)= 42/2 = 21 = 7 * 6/2

这概括了:

S(n) = (n-1)*(n-2) / 2

让我们检查一下:

S(3) = 2*1/2 = 1
S(4) = 3*2/2 = 3
S(5) = 4*3/2 = 6
S(6) = 5*4/2 = 10

我很满意。