基本算法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()
复制代码

 

posted on   我和你并没有不同  阅读(187)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示