背景
我正在实现一种心理测试,用户需要选择他们喜欢的一组图片中哪一个更好。他们可以通过按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的时间,我的意思是通过按下错误的键而没有输入他们的真实偏好),根据以下标准,排序似乎表现良好:
- 输出结果与用户偏好(模拟)足够接近。
- 算法停止的时间很好。对于10个项目的列表,大约需要20个步骤。
我想知道的是,算法专家是否能告诉我这个算法有没有完全失败的可能性,无论是停止还是逼近输入解决方案。
parseInt
。请改用Math.floor
。 - Bergi