Алгоритм Кадане не возвращает правильное значение для наибольшей суммы подряд? - PullRequest
0 голосов
/ 25 августа 2018

Попытка использовать алгоритм Кадане, как описано здесь: https://www.youtube.com/watch?v=OexQs_cYgAQ&t=721s

В этом массиве чисел: [-5, 10, 2, -3, 5, 8, -20].

Ответ 10 + 2 – 3 + 5 + 8 = 22


Однако, когда я запускаю следующий код, я получаю это:

sumArray = [ 0, 20, 24, 24, 28, 44, 44 ]

Понятия не имею, как туда попадают номера 24 и выше :( и 22 отсутствует.

Код ниже:

const myArray = [-5, 10, 2, -3, 5, 8, -20];

const findMaxConsecutiveSum = (arr) => {
  const sumArray = [];
  let max_so_far = 0;
  let max_ending_here = 0;

  for (let i = 0; i < arr.length; i++) {
    max_ending_here = max_ending_here + arr[i];
    // console.log('position:', i, arr[i]);
    // console.log(max_ending_here = max_ending_here + arr[i]);
    // console.log('max_ending_here', max_ending_here);

    if (max_ending_here < 0) {
      max_ending_here = 0;
    }
    else if (max_so_far < max_ending_here) {
      max_so_far = max_ending_here;
    }

    // console.log('max_so_far', max_so_far);
    sumArray.push(max_so_far);
  }

  return sumArray;
}

console.log(findMaxConsecutiveSum(myArray));

Идея в том, чтобы я просто заполнил sumArray, а затем отфильтровал его по наибольшему числу. Однако я не получаю 22 и вместо тонны больших чисел?

Есть идеи почему?

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Как я понимаю алгоритм Кадане (из этого Википедии поста), способ его реализации выглядит примерно так:

const myArray = [-5, 10, 2, -3, 5, 8, -20];
console.log(myArray.reduce((t, v) => { t.here = Math.max(v, v + t.here);
                                       t.max = Math.max(t.max, t.here); 
                                       return t; },
                           { here : 0, max : 0})['max']);
0 голосов
/ 25 августа 2018

Вы делаете реализацию намного более сложной, чем она должна быть.Из сообщения о алгоритме Кадане код должен выглядеть примерно так:

def max_subarray(A):
    max_ending_here = max_so_far = A[0]
    for x in A[1:]:
        max_ending_here = max(x, max_ending_here + x)
        max_so_far = max(max_so_far, max_ending_here)
    return max_so_far

Алгоритм, как указано здесь, требует, чтобы одиночное число было возвращено,не массив.В переводе на JS это будет выглядеть так:

const myArray = [-5, 10, 2, -3, 5, 8, -20];
const findMaxConsecutiveSum = (arr) => {
  let max_so_far = 0;
  let max_ending_here = 0;
  for (let i = 0; i < arr.length; i++) {
    max_ending_here = Math.max(arr[i], max_ending_here + arr[i]);
    max_so_far = Math.max(max_so_far, max_ending_here)
  }
  return max_so_far;
}
console.log(findMaxConsecutiveSum(myArray));

Обратите внимание, что переназначение max_ending_here требует вызова Math.max на arr[i] и max_ending_here + arr[i].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...