mejorar velocidad de O (n^2) en для anidado para búsqueda de combinaciones

Estaba haciendo este problema que consiste en dadas unas entradas de un arreglo de enteros y un numero n.. encontrar todos Лос сокращает de elementos en el arreglo que sumados sean iguales, различный n y de existir сокращает elegir el par mas cercano а-ля izquierda... Ej:

прибытие = [10, 5, 2, 3, 7, 5], n=10

       ^--------^ [5,5] 5+5=10
           ^--^   [3,7] 3+7=10 *mas cercano a la izquierda

reultado = [3,7]

Uno Este es жабы de los ejemplos mas simples de usos de for anidado para probar las combinaciones de dos elementos en un arreglo (busqueda binaria)... Ми Esta es solución...

var sum_pairs = function (ints, s) {
    let min = Number.MAX_SAFE_INTEGER;
    let resp = []
    for (let i = 0; i < ints.length - 1; i++)
        for (let j = i + 1; j < ints.length; j++)
            if ((ints[i] + ints[j] == s) && (j < min)) {
                resp.push([ints[i], ints[j]]), min = j;
            }
    return (resp.length == 1) ? resp[0] : (resp.length > 1) ? resp[resp.length - 1] : undefined
}


console.log(sum_pairs([10, 5, 2, 3, 7, 5], 10));
console.log(sum_pairs([4, 3, 2, 3, 4], 6));

жабы recorre el arreglo buscando las combinaciones del primer numero, СИ suman n y su segundo numero (j) esta mas а-ля izquierda del min lo añade al arreglo resp[]... si encuentra una sola solución retorna resp[] китайский y existen различный сокращает regresa el ultimo elemento en resp[](que por ende estaba mas а-ля izquierda)... китайский encuentra ningún паритет regresa неопределенный... эра hace lo que pide el problema y mas compleja, la fui resumiendo porque никакой pasaba Лос тест de velocidad.. pero aun es O (n^2)... я gustaría сабля Комо mejorar su complejidad o Комо hacer una solución mas rápida para este tipo de problemas...

3
задан 04.11.2019, 15:48
1 ответ

Главная проблема первого решения с (for укрытый); происходи, когда должны искаться пары в очень большой договоренности..., так как, таким образом, мы ищем все комбинации первого элемента, потом комбинации второго элемента, третьего элемента..., и ты не можешь останавливаться, найдя первую пару, так как он существует, другое условие, которого ты должен возвращать пару, самую близкую к левой стороне..., там бьет козырем тест скорости. Достаточно простая форма состоит в том, чтобы использовать технику предыдущего ответа jacknavarow вместе с memoisation.

let sum_pairsUp = (a, n) => {
    let memoisation = {}
    for (x of a) {
        if (memoisation[n - x])
            return [n - x, x]
        else
            memoisation[x] = 1
    }
}

console.log(sum_pairsUp([12, 4, 1,2,34,12,2,6,2,8,36, 7, 3, 15], 10));
console.log(sum_pairsUp([1, 4, 1, 7, 3, 15], 2)); //para repetidos
console.log(sum_pairsUp([1, 4, 1, 7, 3, 15], 25));
1
ответ дан 01.12.2019, 14:38