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,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中对其余元素排序的不同方法。