2011-09-24 20 views
5

Olası Çoğalt:
Is it possible to find two numbers whose difference is minimum in O(n) timeBir dizide sayı çiftleri arasındaki minimum farkı bulmak için en hızlı algoritma nedir?

Örneğin

, [4, 2, 7, 11, 8] yılında, algoritma abs(7-8) = 1 dönmelidir.

Kaba kuvvet yolu O (n) olacak ve sıralama O (nlogn) verecektir. Daha verimli bir yolu var mı?

Teşekkür

+6

Değerler tamsayıysa ve bazı sabit aralıklarda ise, sıralamayı O (n) zamanında yapmak için bir yarıçap sıralaması kullanabilirsiniz. – templatetypedef

cevap

3

Sanırım sıralama ve karşılaştırma en iyi bahis olacak. Şunlar gibi:

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 ... buradaki karmaşıklık nedir ve daha iyi olabileceğini düşünüyor musunuz (O (nlogn) 'dan)? OP'nin sorusu budur – sehe

İlgili konular