"Introduction To Algorithms"を読んでいます。最大部分配列問題(第4章)では、配列の最大値と最小値を見つけるだけで、株式の売買の最大利益を計算することはできないと主張しています。著者は、0(n^2)時間が必要な購入日と売り日の可能な組み合わせをすべて計算することにより、ブルートフォースなどの代替案を話します。もう1つの選択肢は、価格配列の日々の変化の最大部分配列を見つけることです。株式の利益を最大化する(最大サブアレイ)
しかし、私は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
あなたが言うように、解は最大のシーケンス問題によって与えられます。しかし、最大シーケンス問題は、O(n)空間とO(1)時間で[解決](https://en.wikipedia.org/wiki/Maximum_subarray_problem#Kadane.27s_algorithm)です。 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は必要ありませんでした。 –