编辑:哇,很多很棒的回应。是的,我使用它作为适应度函数来判断遗传算法执行的排序的质量。因此,评估成本很重要(即,它必须快速,最好是O(n)
。)
作为我正在玩弄的 AI 应用程序的一部分,我希望能够根据其单调性(也称为“排序性”)对候选整数数组进行评分。目前,我正在使用一种计算最长排序运行的启发式算法,然后将其除以数组的长度:
public double monotonicity(int[] array) {
if (array.length == 0) return 1d;
int longestRun = longestSortedRun(array);
return (double) longestRun / (double) array.length;
}
public int longestSortedRun(int[] array) {
if (array.length == 0) return 0;
int longestRun = 1;
int currentRun = 1;
for (int i = 1; i < array.length; i++) {
if (array[i] >= array[i - 1]) {
currentRun++;
} else {
currentRun = 1;
}
if (currentRun > longestRun) longestRun = currentRun;
}
return longestRun;
}
这是一个好的开始,但它没有考虑到排序子序列可能存在“团块”的可能性。例如:
{ 4, 5, 6, 0, 1, 2, 3, 7, 8, 9}
这个数组被分成三个排序的子序列。我的算法将它评为只有 40% 的排序,但直观地说,它应该得到比这更高的分数。这种事情有标准算法吗?