2017-02-16 12 views
1

Я хочу помочь в оптимизации решения проблемы, я уже разобраться в проблеме, но мой код не достаточно хорош для обработки больших массивов - codeWars : Sum of Pairs - problemОптимизация решение Суммы пара: Codewars

Вот мой код -

var sum_pairs=function(e, sum){ 

var result=null; 
var arrLen=e.length; 
for(let i=0;i<arrLen-1;i++){ 
    let nextIndex=e.slice(i+1,arrLen).indexOf(sum-e[i]); 
    if(nextIndex>=0){ 
    result=[e[i],e[nextIndex+1+i]]; 
    arrLen=nextIndex+1+i; 
    } 
} 
return result; 
} 

Ну, я знаю, что это нехорошее решение. Во всяком случае, это проходит все тестовые примеры, но не удается, когда он сталкивается с большим массивом. Result On codewars

Я хочу знать, как оптимизировать этот код, а также Изучить любую технику написания хорошего кода.

+0

Вот ссылка - https://www.codewars.com/kata/sum-of-pairs/train/javascript –

+0

('Вот link' - заменить ссылку на картинку в вопросе с этим (_train/ _ часть или нет).) Проблема не определена: что такое определение _order внешнего вида_, когда есть пара _earlier_? Если это был первый индекс first_, вам просто нужно знать, существует ли значение в другом индексе, который суммируется с данной суммой. Если это самая низкая сумма индексов, с наименьшим индексом для разрыва связей, вам нужно получить умнее ... (Обратите внимание, что вы можете ответить на свой вопрос.) – greybeard

+0

'Я хочу знать, как оптимизировать этот код' - не - алгоритм не справляется с обработкой значительных массивов. 'Я хочу [... узнать] любую технику [для написания] хорошего кода. Вы начали с самой простой вещи, которая могла бы работать: хорошо. Вы считаете, что каждый индекс как возможный первый индекс - выглядит неизбежным. В настоящее время игнорируется сложность ECMAScript 'slice': сколько усилий каждый _membership query_ использует' indexOf (sum-e [i]) '? Общее усилие? Каков требуемый результат и что делает ваш 'sum_pairs' после того, как найдена соответствующая пара? (Представьте себе массив из 10 000 000 нулей, сумма 0) – greybeard

ответ

1

Одним из решений является использование структуры данных Set для запоминания номеров, все готовые итерации. Затем мы можем проверить каждый элемент, если было число, которое суммируется до s. Набор имеет среднюю постоянную временную сложность для вставки и поиска, делая алгоритм линейным по времени (и пространству).

var sum_pairs=function(ints, s){ 
    if (ints.length < 2) return undefined; //not enough numbers for pair. 
    let intSet = new Set() 
    intSet.add(ints[0]); 
    for (let i=1; i < ints.length; ++i){ 
    let needed = s-ints[i]; 
    if (intSet.has(needed)){//check if we have already seen the number needed to complete the pair. 
     return [needed,ints[i]]; 
    } 
    intSet.add(ints[i]);//if not insert the number in set and continue. 
    } 
    return undefined;//No answer found 
} 
+0

Что это возвращает для третьего примера: 'sum_pairs ([10, 5, 2, 3, 7, 5], 10)'? – greybeard

+0

Выполняет все тесты на codeWars, поэтому я предполагаю '[3,7]'. –

+0

Awesome, используя 'set' - отличная идея, спасибо :). –

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

  • Нет связанных вопросов^_^