我正在寻找一种基于子集反转的排序算法。这就像煎饼排序,只是不是把所有的煎饼都放在抹刀上,你可以倒置任何你想要的子集。子集的长度无关紧要。像这样: 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 工作,因为我们在这方面拥有丰富的经验,但我对任何关于如何更有效地解决这个问题的伪代码想法都很满意。如果您认为另一种语言可能更适合,请告诉我。欢迎使用伪代码、想法、想法和实际代码!
提前致谢!