Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将一个列表转换为另一个列表_Algorithm - Fatal编程技术网

Algorithm 将一个列表转换为另一个列表

Algorithm 将一个列表转换为另一个列表,algorithm,Algorithm,例如,给定两个列表: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] b = [2, 4, 6, 7, 0, 1, 3, 5, 8, 9] 我希望找到一系列动作,将列表a转换为列表b,其中每个动作都是一个操作: move(from_index, to_index) 它将元素从_索引移动到位置,并将其放置到_索引。因此,如果: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 然后,列表a上的操作move(3,1)将a转换为: a = [0, 3,

例如,给定两个列表:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [2, 4, 6, 7, 0, 1, 3, 5, 8, 9]
我希望找到一系列动作,将列表a转换为列表b,其中每个动作都是一个操作:

move(from_index, to_index)
它将元素从_索引移动到位置,并将其放置到_索引。因此,如果:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
然后,列表a上的操作move(3,1)将a转换为:

a = [0, 3, 1, 2, 4, 5, 6, 7, 8, 9]

a=[0,1,2,3,4,5,6,7,8,9]
b=[2,4,6,7,0,1,3,5,8,9]

移动(0,8)
a=[1,2,3,4,5,6,7,0,8,9]

移动(0,8)
a=[2,3,4,5,6,7,0,1,8,9]

移动(1,8)
a=[2,4,5,6,7,0,1,3,8,9]

移动(2,8)
a=[2,4,6,7,0,1,3,5,8,9]

a==b

希望这就是你想要的


基本上,从最左边的元素开始,并将其移动到应该的位置。例如,我取0并将其放在它最终应该落在后面的值后面,即7。我继续从左向右移动,直到所有元素都按所需顺序排列

我将迭代第二个序列(排序列表)并交换第一个序列中的项目。我用python编写了以下伪代码:

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b = [2, 4, 6, 7, 0, 1, 3, 5, 8, 9]
>>> def swap(seq, i, j):
...     a = seq[i]
...     seq[i] = seq[j]
...     seq[j] = a
...
>>> for index_in_b, value in enumerate(b):
...     index_in_a = a.index(value)
...     if index_in_b != index_in_a:
...         swap(a, index_in_a, index_in_b)
...         print('move {} to {}'.format(index_in_a, index_in_b))

move 0 to 2
move 1 to 4
move 2 to 6
move 3 to 7
move 4 to 6
move 5 to 6
move 6 to 7
在本例中,我通过交换来移动第一个序列中的项目

更新 通过删除swap函数中的move和函数调用,我们可以稍微提高python的性能。以下是性能比较:

import timeit
s1 = """
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [2, 4, 6, 7, 0, 1, 3, 5, 8, 9]
def swap(seq, i, j):
    a = seq[i]
    seq[i] = seq[j]
    seq[j] = a

for index_in_b, value in enumerate(b):
    index_in_a = a.index(value)
    if index_in_b != index_in_a:
        swap(a, index_in_a, index_in_b)"""

s2 = """
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [2, 4, 6, 7, 0, 1, 3, 5, 8, 9]
for index_in_b, value in enumerate(b):
    index_in_a = a.index(value)
    if index_in_b != index_in_a:
        a[index_in_a], a[index_in_b] = a[index_in_b], a[index_in_a]"""


# on an i7 macbook pro
timeit.timeit(s1) 
4.087386846542358
timeit.timeit(s2)
3.5381240844726562

稍微好一点,但肯定有更好的方法来实现这一点。

转换总是可能的吗?这是Python吗?这些列表是相互排列的吗?你是在寻找更具体的东西,比如最小移动次数吗?所以基本上你想我想OP是在寻找一个通用算法,不是这件事的具体步骤。@MarkMeyer说得对。我只是在我的答案后面加了一个我的总体策略的总结。谢谢你的解决方案。它工作得很好。你能优化它,使它是最优的还是接近最优的?例如,当一次移动足够(移动(5,0))时,此算法需要5次移动来转换[0,1,2,3,4,5]->[5,0,1,2,3,4]。感谢您的解决方案,尽管将交换操作转换为两次移动操作的成本太高。我们可以通过一次移动两次操作来稍微加快转换速度。我将用timeit结果更新答案。