【发布时间】:2015-06-12 14:21:21
【问题描述】:
我创建了这个算法来找到 3 个数字之间的最佳交易。它通过该程序并找到卖出、买入和从股票中获利的最佳日子。我需要解释所使用的算法以及时间复杂度如何为 O(n log n),但我在确定这一点时遇到了很多麻烦。我希望有人可以解释 O(n log n) 并将其与我的方法联系起来。
这是我的方法:
public static Trade bestTrade(int[] a)
{
int lowest = a[0];
int lowestIndex = 0;
int highest = a[a.length - 1];
int highestIndex = a.length - 1;
int profit = 0;
for(int i = 1; i < a.length; i++)
{
if (a[i] < lowest && i < highestIndex)
{
lowest = a[i];
lowestIndex = i;
}
}
for(int i = a.length - 2; i >= 0; i--)
{
if (a[i] > highest && i > lowestIndex)
{
highest = a[i];
highestIndex = i;
}
}
for(int i = 1; i < a.length; i++)
{
if (a[i] < lowest && i < highestIndex)
{
lowest = a[i];
lowestIndex = i;
}
}
if (highestIndex > lowestIndex)
{
profit = highest - lowest;
return new Trade(lowestIndex, highestIndex, profit);
}
return new Trade(lowestIndex, highestIndex, profit);
}
}
【问题讨论】:
-
乍一看,它实际上是 O(3n),相当于 O(n)。
-
在我看来是 O(n)。所有循环都是线性的。没有递归。
-
所以要使时间复杂度 O(n log n) 我需要组合我的 for 循环?抱歉,对这个有点陌生。
-
@kids O(n log n) 算法通常是涉及递归的分而治之的排序算法。嵌套循环通常会产生 n 平方的运行时间。