[英]Python - Dijkstra's Algorithm
我需要在Python中實現Dijkstra的算法。 但是,我必須使用2D數組來保存三段信息-前身,長度和未訪問/訪問的信息。 我知道在C中可以使用Struct,盡管我一直堅持如何在Python中做類似的事情,但我被告知有可能,但是我不知道如何誠實
為此創建一個類。
class XXX(object):
def __init__(self, predecessor, length, visited):
self.predecessor = predecessor
self.length = length
self.visited = visited
或使用collections.namedtuple,這對於保存沒有自己的行為但具有命名成員的類似結構的復合類型特別酷: XXX = collections.namedtuple('XXX', 'predecessor length visited')
。
用XXX(predecessor, length, visited)
創建一個。
將該信息封裝在Python對象中,就可以了。
或者,您可以在2d數組中簡單地使用元組或字典:
width=10
height=10
my2darray = []
for x in range(width):
my2darray[x]=[]
for x in range(width):
for y in range(height):
#here you set the tuple
my2darray[x][y] = (n,l,v)
#or you can use a dict..
my2darray[x][y] = dict(node=foo,length=12,visited=False)
如上所述,您可以使用對象的實例。
作者在python中有一個非常令人信服的Dijkstras python實現。
#
# This file contains the Python code from Program 16.16 of
# "Data Structures and Algorithms
# with Object-Oriented Design Patterns in Python"
# by Bruno R. Preiss.
#
# Copyright (c) 2003 by Bruno R. Preiss, P.Eng. All rights reserved.
#
# http://www.brpreiss.com/books/opus7/programs/pgm16_16.txt
#
class Algorithms(object):
def DijkstrasAlgorithm(g, s):
n = g.numberOfVertices
table = Array(n)
for v in xrange(n):
table[v] = Algorithms.Entry()
table[s].distance = 0
queue = BinaryHeap(g.numberOfEdges)
queue.enqueue(Association(0, g[s]))
while not queue.isEmpty:
assoc = queue.dequeueMin()
v0 = assoc.value
if not table[v0.number].known:
table[v0.number].known = True
for e in v0.emanatingEdges:
v1 = e.mateOf(v0)
d = table[v0.number].distance + e.weight
if table[v1.number].distance > d:
table[v1.number].distance = d
table[v1.number].predecessor = v0.number
queue.enqueue(Association(d, v1))
result = DigraphAsLists(n)
for v in xrange(n):
result.addVertex(v, table[v].distance)
for v in xrange(n):
if v != s:
result.addEdge(v, table[v].predecessor)
return result
DijkstrasAlgorithm = staticmethod(DijkstrasAlgorithm)
注意,通過調用Algorithms.Entry(),這些信息被“保留”在他正在構造的對象中。 Entry是一個類,其定義如下:
class Entry(object):
"""
Data structure used in Dijkstra's and Prim's algorithms.
"""
def __init__(self):
"""
(Algorithms.Entry) -> None
Constructor.
"""
self.known = False
self.distance = sys.maxint
self.predecessor = sys.maxint
自我,自我,距離...就是這些信息。 他沒有在構造函數( init )中顯式設置它們,而是稍后進行設置。 在Python中,您可以使用點表示法訪問屬性。 例如:myObject = Entry()。 myObject.known,myObject.distance ...它們都是公共的。
Python是面向對象的語言。 因此,將其想象為從C中的結構遷移到C ++類。 您也可以在Python中使用相同的類結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.