Я читаю «Введение в алгоритмы». В проблеме максимального субарама (глава 4) автор утверждает, что максимальная прибыль от покупки и продажи доли не может быть рассчитана просто путем нахождения максимума и минимума массива. Автор говорит об альтернативах, таких как грубая сила, вычисляя все возможные комбинации дат покупки и продажи, для которых требуется 0 (n^2) времени. Другой альтернативой было бы найти максимальный субаракр ежедневных изменений в ценовом массиве.Максимизировать прибыль от акций (максимальный субарах)
Однако я закодировал алгоритм, который займет 0 (n) время и найдет максимальную прибыль. Это находится в 0 (n) против задачи максимального подмассива 0 (n log n). Но я знаю, что авторы не могут ошибаться. Где я иду не так? Правильно ли мой алгоритм?
#include <stdio.h>
#include <limits.h>
int main(void)
{
int A[8]={10,8,3,9,7,4,5,10,4};
int i,max,min,currmax,prevmax,n=8;
max=INT_MIN;
min=INT_MAX;
for(i=0;i<n;i++)
{
if(A[i]>max)
{
max=A[i];
prevmax=currmax;
currmax=max-min;
}
if(A[i]<min)
{
min=A[i];
max=INT_MIN;
}
}
if(prevmax>currmax)
printf("%d",prevmax);
else
printf("%d",currmax);
return 0;
}
, как указано в GeeksForGeeks (http://www.geeksforgeeks.org/divide-and-conquer-maximum-sum-subarray/), вход для ежедневного изменения цен на акции являются А [] = {- 2, -5, 6, -2, -3, 1, 5, -6}. Я взял базовую цену как 10 и выполнил алгоритм как A [] = {10,8,3,9,7,4,5,10,4};
Вход: 10,8,3,9,7,4,5,10,4
Выход: 7
Как вы говорите, решение задается проблемой максимальной последовательности. Но проблема максимальной последовательности [решена] (https://en.wikipedia.org/wiki/Maximum_subarray_problem#Kadane.27s_algorithm) в O (n) пространстве и O (1) раз. Где (на какой странице) он говорит O (n log n)? –
Ваш алгоритм, похоже, имеет правильную идею. Но я думаю, что вы должны вынуть prevmax и вместо этого сделать 'if (max-min> currmax) currmax = max-min;' и просто напечатать 'currmax' в качестве своего ответа. В противном случае вы будете ошибочны, если ответ приходит до предваря. Также вы должны инициализировать 'currmax' до 0, если нет никакой прибыли. –
@LawrenceWu: Страница 74, CLRS 3E. Он говорит 0 (n lg n).Да, предыдущий не нужен. –