首先,我会使用将元素置于相同顺序的成本。当然,这忽略了缺失元素的插入。
一个简单的解决方案是插入排序:
6,3 move 3 1 ahead => cost 1.
3,6,4 move 4 1 ahead => cost 1+1.
3,4,6,2 move 2 3 ahead => cost 1+1+3.
2,3,4,6,5 move 5 1 ahead => cost 1+1+3+1.
2,3,4,5,6,8 correct => cost 1+1+3+1.
2,3,4,5,6,8,7 move 7 1 ahead => cost 1+1+3+1+1.
2,3,4,5,6,7,8,10 correct => cost 1+1+3+1+1.
2,3,4,5,6,7,8,10,9 move 9 1 ahead => cost 1+1+3+1+1+1=8.
算法复杂度为。O(n2)
一种更有效的方法是使用关联映射预先计算每个元素的所需位置并计算距离。结果将与上述略有不同。
mapB={0: 2, 1: 3, ...}
cost( 6)=abs(4-0)=4
cost( 3)=abs(1-1)=0
cost( 4)=abs(2-2)=0
cost( 2)=abs(0-3)=3
cost( 5)=abs(3-4)=1
cost( 8)=abs(6-5)=1
cost( 7)=abs(5-6)=1
cost(10)=abs(8-7)=1
cost( 9)=abs(7-8)=1
total=12
使用有序映射(树),忽略旋转,将给出。使用哈希表,忽略冲突,将给出。O(2nlog(n))=O(nlog(n))O(2n)=O(n)
现在,我们必须处理缺失元素的插入。第二种算法允许我们计算存在于第二个序列中但不存在于第一个序列中的元素 ( seq2only)。如果我们消除/标记我们在第一个序列中遇到的元素,我们可以很容易地计算出第一个序列中存在的元素,但第二个序列中没有(seq1only)。对那些人的惩罚是insertioncost*(seq2only+seq1only)。