模糊排序算法融合稳定性

时间:2016-10-25 15:22:29

标签: javascript algorithm sorting mergesort stability

上下文

我正在实施心理测试,向用户呈现成对图像,以指示他们喜欢哪些图像。他们用A或L键回应他们的偏好。如果图像的数量非常大,那么比较所有可能的对对个体来说要求很高(O(n ^ 2))。

问题

我已经破解了合并排序算法here,以大幅减少比较次数。结果如下:

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委托给用户。我已经进行了多次模拟(其中响应可能意外地是&#34;错误&#34; ~1 / 3的时间,并且#34;错误&#34;我的意思是不通过按错键来输入他们的真实偏好)并且排序看起来表现良好,符合以下标准:

  • 输出结果足够接近用户偏好(模拟)。
  • 算法及时停止。 ~20个步骤列出10个项目。

我想知道的是,如果算法突然出现,可以告诉我这个算法是否有可能完全无法停止或近似输入解决方案。

1 个答案:

答案 0 :(得分:3)

  

这个算法有可能完全无法停止吗?

没有。无论比较多么糟糕/错误/不幸,算法总是停止。

  

算法及时停止。 ~20个步骤列出10个项目。

对于10个项目,最好的情况是15个比较,最坏的情况是25个比较。通常,merge sort平均O(n log n)步。

  

该算法是否有可能完全无法逼近输入解决方案

这很大程度上取决于您对“足够接近用户偏好”的定义。可能一个重要的错误就是假设用户偏好完全是一种传递关系。