Нечеткий алгоритм сортировки устойчивость слияния


Контекст

Я использую психологический тест, в котором пользователю предъявляются пары изображений, которые он должен указать, какие они предпочитают. Они отвечают на свои предпочтения с помощью клавиши A или L. Если количество изображений достаточно велико, то сравнение всех возможных пар довольно требовательно к индивиду (O (n^2)).

Вопрос

Я взломал алгоритм сортировки слиянием здесь, чтобы резко сократить число сравнений. В результате получается следующее:

function mergeSort(arr)
{
    if (arr.length < 2)
        return arr;

    var middle = parseInt(arr.length / 2);
    var left   = arr.slice(0, middle);
    var right  = arr.slice(middle, arr.length);

    return merge(mergeSort(left), mergeSort(right));
}


function merge(left, right)
{
    var result = [];

    while (left.length && right.length) {
        if (getUserPreference(left[0],right[0])) {
            result.push(left.shift());
        } else {
            result.push(right.shift());
        }
    }

    while (left.length)
        result.push(left.shift());

    while (right.length)
        result.push(right.shift());

    return result;
}

, где функция getUserPreference делегируется пользователю. Я провел несколько симуляций (где ответ может случайно быть "неправильным" ~1/3 времени, и под "неправильным" я имею в виду не вводить свои истинные предпочтения, нажимая неправильную клавишу), и сортировка, кажется, работает хорошо в соответствии со следующими критериями:

  • выходные результаты достаточно близки к пользовательским предпочтениям (моделируются).
  • алгоритм останавливается вовремя. ~20 шагов для списка из 10 предметы.

Что я хотел бы знать, может ли алгоритм whizzkids там сказать мне, есть ли какой-либо шанс, что этот алгоритм полностью не остановит или не приблизит входные решения.

1 4

1 ответ:

Есть ли шанс, что этот алгоритм полностью не остановится?

Нет. Алгоритм всегда останавливается, независимо от того, насколько плохи/неправильны/неудачны сравнения.

Алгоритм останавливается вовремя. ~20 шагов для списка из 10 пунктов.

Для 10 пунктов наилучший вариант-15 сравнений, худший-25 сравнений. В общем случае сортировка слиянием занимает в среднем O(n log n) шагов.

Есть ли шанс, что это алгоритм полностью не сможет аппроксимировать входные решения

Это во многом зависит от вашего определения "достаточно близко к пользовательским предпочтениям". И, вероятно, важной ошибкой было бы предположить, что предпочтения пользователей вообще являются транзитивными отношениями.