Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 组合学:在元素保持排序的同时,构建10组100个元素_Php_Combinatorics_Combinations - Fatal编程技术网

Php 组合学:在元素保持排序的同时,构建10组100个元素

Php 组合学:在元素保持排序的同时,构建10组100个元素,php,combinatorics,combinations,Php,Combinatorics,Combinations,我有一个关于组合数学的问题。不幸的是,我不能抽象地描述它,所以我试着用一个故事来解释它 问题: 校园里有100个孩子 假设值为100-199cm,它们都具有唯一的高度 您希望构建10个组,每个组由1-99个孩子组成 当孩子们必须按身高排序时,你如何建立所有的小组 我需要这些群体所有可能的解决方案,因为找到一个星座并不难 简洁明了: 所有100个孩子并排站着。你只需要决定在哪里将他们分成小组,并找到所有解决方案 示例(值为高度): [120…190…199]。。。[126…137…144…188]

我有一个关于组合数学的问题。不幸的是,我不能抽象地描述它,所以我试着用一个故事来解释它

问题:

  • 校园里有100个孩子
  • 假设值为100-199cm,它们都具有唯一的高度
  • 您希望构建10个组,每个组由1-99个孩子组成
  • 当孩子们必须按身高排序时,你如何建立所有的小组
  • 我需要这些群体所有可能的解决方案,因为找到一个星座并不难
  • 简洁明了:

    所有100个孩子并排站着。你只需要决定在哪里将他们分成小组,并找到所有解决方案

    示例(值为高度):

    [120…190…199]。。。[126…137…144…188]是不可能的

    [101]。。。[104 ... 105 ... 112 ... 149] ... [169…189]是可能的

    我希望你能帮助我。提前非常感谢


    附言:这不是家庭作业通常情况下,我需要一个函数来处理数字。但我不能抽象地描述这一点,就像“在所有数字都排序的情况下构建k组数字”。我以为你不会这样理解的PHP的解决方案最好,但我也很乐意看到其他语言的解决方案。:)

    据我所知,您实际上是在寻求将区间[100199]划分为10个部分的方法,即,您希望找到数字x[0],…,x[10],以便:

    x[0] = 100 < x[1] < x[2] < ... < x[9] < x[10] = 199
    
    下面的Java代码打印出实际的分区。因为(100,10)的分区数非常高,所以我将说明(5,3)的答案:

    公共类分区2
    {
    私有静态void显示分区(int-sizeSet,int-numPartitions)
    {
    showPartitions(“”,0,sizeSet,numPartitions);
    }
    私有静态void showPartitions(字符串前缀、int start、int finish、,
    国际货币基金组织(numLeft)
    {
    如果(numLeft==0&&start==finish){
    System.out.println(前缀);
    }否则{
    前缀+=“|”;
    对于(int i=开始+1;i
    我需要所有可能的解决方案
    这些团体,因为这并不难
    找到一个星座

    通常,有100种方法来排列100个项目,但是由于你保持了顺序,你可以大大减少你的问题大小。你描述的是一个。例如,假设你把数字5划分成所有可能的整数子集,加起来等于5,你会得到集合{5},{4,1},{3,2},{3,1,1,},{2,2,1},{2,1,1,1},{1,1,1,1,1}

    整数分区的数量随整数的大小呈指数增长,但指数增长速度足够慢,您可以枚举n=100的所有分区,因为只有190569292个分区。这里的附加约束是,您要过滤所有分区,以获得正好包含10个项的集合,其中通过使用费雷尔图,ich易于枚举

    我可以通过将数字20划分为3个存储桶来演示费雷尔图:从20列x 3行网格开始,如下所示:

    12345678901234567890 1****************** 2* 3* 12345678901234567890 1****************** 2* 3* 第一个分区是{18,1,1}

    现在将项目从堆栈顶部移动到下一个插槽:

    12345678901234567890 1***************** 2** 3* 12345678901234567890 1***************** 2** 3* 我们的新分区是{17,2,1}。我们可以将另一项从一个堆栈转移到另一个堆栈:

    12345678901234567890 1**************** 2*** 3* 12345678901234567890 1**************** 2*** 3* 现在我们有了{16,3,1}。你继续以这种方式,直到你列举了所有的置换(取决于你是否{17,1,2}是一个与{17,2,1}不同的分区)


    从这一点上讲,你应该能够设想出你所需要的算法的大致轮廓——也就是说,如果你想从头开始编写这个函数的话。其他人已经很容易地解决了这个问题。

    最后,你不必把所有的100个孩子都放在一组中?只是为了验证我的理解——这是你的第一个例子不可能,因为第1组中的190比第2组中的126大?@Bruno Reis:是的,你必须把每个孩子放在一个gorup中。你是对的,这个例子有点混乱。我用“…”@marco92w:在第2个例子中,孩子106在哪里?在[104,105,112,149]的左边?或者在它的右边?我不明白为什么这是可能的,而第一个是不可能的。另一个问题:你必须精确地构建10个组吗?或者最多10个组吗?你的问题没有很好地解释…谢谢。我需要从链接页面中获得的功能应该是这个,不是吗?这是否只给了我分区的数量r甚至是列表?有人能帮我把它转换成PHP吗?谢谢!这应该是你在PHP中的代码:不幸的是,它需要很长的时间(>30秒)或者无限期地运行。代码中有错误吗?也许你可以将你的代码与Juliet链接的代码进行比较?这是一个递归函数,如果你记忆,它会更快(即记住你已经计算过的函数的值)。我同意你对(25,7)的结果。我对(100,10)的结果是1731030945644。Java代码计算它们的速度比PHP代码快的原因是内存化;即,在返回结果之前将结果缓存在数组中,因此不必重新计算。内存化的内容是分区的值(intervalize,parties),否则必须为每个分区重新计算它(非常慢)为了明确这一点,3个有序分区12 | 34 | 5、12 | 3 | 45和1 | 23 | 45将被计算为一个无序分区(5=2+2+1)。因为我们多次计算一些无序分区,所以我们的值大于p(100)。 12345678901234567890 1****************** 2* 3* 12345678901234567890 1***************** 2** 3* 12345678901234567890 1**************** 2*** 3*