Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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
Algorithm 按顺序选择元素_Algorithm_Combinatorics - Fatal编程技术网

Algorithm 按顺序选择元素

Algorithm 按顺序选择元素,algorithm,combinatorics,Algorithm,Combinatorics,考虑以下问题: 我用2q元素{a[1],…,a[2q]}排序了序列。然后我需要得到两个子序列b[I]和c[I],它们满足: b[i]和c[i]都有q元素和Join({b[i]},{c[i]})={a[i]} b[1]b[2]

考虑以下问题:

我用
2q
元素
{a[1],…,a[2q]}
排序了序列。然后我需要得到两个子序列
b[I]
c[I]
,它们满足:

  • b[i]
    c[i]
    都有
    q
    元素和
    Join({b[i]},{c[i]})={a[i]}
  • b[1]
    b[2]
    <<代码>b[q]
  • b[i]
    c[i]
    对于所有
    i
    =1…
    q

  • 困难在于我想要得到满足条件的所有序列。如何才能做到这一点?

    第一步是将输入分成两半,同时确保每个分区都会产生一个解决方案。我们可以通过一个简单的递归方法来实现这一点:

    从小到大迭代输入;对于每个元素,使用以下规则选择是进入子序列b还是c:

    • 如果b和c具有相同的长度,则将元素添加到b
    • 如果b比c长,则将元素一次添加到b,一次添加到c,并使用这两个选项递归
    • 如果b已满,则将所有元素添加到c
    如果不同的分区,例如输入[1,2,3,4,5,6]的分区为:

    [1,2,3],[4,5,6]
    [1,2,4],[3,5,6]
    [1,2,5],[3,4,6]
    [1,3,4],[2,5,6]
    [1,3,5],[2,4,6]
    
    然后,对于每个分区,我们必须找到满足条件的c的置换。同样,一个简单的递归方法也可以做到这一点:

    从右到左迭代b。对于每个元素,找出c中较大的元素。如果只有一个,则将其放在c中的相应位置。如果存在severeal,则将每个元素放在c中的相应位置一次,并使用每个选项递归

    对于示例中的分区[1,2,4],[3,5,6],这将导致:

    [1,2,4],[x,x,x] <- (3,5,6) ... [1,2,4],[x,x,6] <- (3,5) ... [1,2,4],[3,5,6]
         ^       ^          ^         ^       ^          ^
                               ... [1,2,4],[x,x,6] <- (3,5) ... [1,2,4],[5,3,6]
                                      ^       ^        ^
    [1,2,4],[x,x,x] <- (3,5,6) ... [1,2,4],[x,x,5] <- (3,6) ... [1,2,4],[3,6,5]
         ^       ^        ^           ^       ^          ^
                               ... [1,2,4],[x,x,5] <- (3,6) ... [1,2,4],[6,3,5]
                                      ^       ^        ^
    

    [1,2,4],[x,x,x]第一步是将输入分成两半,同时确保每个分区都会产生一个解决方案。我们可以通过一个简单的递归方法来实现这一点:

    从小到大迭代输入;对于每个元素,使用以下规则选择是进入子序列b还是c:

    • 如果b和c具有相同的长度,则将元素添加到b
    • 如果b比c长,则将元素一次添加到b,一次添加到c,并使用这两个选项递归
    • 如果b已满,则将所有元素添加到c
    如果不同的分区,例如输入[1,2,3,4,5,6]的分区为:

    [1,2,3],[4,5,6]
    [1,2,4],[3,5,6]
    [1,2,5],[3,4,6]
    [1,3,4],[2,5,6]
    [1,3,5],[2,4,6]
    
    然后,对于每个分区,我们必须找到满足条件的c的置换。同样,一个简单的递归方法也可以做到这一点:

    从右到左迭代b。对于每个元素,找出c中较大的元素。如果只有一个,则将其放在c中的相应位置。如果存在severeal,则将每个元素放在c中的相应位置一次,并使用每个选项递归

    对于示例中的分区[1,2,4],[3,5,6],这将导致:

    [1,2,4],[x,x,x] <- (3,5,6) ... [1,2,4],[x,x,6] <- (3,5) ... [1,2,4],[3,5,6]
         ^       ^          ^         ^       ^          ^
                               ... [1,2,4],[x,x,6] <- (3,5) ... [1,2,4],[5,3,6]
                                      ^       ^        ^
    [1,2,4],[x,x,x] <- (3,5,6) ... [1,2,4],[x,x,5] <- (3,6) ... [1,2,4],[3,6,5]
         ^       ^        ^           ^       ^          ^
                               ... [1,2,4],[x,x,5] <- (3,6) ... [1,2,4],[6,3,5]
                                      ^       ^        ^
    

    [1,2,4],[x,x,x]您想对所有序列做些什么,还是只计算有多少序列?c不需要排序吗?我的意思是,对于
    [1,2,3,4]
    您是否同时想要
    [1,2],[3,4]
    [1,2],[4,3]
    ?这有点不清楚。一个已排序的序列只能以一种方式拆分,这样两半的串联将返回原始序列。@m69是的,c不需要排序。我需要所有的序列。b&c必须是连续的吗?例如,
    [1,2,3,4]
    可以拆分为
    [1,3]
    &
    [2,4]
    ?如果您确实想要所有解决方案,那么在任何情况下都将是O(q!),因为解决方案的数量按O(q!)缩放。事实上,只要把a的最小元素q放到b中,仍然会留下q!用不同的方法对c中的其余元素进行排序。您想对所有序列做些什么,还是只计算有多少个序列?c不需要排序吗?我的意思是,对于
    [1,2,3,4]
    您是否同时想要
    [1,2],[3,4]
    [1,2],[4,3]
    ?这有点不清楚。一个已排序的序列只能以一种方式拆分,这样两半的串联将返回原始序列。@m69是的,c不需要排序。我需要所有的序列。b&c必须是连续的吗?例如,
    [1,2,3,4]
    可以拆分为
    [1,3]
    &
    [2,4]
    ?如果您确实想要所有解决方案,那么在任何情况下都将是O(q!),因为解决方案的数量按O(q!)缩放。事实上,只要把a的最小元素q放到b中,仍然会留下q!在c中对其余元素排序的不同方法。