可能重複:
Is it possible to find two numbers whose difference is minimum in O(n) time什麼是最快的算法來找到數組中的成對數之間的最小差異?
例如,在[4, 2, 7, 11, 8]
,該算法應該返回abs(7-8) = 1
。
蠻力的方式將是O(n )和排序將給O(nlogn)。有沒有更高效的方法?
感謝
可能重複:
Is it possible to find two numbers whose difference is minimum in O(n) time什麼是最快的算法來找到數組中的成對數之間的最小差異?
例如,在[4, 2, 7, 11, 8]
,該算法應該返回abs(7-8) = 1
。
蠻力的方式將是O(n )和排序將給O(nlogn)。有沒有更高效的方法?
感謝
我認爲排序和比較將是你最好的選擇。例如:
function minDiff(arr) {
var min,
temp,
initDiff = false,
arr = arr.sort(function(a, b){return a-b}),
last = arr.length - 1,
i;
for (i = 0; i < last; i++) {
if (!initDiff) {
min = arr[i + 1] - arr[i];
initDiff = true;
} else {
temp = arr[i + 1] - arr[i];
if (temp < min) {
min = temp;
}
}
}
return min;
}
var myArr = [ 1, 8, 5, 96, 20, 47 ],
min = minDiff(myArr);
console.log(min); // 3
Soooo ...這裏的複雜性是什麼,你認爲它可以變得更好嗎(比O(nlogn))?這是OP的問題 – sehe
類似的問題在這裏 - Is it possible to find two numbers whose difference is minimum in O(n) time。它似乎是O(nlogn)。
此頁面也可能會給useful背景信息。
答案是如此糟糕:(元素唯一性是癌症,散列散列散列!) –
嗯,好的,爲什麼元素唯一性是癌症? – Coffee
如果這些值是整數並且在某個固定範圍內,則可以使用基數排序在O(n)時間內進行排序。 – templatetypedef