找到将序列更改为另一个序列的最小步骤数

时间:2014-05-02 06:28:08

标签: algorithm sorting math

我们有两个定向序列,

例如(+A-) (-B+) (+C-) (-D+) (+E-) and (+B-) (+C-) (-D+) (+E-) (+A-)

请注意,(+A-)表示面向子序列,其中'+'表示子序列的头部,'-'表示尾部。如果'1234'(+A-),则'4321'(-A+),与(+A-).

相反

目标是找到将序列更改为另一个序列的最小步骤数,只进行反向操作。

例如,我们需要反转一次才能更改(+A-)(+B-) to (-B+)(-A+).

我们需要反转两次以更改(+A-) (+B-) (+C-) to (-A+) (+B-) (-C+).

首先给出的两个序列之间的最小操作步数是3.这是一种方法:

  

步骤0.(+ A-)( - B +)(+ C - )( - D +)(+ E - )

     

步骤1. (+ B-)( - A +)(+ C-)( - D +)(+ E-)

     

步骤2.(+ B-)( - A +)( - E +)(+ D-)( - C +)

     

步骤3.(+ B-)(+ C-)( - D +)(+ E - )(+ A - )


我的想法是问题可能与排序问题有关,但不是在序列中交换两个单独的元素,这里我们必须考虑交换两个子序列。

1 个答案:

答案 0 :(得分:0)

您可以尝试的一种方法是考虑一个函数g,它计算序列中两个相邻元素未正确连接的所有位置。

所以在您的原始示例中,目标为:

Start (+B-) (+C-) (-D+) (+E-) (+A-) End

我们考虑原始序列中的每对元素:

Start (+A-) (-B+) (+C-) (-D+) (+E-) End ->
Start (+A-) Incorrect because Start should be followed by +B
(+A-) (-B+) Incorrect because A- should be followed by End
(-B+) (+C-) Incorrect because B+ should be followed by Start
(+C-) (-D+) Correct
(-D+) (+E-) Correct
(+E-) End   Incorrect because E- should be followed by +A

所以这得分为4分不正确。

每当你反转一个子串时,你改变最多2个相邻元素的状态,所以最多得分将减少2。

在你的例子中我们有:

步骤0. x(+ A-)x(-B +)x(+ C-)( - D +)(+ E-)x得分4

步骤1.(+ B-)x(-A +)x(+ C-)( - D +)(+ E-)x得分3

步骤2.(+ B-)x(-A +)( - E +)(+ D-)( - C +)x得分2

步骤3.(+ B-)(+ C - )( - D +)(+ E-)(+ A-)得分0

由于原始得分为4,我们确信至少需要2次掉期(因为得分每步最多可减少2次),而您的解决方案使用3次,所以我们只需要检查替代方案为了排除更好的解决方案,每一步的分数减少2。

有一种众所周知的算法可用于执行此类搜索,它被称为A star search

对于这种类型的搜索,您需要一个允许的启发式方法,它永远不会过高估计与目标的距离。我建议您尝试使用0.5 * g给出的启发式解决问题。