【发布时间】:2016-07-12 06:48:34
【问题描述】:
我正在阅读“算法简介”。在最大子数组问题(第 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/) 中所述,股票价格每日变化的输入为 A[ ]={-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
【问题讨论】:
-
如你所说,最大序列问题给出了解决方案。但是最大序列问题是solved 在 O(n) 空间和 O(1) 时间。它在哪里(哪个页面)说 O(n log n)?
-
你的算法似乎有正确的想法。但我认为你应该取出 prevmax 而不是
if (max-min > currmax) currmax = max-min;并打印currmax作为你的答案。否则,如果答案出现在 prevmax 之前,您将是不正确的。另外你应该将currmax初始化为0,以防没有利润。 -
@LawrenceWu:第 74 页,CLRS 3E。它说0(n lg n)。是的,不需要 prevmax。
-
@AbhishekBansal:输出仍然是 7。但是我现在更改了输入。
-
阅读最后一句话,它说分而治之不是最好的,但 O(n) 是可以实现的,这就是你基本上所做的。 “如练习 4.1-5 所示,实际上存在线性时间算法 [...]”
标签: algorithm