2014-11-30 2 views
5

Я хочу перебирать массив и найти все пары, где их разность 2Другой способ получить все комбинации целых чисел массива Javascript

Это то, что я до сих пор:

var numberOfCases = 5; 
var diff = 2; 

var input = [1,5,3,4,2]; 

getPossiblepairs(input); 

function getPossiblepairs(input){ 
    for(cmp in input){ 
     for(number in input){ 
      if((input[cmp] - input[number]) == diff){ 
       console.log("("+input[cmp]+","+input[number]+")"); 
      } 
     } 

    } 
} 

Этот работает, но я все еще чувствую себя виноватым, используя два для петель, поскольку bigO O (n^2) Это единственный способ сделать это?

+0

Там могут быть алгоритмы вы можете сделайте, чтобы поправиться, если вы действительно знаете распределение чисел (здесь они представляют собой последовательную серию, хотя и не в порядке). Но всего за 5 записей, так что 25 итераций O (5^2), вы действительно хотите сделать его более эффективным? – deitch

+0

Я изменил формулировку, чтобы попросить другие методы, поскольку «лучший способ» будет закрыт, в первую очередь, на основе мнения. – Scimonster

+2

Сортировка списка, где O (N) log n. Тот, который имеет разность двух от текущего, является либо следующим элементом, либо после него. Это проверка O (1). Проверка всех из них - O (N). Таким образом, общий O (N log N) –

ответ

6

Вы можете сделать это в O (n log n). Сортируйте массив, затем пройдите через него за один проход. Найдите разницу между текущим элементом и каждым из следующих двух, распечатав пару, если каждый отличается на 2.

+1

что он сказал. избили меня на минуту – Andras

+0

@Doug Я сейчас пытаюсь реализовать ваше решение, но разве разница между каждыми ближайшими двумя элементами всегда останется 1? – ipalibowhyte

+1

Привет @ Pizzy213 коды, с вашим примером, после фазы сортировки будет [1, 2, 3, 4, 5]. Первым шагом является сравнение 1 - 2 и 1 - 3. В первом случае разница равна 1, 2 - во втором. Если бы были какие-то непоследовательные числа, такие как [1, 5, 7, 22], то различия будут больше. Я предполагаю, что вы это поняли! –

3

У вас есть память для копии массива? Сначала отсортируйте его, O (n log n), затем выделите пары в одном проходе O (n).

4

Это должно работать с п лог п сложности:

function getPossiblepairs(input, diff){ 
    // Create a copy of the original array, so it is not affected by the next operation 
    var sortedInput = input.slice(); 
    // Sort the array 
    sortedInput.sort(); 
    // Iterate through the array, starting from the 0th element 
    for (var i=0, n=sortedInput.length; i<n; i++){ 
     firstNumber = sortedInput[i]; 
     // Iterate through the array, starting from the (i+1)th element 
     for (var j=i+1; j<n && sortedInput[j] <= firstNumber + diff; j++){ 
      secondNumber = sortedInput[j]; 
      // if it matches, then log it! 
      if (secondNumber - firstNumber == diff){ 
       console.log('(' + firstNumber + ', ' + secondNumber + ')'); 
      } 
     } 
    } 
} 

См this post для получения дополнительной информации о дублировании массива.

Для использования и тестирования, см: http://jsfiddle.net/gycjup5u/2/

+0

Это заказ n^2. И хуже, чем оригинал во время выполнения (это сравнение длины^2, как и оригинал, но тоже похоже) –

+0

Да, моя (исправленная) опечатка была полностью стоит «-1». –

+0

Это все еще n^2. Итак, да, это было –

2

Вы можете использовать indexOf() метод для каждого элемента, чтобы определить, если массив содержит элемент больше, чем по diff:

function getPossiblePairs(input, diff) { 
    for(i in input) { 
     var n = input.indexOf(input[i] + diff); 
     if(n != -1) { 
      console.log("(" + input[i] + "," + input[n] + ")"); 
     } 
    } 
} 

getPossiblePairs(input, diff); 
+2

Который из конечно, O (N^2). Таким образом, OP все равно будет чувствовать себя виноватым :) –

+0

@Paul да, это моя ошибка, не заметил запроса оптимизации, просто подумал о другом способе этого. – akarilimano

Смежные вопросы