Problemas de velocidad funcion O (n) подставляет несдвиг ()

Estaba haciendo un problema que dado una entrada de un arreglo arr последующее поколение regresar la suma acumulada de sus elementos en los indices... Es esto:

Вход: arr= [0, 1, 3, 6, 10]

Ouput: arr = [ 20, 20, 19, 16, 10, 0]

porque:

ls = [0, 1, 3, 6, 10] *20

ls = [1, 3, 6, 10] *20

ls = [3, 6, 10] *19

ls = [6, 10] *16

ls = [10] *10

ls = [] *0

Окись церия Como sabia que el tiempo de ejecución важный pensé en una solución O (n) iterando довод "против" for() mas rapido параграф estos casos que forEach() map() for of esta fue ми primera solucion

function partSums(ls) {
    let resp = [0]
    let suma = 0
    let len= ls.length - 1;
    for (let i = len; i >= 0; i--) {
        suma += ls[i]
        resp.unshift(suma)
    }
    return resp
}

console.log(partSums([0, 1, 3, 6, 10]))
console.log(partSums([ 20, 19, 16, 10, 0 ]))

Pense que mas rápido que esto никакой encontraría una forma y que no tendria problemas... не грешит, не накладывает эмбарго ни на какой paso el test de velocidad.. De casualidad probando funciones hice esta y параграф sorpresa фаза el тестируют de velocidad...

function partSums(ls) {
    let arr = [0];
    ls.reverse().forEach(v => arr.push(arr[arr.length - 1] + v));
    return arr.reverse();
}

console.log(partSums([0, 1, 3, 6, 10]))
console.log(partSums([11, 1, 3, 6, 10,14,32,1,3]))
console.log(partSums([11, 1, 3, 0, 1, 3, 6, 10, 6, 10,14,32,1,3]))

digo sorpresa porque ми параграфа hacer reverse() 2 недостатка y utilizando forEach() параграф iterar (mas que el ленто for()) окись церия ya suficiente параграф никакой pasar Лос тест... pero эра significativamente mas rapida esta funcion... довод "против" otra cosa rara es que esta misma función map() es casi la mitad mas Лента que forEach() cosa que aun не я queda clara...

Comparando estas funciones saque заключение Комо que el problema estaba en el unshift()!!!

function partsSums(ls) {
    let resp = [0]
    let acum = 0
    let len= ls.length - 1
    for (let i = len; i >= 0; i--) {
        acum += ls[i]
        resp.push(acum)
    }
    return resp.reverse()
}

console.log(partsSums([0, 1, 3, 6, 10]));

Ми Entonces pregunta es Комо es возможный que el unshift() морской танто mas costoso en tiempo que el push()... que el reverse() (лента que para mi q hacer алгоритм подобный al for() индексы cambiando), море загорают rapido.. y Комо es возможный tambien que el forEach () море casi загорают rapido Комо el for() y mas que el map()?

3
задан 11.11.2019, 12:30
1 ответ

Изначально я gustarГ - в seГ±alar, что podrГ-схвати, Гєltimo reverse уберегитесь, если бы вместо того, чтобы делать push, ты добавлял результаты в resp[i]

Пример:

function partsSums(ls) {
    let acum = 0,
      resp = [];
    for (let i = ls.length - 1; i >= 0; i--) resp[i] = acum += ls[i];
    resp[ls.length] = 0;
    return resp;
}

console.log(partsSums([0, 1, 3, 6, 10]));

Сейчас в ответе в:

Тогда мой вопрос такой, как возможно, что unshift () настолько дороже во время, что push ()...

, Если мы имеем в виду, что unshift(value) значит добавлять элемент в начале договоренности, а именно, что все элементы заблаговременно совокупные должны быть нечеткими от n до n+1, тогда имеет смысл, что было mГЎs медленный делать unshift, что push ( добавлять в конце концов )

И в ответе в:

cГіmo возможно tambiГ©n, что forEach () почти rГЎpido как for () и mГЎs так, что map ()?

Это зависит ее implementaciГіn каждый mГ©todo в каждом браузере.
Например, map, если мы смотрим Ваш polyfill podrГ-хозяев говорить, что он более медленный, чем один for, благодаря тому, что в этом:

  • санкционирует тип информации
  • санкционируется, что они parГЎmetros они были ожидаемого типа
  • , создается аккумулятор ( я упорядочиваю результата )
  • и из-за каждого элемента выполняет одна funciГіn ( callback )
4
ответ дан 01.12.2019, 12:13
  • 1
    Большое спасибо Рамы. и оптимальная функция... больше другая редкая вещь состоит в том, что метод с push еще более быстрый, что он был., он будет из-за моего браузера и тест, который я вижу, они состоят из огромной договоренности с числами pequeñ вы – RazerJs 11.11.2019, 10:48
  • 2
    @IsraelGonzá lez, не как дела делая твои доказательства. Я оставляю тебе этот простой тест для того, чтобы ты смог видеть có mo в различных браузерах ты будешь получать различные результаты. В моих доказательствах Firefox 100 % раз оказались má s rá попросите мой implementació n . – Marcos 11.11.2019, 12:09
  • 3
    У тебя есть весь разум... страница - та, которая делает тест скорости из-за меня codewars.com/kata/sums-of-parts/train/javascript , я вновь подтверждал и для первого ~Completed in 1937ms для твоей ~Completed in 3230ms. ничто не должно быть какими-то из теста специфические и мой браузер (я использую Chrome и не эх provado в других) спасибо снова Рамы – RazerJs 11.11.2019, 12:28

Теги

Похожие вопросы