考虑任何给定的唯一整数的数组,例如[1,3,2,4,6,5]
如何判断
“排序”的级别,范围从0.0到1.0?
答案 0 :(得分:4)
一种方法是评估必须移动以使其排序的项目数量,然后将其除以项目总数。
作为第一种方法,我会将前者检测为转换从较高值到较低值的次数。在您的列表中,那将是:
3 -> 2
6 -> 5
总共两个动作。将它除以6个元素可以得到33%。
在某种程度上,这是有道理的,因为您可以简单地将2
移动到1
和3
之间,将5
移动到4
之间6
。
现在可能存在边缘情况,其中以不同的方式移动事物会更有效但是您可能不得不编写非常复杂的搜索算法以找到最佳解决方案。
就个人而言,我会从最简单的选项开始,它会给你你想要的东西,如果事实证明是不合适的话,那就麻烦了。
答案 1 :(得分:1)
我认为掉期数量不是确定这一点的好方法。最重要的是因为您可以使用不同数量的交换对数组进行排序。在您的情况下,您可以切换2< - > 3和6< - > 5,但您也可以执行更多切换。
你怎么排序,说:
1 4 3 2 5
你会直接切换2和4,还是会切换3和4,然后是4和2,然后是3和2。
我想说一个更正确的方法是正确位置的元素数量除以元素总数。
在你的情况下,那将是2/6。
答案 2 :(得分:1)
我将提出一种不同的方法:让我们计算数组中非降序序列 k 的数量,然后取其反转: 1 / k 。对于完美排序的数组,只有一个这样的序列, 1 / k = 1/1 = 1 。当数组按降序排序时,此“未排序”级别最低。
当数组大小接近无穷大时,0级仅接近渐近逼近。
这个简单的方法可以在 O(n)时间内计算。
答案 3 :(得分:1)
您可以为每个项目总计到其排序位置的距离,并除以最大值。
public static <T extends Comparable<T>> double sortedMeasure(final T[] items) {
int n = items.length;
// Find the sorted positions
Integer[] sorted = new Integer[n];
for (int i = 0; i < n; i++) {
sorted[i] = i;
}
Arrays.sort(sorted, new Comparator<Integer>() {
public int compare(Integer i1, Integer i2) {
T o1 = items[i1];
T o2 = items[i2];
return o1.compareTo(o2);
}
public boolean equals(Object other) {
return this == other;
}
});
// Sum up the distances
int sum = 0;
for (int i = 0; i < n; i++) {
sum += Math.abs(sorted[i] - i);
}
// Calculate the maximum
int maximum = n*n/2;
// Return the ratio
return (double) sum / maximum;
}
示例:
sortedMeasure(new Integer[] {1, 2, 3, 4, 5}) // -> 0.000
sortedMeasure(new Integer[] {1, 5, 2, 4, 3}) // -> 0.500
sortedMeasure(new Integer[] {5, 1, 4, 2, 3}) // -> 0.833
sortedMeasure(new Integer[] {5, 4, 3, 2, 1}) // -> 1.000
答案 4 :(得分:1)
在实践中,人们可以通过分类所需的工作量来衡量未分类。这取决于你认为“工作”的东西。如果只允许交换,您可以计算所需的交换数量。它有一个很好的上限(n-1)。对于mergesort类型的视图,您最感兴趣的是运行次数,因为您需要有关log(nrun)合并步骤。从统计学上讲,你可能会把“sum(abs((rank - intention_rank))”作为一种衡量标准,类似于KS测试。但在视力方面,像“HABCDEFG”(7次掉期,2次跑步,次级距离)和“HGFEDCBA”这样的序列“(4个交换,8次运行,最大距离)总是显示出来。
答案 5 :(得分:0)
排序的一个相关度量将是“需要排序的排列数”。在您的情况下,将是2,切换3,2和6,5。然后仍然如何将其映射到[0,1]。您可以计算数组长度所需的最大排列数,某种“最大未排序”,它应该产生排序值0.然后获取实际数组的排列数,从最大值中减去它除以最大值
答案 6 :(得分:0)
好的,这只是一个想法,但如果您可以对数组进行排序,即
1,2,3,4,5,6
然后将其作为字符串
123456
现在以字符串
获取原始数组132465
并比较两者之间的Levenshtein distance