#假定你是交易员,必须在股票开盘时作出买入或卖出的决定。设计一个算法,根据给定的股价走势信息,决定买入和卖出策略,该策略必须实现利润的最大化。
在之前的博客中,我们提到了使用暴力枚举法解决上述问题,但是其算法复杂度较大。暴力枚举法
https://blog.csdn.net/WINNER_QIUQIU/article/details/105663322
此次我们使用分而治之的方法,通过将交易信息分为两部分实现降低算法的数量级。具体代码如下:
def findMaxProfit(S):
#返回值格式:(买入日期,卖出日期,最大利润)
if len(S)<2:
return [0,0,0]
if len(S)==2:
#如果交易只有两天,那么在第一天买入,第二天卖出
if (S[1]>S[0]):
return [0,1,S[1]-S[0]]
else:
return [0,0,0]
#把交易数据分成两部分,分别找出前半部分和后半部分最大交易利润,然后选取两种结果的最大值
firstHalf = findMaxProfit(S[0:int(len(S)/2)])
secondHalf = findMaxProfit(S[int(len(S)/2):len(S)])
finalResult = firstHalf
if (secondHalf[2]>firstHalf[2]):
#后半部分的交易日期要加上前半部分的天数
secondHalf[0] += int(len(S)/2)
secondHalf[1] += int(len(S)/2)
finalResult = secondHalf
#看最大利润方案是否在前半部分买入,后半部分卖出
lowestPrice = S[0]
highestPrice = S[int(len(S)/2)]
buyDay = 0
selDay = int(len(S)/2)
for i in range(0,int(len(S)/2)):
if (S[i]<lowestPrice):
buyDay = i
lowestPrice = S[i]
for i in range(int(len(S)/2),len(S)):
if (S[i]>highestPrice):
selDay = i
highestPrice = S[i]
if (highestPrice - lowestPrice > finalResult[2]):
finalResult[0] = buyDay
finalResult[1] = selDay
finalResult[2] = highestPrice - lowestPrice
return finalResult
maxProfit = findMaxProfit(S)
print("应该在{}天买入,第{}天卖出,最大交易利润为:{}".format(maxProfit[0]+1,maxProfit[1]+1,maxProfit[2]))
虽然此算法的代码量比暴力枚举法大一些,但是其时间复杂度为: O ( n l g ( n ) ) O(nlg(n)) O(nlg(n)),降低了一个数量级。
(算法来源:Python程序员面试宝典)