• 基本算法2


    最小堆优先队列:
    class YOUXIAN(object):
        def __init__(self):
            self._lst=[0]
            self._size=0
        def show(self):
            print(self._lst)
        def addOne(self,v):
            self._size += 1
            self._lst.append(v)
            pos=self._size
            while pos//2 >0:
                if self._lst[pos//2]>self._lst[pos]:
                    self._lst[pos//2], self._lst[pos]=self._lst[pos],self._lst[pos//2]
                pos=pos//2
                # else:
                #     break
        def legal(self,pos):
            if pos*2+1>self._size:
                return pos*2
            else:
                if self._lst[pos*2]>self._lst[pos*2+1]:
                    return pos*2+1
                else:
                    return pos*2
    
        def delmin(self):
            if self._size >0:
                ret=self._lst[1]
                self._lst[1]=self._lst[self._size]
                self._size += -1
                self._lst.pop()
                pos=1
                while pos*2 <=self._size:
                    newpos=self.legal(pos)
                    if self._lst[pos]>self._lst[newpos]:
                        self._lst[pos],self._lst[newpos]=self._lst[newpos],self._lst[pos]
                    pos=newpos
                return ret
    
        def buildHeap(self,alist):
            for i in alist:
                self.addOne(i)
    
    
    
    bh = YOUXIAN()
    bh.buildHeap([9,5,6,2,3])
    bh.show()
    最短路径:
    
    
    import heapq
     
    import sys
    class YouXianQueue(object):
        def __init__(self):
            self._lst=[]
            self._index=0
    
        def push(self,item,prime):
            heapq.heappush(self._lst,(prime,self._index,item))
            self._index +=1
        def show(self):
            print(self._lst)
    
        def len(self):
            return len(self._lst)
    
        def change(self,item,priority):
            try:
                temp=None
                for num,i in enumerate(self._lst):
                    if i[-1] == item:
    
                        temp=num
                        break
    
                temp_v=self._lst[temp]
                del self._lst[temp]
    
                heapq.heappush(self._lst,(priority,temp_v[1],temp_v[2]))
            except Exception as ex:
                print(ex)
    
        def pop(self):
            return  heapq.heappop(self._lst)[-1]
    
    class NODE(object):
        def __init__(self,value):
            self._value=value
            self.connections={}
            self._parent=None
            self._dis=sys.maxsize
    
        def getWeight(self,item):
            return self.connections.get(item,0)
        def addNeibor(self,item,weight=1):
            self.connections[item]=weight
    
        @property
        def value(self):
            return self._value
    
        @value.setter
        def value(self,value):
            self._value=value
        @property
        def parent(self):
            return self._parent
        @parent.setter
        def parent(self,item):
            self._parent=item
    
    
        def getNeibor(self):
            return self.connections.keys()
    
        def setParent(self,item):
            self.parent=item
    
        @property
        def dis(self):
            return self._dis
    
        @dis.setter
        def dis(self,value):
            self._dis=value
    
    
    
    class GRAPH(object):
        def __init__(self):
            self.sons={}
            self.size=0
    
        def addSon(self,value):
            self.sons[value]=NODE(value)
            self.size +=1
    
        def getSon(self,value):
            return self.sons.get(value,None)
        def getall(self):
            return  self.sons.values()
    
        def addEdge(self,value1,value2,weight=1):
            if value1 not in self.sons:
                self.addSon(value1)
            if value2 not in self.sons:
                self.addSon(value2)
            self.sons[value1].addNeibor(self.sons[value2],weight)
    
    def genData(datas):
        g=GRAPH()
        for data in datas:
            g.addEdge(data[0],data[1],data[2])
        return g
    
    def minPaht(g,start):
        path=YouXianQueue()
        first=g.getSon(start)
        first.dis=0
        first.parent=None
        for son in g.getall():
            path.push(son,son.dis)
        while path.len()>0:
            current=path.pop()
            for son in current.getNeibor():
                newdis=current.dis+current.getWeight(son)
                if son.dis > newdis:
                    son.dis=newdis
                    son.parent=current
                    path.change(son,newdis)
    
    
    def showPah(g,dest):
        item=g.getSon(dest)
        print(item.value)
        while item.parent:
            item=item.parent
            print(item.value)
    
    def main():
        datas=[('u','v',2),('u','w',5),('u','x',1),('v','u',2),('v','w',3),('v','x',2),
    ('w','v',3),('w','u',5),('w','x',3),('w','y',1),('w','z',5),('z','w',5),('z','y',1),
        ('y','z',1),('y','w',1),('y','x',1),('x','y',1),('x','w',3),('x','v',2),('x','u',1)]
    
        g=genData(datas)
        minPaht(g,"u")
        showPah(g,'y')
    最小加权树:
    import heapq
    import sys
    class YouXianQueue(object):
        def __init__(self):
            self._lst=[]
            self._index=0
    
        def push(self,item,prime):
            heapq.heappush(self._lst,(prime,self._index,item))
            self._index +=1
        def show(self):
            print(self._lst)
    
        def __contains__(self, item):
            temp=[data[2] for data in self._lst]
            return item in temp
    
        def len(self):
            return len(self._lst)
    
        def change(self,item,priority):
            try:
                temp=None
                for num,i in enumerate(self._lst):
                    if i[-1] == item:
    
                        temp=num
                        break
    
                temp_v=self._lst[temp]
                del self._lst[temp]
    
                heapq.heappush(self._lst,(priority,temp_v[1],temp_v[2]))
            except Exception as ex:
                print(ex)
    
        def pop(self):
            return  heapq.heappop(self._lst)[-1]
    
    class NODE(object):
        def __init__(self,value):
            self._value=value
            self.connections={}
            self._parent=None
            self._dis=sys.maxsize
    
        def getWeight(self,item):
            return self.connections.get(item,0)
        def addNeibor(self,item,weight=1):
            self.connections[item]=weight
    
        @property
        def value(self):
            return self._value
    
        @value.setter
        def value(self,value):
            self._value=value
        @property
        def parent(self):
            return self._parent
        @parent.setter
        def parent(self,item):
            self._parent=item
    
    
        def getNeibor(self):
            return self.connections.keys()
    
        def setParent(self,item):
            self.parent=item
    
        @property
        def dis(self):
            return self._dis
    
        @dis.setter
        def dis(self,value):
            self._dis=value
    
    
    
    class GRAPH(object):
        def __init__(self):
            self.sons={}
            self.size=0
    
        def addSon(self,value):
            self.sons[value]=NODE(value)
            self.size +=1
    
        def getSon(self,value):
            return self.sons.get(value,None)
        def getall(self):
            return  self.sons.values()
    
        def addEdge(self,value1,value2,weight=1):
            if value1 not in self.sons:
                self.addSon(value1)
            if value2 not in self.sons:
                self.addSon(value2)
            self.sons[value1].addNeibor(self.sons[value2],weight)
    
    def genData(datas):
        g=GRAPH()
        for data in datas:
            g.addEdge(data[0],data[1],data[2])
        return g
    
    def minPaht(g,start):
        path=YouXianQueue()
        first=g.getSon(start)
        first.dis=0
        first.parent=None
        for son in g.getall():
            path.push(son,son.dis)
        while path.len()>0:
            current=path.pop()
            for son in current.getNeibor():
                newdis=current.dis+current.getWeight(son)
                if son in path and son.dis > newdis:
                    son.dis=newdis
                    son.parent=current
                    path.change(son,newdis)
    
    
    def showPah(g,dest):
        item=g.getSon(dest)
        print(item.value)
        while item.parent:
            item=item.parent
            print(item.value)
    
    def main():
        datas=[('A','B',2),('A','C',3),('B','C',1),('B','D',1),('B','E',4),('E','F',1),('F','C',5),('F','G',1),('D','E',1)]
        temp=[]
        for data in datas:
            temp.append(data)
            temp.append((data[1],data[0],data[2]))
        g=genData(temp)
        minPaht(g,"A")
        names=['A','B','C','D','E','F','G']
        sum=0
        for name in names:
            sum += g.getSon(name).dis
        print('sum',sum)
    
    main()
  • 相关阅读:
    Selector + 线程池 遇到的问题
    【转】Android TabActivity无法正常bindService解决方法
    Android 中的 Service 全面总结
    【转】IT 圈里有哪些经常被读错的词?
    【转】线程的7种状态及相互转换
    【eoeandroid 特刊】第117期打包网盘下载地址
    使用 Android 自带的 proguard 混淆源码
    Google+ 连接不上的解决办法
    【转】AsyncTask的用法
    winForm简单数据绑定
  • 原文地址:https://www.cnblogs.com/testzcy/p/12366211.html
Copyright © 2020-2023  润新知