2

我正在寻找一种基于子集反转的排序算法。这就像煎饼排序,只是不是把所有的煎饼都放在抹刀上,你可以倒置任何你想要的子集。子集的长度无关紧要。像这样: http ://www.yourgenome.org/sites/default/files/illustrations/diagram/dna_mutations_inversion_yourgenome.png 所以我们不能简单地交换数字而不反转两者之间的一切。

我们这样做是为了确定果蝇的一个亚种如何变异成另一种。两者具有相同的基因,但顺序不同。第二个亚种的基因组是“排序的”,即基因编号为1-25。第一个亚种基因组是未分类的。因此,我们正在寻找一种排序算法。

这是我们正在研究的“基因组”(尽管我们应该能够对所有数字列表进行这项工作):

[23, 1, 2, 11, 24, 22, 19, 6, 10, 7, 25, 20, 5, 8, 18, 12, 13, 14, 15, 16, 17, 21, 3, 4, 9];

我们正在研究两个不同的问题:

1) 对 25 个倒数最少的数字列表进行排序

2) 对移动数字最少的 25 个数字的列表进行排序 我们还想为两者建立上限和下限。

我们已经找到了一种这样的排序方法,只需从左到右,搜索下一个最低值并将其间的所有内容反转,但我们绝对确定我们应该能够更快地做到这一点。但是,我们仍然没有找到任何其他方法,所以我请求您的帮助!

UPDATE: the method we currently use is based on the above method 
but instead works both ways. It looks at the next elements needed 
for both ends (e.g. 1 and 25 at the beginning) and then calculates 
which inversion would be cheapest. All values at the ends can be 
ignored for the rest of the algorithm because they get put into the 
correct place immediately. Our first method took 18/19 steps and 148 
genes, and this one does it in 17 steps and 101 genes. For both 
optimalisation tactics (the two mentioned above), this is a better 
method. It is however not cheaper in terms of code and processing.

现在,我们正在使用 Python 工作,因为我们在这方面拥有丰富的经验,但我对任何关于如何更有效地解决这个问题的伪代码想法都很满意。如果您认为另一种语言可能更适合,请告诉我。欢迎使用伪代码、想法、想法和实际代码!

提前致谢!

4

2 回答 2

0

我认为您要寻找的第二个问题是对序列进行排序的相邻元素的最小交换次数,这等于序列中的反转次数(其中 a[i] > a[j] 和 i <j)。

第一个问题对我来说似乎有点复杂。一种潜在的启发式方法可能是将子集反转视为类似于多个元素的相邻交换。例如,如果你设法得到一个序列到这个位置,

5,6,1,2,3,4,7,8

我们可以用[2,3]“相邻交换”索引[0,1](因此反转[0,1,2,3]),

2,1,6,5,3,4,7,8

然后是 [2,3] 和 [4,5](反转 [2,3,4,5]),

2,1,4,3,5,6,7,8

并得到一个现在元素反转显着减少的序列,这意味着现在完成排序所需的单个相邻交换更少。

因此,也许尝试量化部分的反转(在 a[i] > a[j] 和 i < j 的意义上)而不是单个元素可能有助于朝着估计或构建第一个问题的方法的方向前进。

于 2016-04-22T09:17:48.610 回答
0

关于第一个问题:你知道(并关心)基因位于两条链中的哪一条吗?

如果是这样,你很幸运:这被称为有符号排列问题之间的反演距离,并且有一个线性时间算法:http ://www.ncbi.nlm.nih.gov/pubmed/11694179 。我没有看细节。

如果不是,那么不幸的是(如该论文第 2 页所述)问题是 NP 难的,因此在最坏的情况下不太可能存在任何高效(多项式时间)的算法。


关于第二个问题:假设您的意思是要找到对数字列表进行排序所需的最小交换次数,您应该能够通过在 SO 和其他地方搜索来找到解决方案。我认为是一个清晰而简洁的解释。您还可以使用此问题的最佳解决方案来获得第一个问题的上限:可以使用两个区间反转 (i, j) 和 (i+1, j-1) 模拟位置 i 和 j 的任何交换. (不过,这个上限可能非常糟糕,尤其可能比您现有的贪心算法更糟糕。)

于 2016-04-21T13:34:16.420 回答