我正在实施心理测试,向用户呈现成对图像,以指示他们喜欢哪些图像。他们用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;我的意思是不通过按错键来输入他们的真实偏好)并且排序看起来表现良好,符合以下标准:
我想知道的是,如果算法突然出现,可以告诉我这个算法是否有可能完全无法停止或近似输入解决方案。
答案 0 :(得分:3)
这个算法有可能完全无法停止吗?
没有。无论比较多么糟糕/错误/不幸,算法总是停止。
算法及时停止。 ~20个步骤列出10个项目。
对于10个项目,最好的情况是15个比较,最坏的情况是25个比较。通常,merge sort平均O(n log n)
步。
该算法是否有可能完全无法逼近输入解决方案
这很大程度上取决于您对“足够接近用户偏好”的定义。可能一个重要的错误就是假设用户偏好完全是一种传递关系。