tengo la siguiente implementación de Kadane's algorithm para resolver el problema de la subserie máximo de una matriz:de kadane encontrar subarreglo con la suma máxima
public static decimal FindBestSubsequence
(this IEnumerable<decimal> source, out int startIndex, out int endIndex)
{
decimal result = decimal.MinValue;
decimal sum = 0;
int tempStart = 0;
List<decimal> tempList = new List<decimal>(source);
startIndex = 0;
endIndex = 0;
for (int index = 0; index < tempList.Count; index++)
{
sum += tempList[index];
if ((sum > result) ||
(sum == result && (endIndex - startIndex) < (index - tempStart)))
{
result = sum;
startIndex = tempStart;
endIndex = index;
}
else if (sum < 0)
{
sum = 0;
tempStart = index + 1;
}
}
return result;
}
se produce un error cuando se utiliza una secuencia que comienza con un negativo número como -1, 2, 3
dando un resultado de 4, [0,2]
en lugar de 5, [1,2]
.
Por la vida de mí que no puedo encontrar dónde está el error. Tal vez es un defecto en el diseño del algoritmo?
Gracias de antemano.
Perfecto. Acabo de tomar una implementación ya existente en C que parecía estándar y la porté a C#. El tuyo pasa todas las pruebas de mi unidad, así que creo que es la mejor opción. ¡Gracias! –
Además, si lo está refabricando, iteraría el IEnumerable directamente, no es necesario crear una copia de la lista. Y pasar múltiples argumentos de 'salida' suele ser una mala práctica, un tipo de devolución personalizada sería mejor. – Groo
De acuerdo con la copia de la lista. No estoy de acuerdo con la creación de un nuevo tipo de devolución, ya que en este caso parece bastante obvio el uso del índice de inicio y el índice final. –