编程之美之一摞烙饼的问题

我对编程之美中一摞烙饼的问题中的算法用Python实现了一遍,并且进行了优化,直接上代码吧:

#!/usr/bin/env python

class PrefixSorting(object):
    def __init__(self, ):
        self._cakes = []
        self._reverseCakes = []
        self._maxSwap = 0
        self._swaps = []
        self._reverseSwap = []
        self._search = 0
    
    def run(self, cakes):
        self.init(cakes)
        self._search = 0;
        self.search(0)
    
    def outPut(self):
        print self._swaps
        print self._search
        print self._maxSwap
    
    def init(self, cakes):
        self._cakes = cakes[:]
        self._reverseCakes = cakes[:]
        self._maxSwap = self.upperBound(len(cakes))
        self._swaps = [0]*self._maxSwap
        self._reverseSwap = [0]*self._maxSwap
        self._search = 0
    
    def upperBound(self, cakeCount):
        return cakeCount*2
    
    def lowerBound(self, cakes):
        result = 0
        for i in range(len(cakes)-1):
            t = cakes[i+1] - cakes[i]
            if t > 1 or t < -1:
                result = result+1
        return result
    
    def search(self, step):
        self._search = self._search + 1
        estimate = self.lowerBound(self._reverseCakes)
        if step + estimate >= self._maxSwap:
            return
        reverseCakes = self._reverseCakes[:]
        reverseCakes.sort()
        if reverseCakes == self._reverseCakes:
            if step < self._maxSwap:
                self._cakes = self._reverseCakes[:]
                self._maxSwap = step
                self._swaps = self._reverseSwap[:self._maxSwap]
                self._swaps = self.normal(self._swaps[:])
                self._maxSwap = len(self._swaps)
            return
        for i in range(len(self._cakes)-1):
            self.reverse(i+1)
            self._reverseSwap[step] = i+1
            if step < len(self._reverseSwap) - 1:
                self._reverseSwap[step+1:] = [0]*(len(self._reverseSwap)-step-1)
            self.search(step+1)
            self.reverse(i+1)
            
    def reverse(self, i):
        if i < len(self._reverseCakes)-1:
            header = self._reverseCakes[0:i+1]
            header.reverse()
            self._reverseCakes = header+self._reverseCakes[i+1:]
        else:
            self._reverseCakes.reverse()
            
    def normal(self, swap):
        i = 0
        while i < len(swap)-1:
            if swap[i] == swap[i+1]:
                swap[i:i+2]=[]
                i = i-1 if i > 0 else 0
            else:
                i = i+1
        return swap
    
            
if __name__ == '__main__':
    pS = PrefixSorting()
    pS.run([3,2,1,6,5,4,9,8,7,0])
    pS.outPut()

normal函数就是优化的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值