Ho la seguente implementazione di Kadane's algorithm per risolvere il problema del sottoarray massima di un array:di Kadane per trovare sottoarray con la somma massima
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;
}
fallisce quando uso una sequenza che inizia con un negativo numero come -1, 2, 3
dando un risultato di 4, [0,2]
anziché 5, [1,2]
.
Per la vita di me che non riesco a trovare dove sia l'errore. Forse è un difetto nella progettazione dell'algoritmo?
Grazie in anticipo.
Perfetto. Ho appena preso un'implementazione già esistente in C che sembrava standard e l'ho trasferito su C#. Il tuo passa tutti i miei test unitari quindi penso che sia la migliore opzione. Grazie! –
Inoltre, se si esegue il refactoring, eseguirò l'iterazione direttamente, non è necessario creare una copia dell'elenco. E passare più argomenti "out" è di solito una cattiva pratica, un tipo di reso personalizzato sarebbe meglio. – Groo
D'accordo con la copia della lista. Non sono d'accordo con la creazione di un nuovo tipo di reso, in questo caso sembra abbastanza ovvio l'uso dell'indice di inizio e dell'indice finale. –