EDIT: Ничего себе, много больших ответов. Да, я использую это как функцию пригодности для оценки качества сортировки, выполняемой генетическим алгоритмом. Таким образом, в стоимости оценки является важным (то есть, он должен быть быстрым, предпочтительно O(n)
.)Алгоритм рейтинга монотонности массива (то есть, судя по «sortedness» массив)
В рамках приложения 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% отсортировано, но интуитивно, он должен получить более высокий балл, чем это. Есть ли стандартный алгоритм для такого рода вещей?
Даже если это в контексте программирования, вы можете спросить об этом на mathoverflow.com ... они могут быть лучше подходят для предоставления полезного ответа. –
Это поможет, если вы дадите нам более подробную информацию о том, какие решения ваше приложение AI будет делать на основе «сортировки» –
@ Майкл Брей: это действительно http://mathoverflow.net/. Странно, mathoverflow.com разрешает один и тот же IP-адрес, но он здесь не работает. –