【发布时间】:2015-03-19 12:00:04
【问题描述】:
我正在定义一个执行贪心排序的 Python 函数。
(生物信息学算法 I,2014,Coursera - Stepic 6.4)
排序的结果应该是[+1, +2, +3, +4, +5],并且函数应该返回从初始输入列表的所有变化步骤。
要对初始输入列表进行排序,需要几个反转步骤。它很像pancake flipping problem。在这个问题中,有符号排列 ([-3,+4,+1,+5,-2]) 应更改为恒等符号排列 ([+1, +2, +3, +4, +5])。
示例输入:
[-3, +4, +1, +5, -2]
样本输出:
[[-1, -4, +3, +5, -2],
[+1, -4, +3, +5, -2], # -1 -> +1
[+1, +2, -5, -3, +4], # reversal of (-4, +3, +5, -2)
[+1, +2, +3, +5, +4], # reversal of (-5, -3)
[+1, +2, +3, -4, -5], # reversal of (+5, +4)
[+1, +2, +3, +4, -5], # -4 -> +4
[+1, +2, +3, +4, +5]] # -5 -> +5 Sorting finished!
我写了一个函数,但结果不正确。
# Implementation
def reversing(seq):
"""
>>> reversing([+1,+2,-3,-4])
[+4,+3,-2,-1]
"""
seq.reverse()
seq = map(lambda(x): -x, seq)
return seq
def greedySorting1(lst):
"""
ApproxReversalDistance (ARD)
Return a number (ARD) until the result is [1,2,...,n]
>>> greedySorting1([1,-5,3,-2,-4])
6
"""
change = []
ARD = 0
for i in range(len(lst)):
if lst[i] != i+1:
if i+1 in lst:
id_i = lst.index(abs(i+1))
else:
id_i = lst.index(-abs(i+1))
lst = lst[:i] + reversing(lst[i:id_i+1]) + lst[id_i+1:]
ARD += 1
change.append(lst)
if lst[i] == -(i+1):
lst[i] = i+1
ARD += 1
change.append(lst)
return change
# Testing
print greedySorting([-3,+4,+1,+5,-2])
[[+1, -4, +3, +5, -2], # Wrong: +1 should be -1
[+1, -4, +3, +5, -2],
[+1, +2, -5, -3, +4],
[+1, +2, +3, +5, +4],
[+1, +2, +3, +4, -5], # Wrong: +4 should be -4
[+1, +2, +3, +4, -5],
[+1, +2, +3, +4, +5]]
如何修复我的代码以获得示例输出等正确答案?
谢谢。
【问题讨论】:
-
基本上你的目标是获得
([+1, +2, +3, +4, +5])作为输出并打印所有步骤直到达到这个目标?我们可以使用我们想要的一切吗? -
我可以得到最终的排序结果([+1, +2, +3, +4, +5]),但是我认为整个步骤可以解释这个问题中的贪心排序算法.