Dijkstra 's Algorithm을 Python으로 구현해야합니다. 그러나 전 배열, 길이 및 비 방문/방문의 세 가지 정보를 담기 위해 2D 배열을 사용해야합니다. 내가 파이썬에서 비슷한 일을 할 수있는 방법에 붙어 있어요하지만 내가 구조체를 사용할 수 있습니다 C 알고,Python - Dijkstra 's 알고리즘
답변
, 당신은 개체의 인스턴스를 사용할 수 있습니다.
이 저자는 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를 호출하여 구성되는 객체에서 '보유'된다(). 항목은 클래스이며 다음과 같이 정의됩니다.
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
self.known, self.distance ...는 정보입니다. 그는 생성자 (초기화)에서 명시 적으로 설정하지는 않지만 나중에 설정합니다. 파이썬에서는 도트 표기법으로 속성에 액세스 할 수 있습니다. testle에 대한 : myObject = Entry(). myObject.known, myObject.distance ... 모두 공개입니다.
파이썬 객체에 해당 정보를 캡슐화 나는 그것이 가능하다고 이야기하고 있지만 솔직히 아무 생각이 없다 너 괜찮을거야.
클래스를 만듭니다. XXX = collections.namedtuple('XXX', 'predecessor length visited')
: 자신의 행동하지만라는 이름의 멤버없이 구조체와 같은 복합 유형을 유지 특히 멋지다
class XXX(object):
def __init__(self, predecessor, length, visited):
self.predecessor = predecessor
self.length = length
self.visited = visited
또는 사용 collections.namedtuple.
XXX(predecessor, length, visited)
으로 하나 만듭니다.
파이썬은 객체 지향 언어입니다. C의 Structs에서 C++의 클래스로 이동하는 것과 같습니다. 파이썬에서도 같은 클래스 구조를 사용할 수 있습니다.
또는 당신은 단순히 2 차원 배열 내부 튜플 또는 사전을 사용할 수 있습니다 : 위에서 언급 한 바와 같이
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)
구문 강조 표시에서 알 수 있듯이 식별자는 숫자로 시작할 수 없습니다. – delnan
- 1. Dijkstra 's Bankers Algorithm
- 2. Bellman-Ford, Dijkstra 's, Prim의 알고리즘, Kruskal의 지시 비순환 그래프
- 3. "이전"벡터가없는 Dijkstra 알고리즘
- 4. Python Dijkstra Algorithm
- 5. Dijkstra 개념과 다른 라우팅 알고리즘
- 6. Python 알고리즘 효율성
- 7. quantile (s)을 동적으로 모니터하는 알고리즘
- 8. Python/SciPy의 피크 찾기 알고리즘
- 9. Google지도 알고리즘
- 10. Python - Dijsktra 's Algorithm 거리 문제
- 11. 그래프 알고리즘, 근사 알고리즘
- 12. Boost :: graph Dijkstra : 처음에 대기열을 채우는 중
- 13. PHP에서 Dijkstra 코드를 최적화하는 방법은 무엇입니까?
- 14. 나는이 dijkstra 코드를 만들 수 없다. compille 누구든지 나를 도와 줄 수 있니? (알고리즘 설계 매뉴얼)
- 15. vim 's : python 명령에 대한 파이썬 인터프리터 지정
- 16. PyArg_ParseTuple() "s"형식 지정자는 Python 3.x C API에서 유용합니까?
- 17. Mix s : Button 및 s : ToggleButton in s : ButtonBar
- 18. 문자열의 끝 찾기 : * s ++ VS * s 다음 s ++
- 19. 가장 빠른 Dijkstra 알고리즘에 대한 j2ME
- 20. 연결된리스트 그래프 구현에서 Dijkstra 알고리즘의 큰 문제점
- 21. 이 견적을 설명하는 최고의 Dijkstra 논문?
- 22. 최단 경로와 관련한 알고리즘 질문
- 23. PHP의 regex에서 [\ S \ s] *의 의미는 무엇입니까?
- 24. { "제목"; S : S : 5 43 :} MySQL 데이터베이스에
- 25. 오래된 데스크탑 프로그래머가 S + S 프로젝트를 만들고 싶습니다.
- 26. 경로는 'S'
- 27. 간단한 그래프 형식의 텍스트 파일에서 개체를 만듭니다. 자바. dijkstra algorithm
- 28. 최소 가중치 연결된 에지 집합 알고리즘 T
- 29. 응용 프로그램의 암호화 알고리즘
- 30. 알고리즘
아마도 파이썬을 실제로 배우는 데 도움이 될까요? 기본 데이터 구조 및 이와 유사합니까? 하지만 당신은 그 시간이 없다고 생각합니다. ... – nikow
데이터 구조와 관련하여 이와 같은 '복잡한'상황이 있다고 생각한 적이 없지만 이전에 파이썬을 조금 했었습니다. 모든 답변을 주셔서 감사합니다 – user612041
C 스타일의 콤팩트 2D 배열로 표시해야합니까? 객체로 수행 할 수있는 경우 클래스와 Python의 내장 데이터 구조를 사용하여 언어가 문제 도메인에보다 적합하게 맞출 수 있습니다. 그렇지 않으면, C 스타일의 구조를 가진 일부 해킹이 불가피 할 것이다. 즐겁지 않아. – Santa