2011-09-24 4 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

관련 문제