我有一个数组形式的有序序列。例如
original_order = [1,2,3,4,5,6,7,8,9,10]
我想知道如何以最大的顺序对原始顺序重新排序。具体来说,我想知道在运行以下代码时,什么顺序会给出最大“分数”:
简而言之,当与 original_order 序列中的位置进行比较时,以下计算序列中的每个值在重新排列的序列(称为重新排列的数组)中“移动”的距离。然后,它将每个值的差异(移动的距离)相加,以给出重新排列的“顺序差异”的总体得分。有人告诉我,我计算的这个“分数”可以定义为两个序列之间的序数相似度(原始顺序和重新排列)。
我认为可以通过将重新排列的顺序作为反转的原始顺序运行代码来获得最高分数。我还没有找到比这更高的分数的重新排列方法,但如果有人认为我错了,请告诉我(对于上面的示例 original_order,这将是 max_score = 50)。我认为没有其他序列顺序的重新排列可以给出更高的分数(尽管有其他顺序给出相同的分数)。
position = original_order.map{|x| rearranged.index(x)} #works out the index of original_order values in rearranged
index_values = Array(0..(original_order.length - 1)) # array of index values for original_order
both = []
both << position
both << index_values
difference = both.transpose.map {|x| x.reduce(:-)} # taking away old position from new position, to find the distance that the value has "moved" when re-ordered
difference_abs = []
difference.each do |i|
difference_abs << i.abs
end
score = difference_abs.inject(:+)
我想知道的是:
如果我的假设是正确的,即无论序列数组的长度如何,颠倒的顺序总是会给出最高的分数
对我的代码的作用的数学解释,以及为什么简单地颠倒原始顺序会给出最高分
如果序数相似性是定义我的分数指标的准确方法,如果不是,什么是?
此外,欢迎任何有关简化我的代码的提示。