2011-09-24 39 views
5

可能重複:
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)。有沒有更高效的方法?

感謝

+6

如果這些值是整數並且在某個固定範圍內,則可以使用基數排序在O(n)時間內進行排序。 – templatetypedef

回答

3

我認爲排序和比較將是你最好的選擇。例如:

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 
+0

Soooo ...這裏的複雜性是什麼,你認爲它可以變得更好嗎(比O(nlogn))?這是OP的問題 – sehe

相關問題