获得数组Javascript的所有整数组合的另一种方法

时间:2014-11-30 09:02:22

标签: javascript arrays performance time-complexity

我想迭代一个数组,找到差异为2的所有对

这是我到目前为止所做的:

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]+")");
            }
        }

    }
}

这样可行,但我仍然感到内疚,使用两个for循环,因为bigO是 O(n ^ 2)这是唯一的方法吗?

4 个答案:

答案 0 :(得分:6)

您可以在 O(n log n)中执行此操作。对数组进行排序,然后一次性完成。找出当前元素与下两个元素之间的差异,如果一个元素相差2,则打印出该元素。

答案 1 :(得分:4)

这应该与 n log n 复杂性一起使用:

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/

答案 2 :(得分:3)

你有内存的数据副本吗?首先对它进行排序,O(n log n),然后在单个O(n)传递中挑选出对。

答案 3 :(得分: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);