算法01——分而治之法

#假定你是交易员,必须在股票开盘时作出买入或卖出的决定。设计一个算法,根据给定的股价走势信息,决定买入和卖出策略,该策略必须实现利润的最大化。
在之前的博客中,我们提到了使用暴力枚举法解决上述问题,但是其算法复杂度较大。暴力枚举法
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程序员面试宝典)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值