Мне нужно реализовать Алгоритм Дейкстры в Python. Тем не менее, я должен использовать 2D-массив для хранения трех частей информации - предшественника, длины и невнимания/посещения. Я знаю, что в C a Struct можно использовать, хотя я зациклен на том, как я могу сделать аналогичную вещь в Python, мне говорят, что это возможно, но я не знаю, чтобы быть честнымPython - Алгоритм Дейкстры
ответ
Как уже упоминалось выше, вы можете использовать экземпляр объекта.
Этот автор имеет довольно убедительную реализацию на 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(). Запись является классом и определяется следующим образом:
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 и все должно быть в порядке.
Создайте для этого класс.
class XXX(object):
def __init__(self, predecessor, length, visited):
self.predecessor = predecessor
self.length = length
self.visited = visited
Или используйте collections.namedtuple, что особенно здорово для проведения STRUCT подобных составных типов без собственного поведения, но названных члены: XXX = collections.namedtuple('XXX', 'predecessor length visited')
.
Создайте с XXX(predecessor, length, visited)
.
Python - объектно-ориентированный язык. Поэтому подумайте об этом, перейдя от Structs в C к классам C++. Вы можете использовать ту же структуру классов и в 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)
Поскольку подсветка синтаксиса указывает, идентификаторы не могут начинаться с чисел;) – delnan
- 1. Алгоритм Дейкстры в python
- 2. Дейкстры алгоритм с Python
- 3. Алгоритм алгоритма Дейкстры в Python
- 4. Python - алгоритм Дейкстры в большом масштабе
- 5. Алгоритм Дейкстры на пути построения Python
- 6. длина Алгоритм Дейкстры
- 7. Алгоритм Примса алгоритму Дейкстры
- 8. Алгоритм Дейкстры в CUDA
- 9. алгоритм Дейкстры - реализация JavaScript
- 10. Дейкстры Алгоритм = SSSP
- 11. кратчайшего алгоритм пути Дейкстры
- 12. Дейкстры Алгоритм: неверный путь
- 13. Алгоритм и функции Дейкстры
- 14. Почему алгоритм Дейкстры работает?
- 15. Алгоритм Дейкстры в C
- 16. интерпретируя Дейкстры Алгоритм
- 17. Алгоритм Дейкстры в C++
- 18. Алгоритм Дейкстры - сложность
- 19. Алгоритм Дейкстры в Java
- 20. Рекурсия и алгоритм Дейкстры
- 21. Алгоритм алгоритма Дейкстры
- 22. Алгоритм Дейкстры с Гремлином
- 23. Алгоритм Дейкстры (обновление кучи)
- 24. Алгоритм Дейкстры для матриц
- 25. Алгоритм Дейкстры Runtime
- 26. алгоритм Дейкстры вопрос
- 27. Алгоритм Дейкстры: моя реализация ошибочна?
- 28. Почему алгоритм Дейкстры использует уменьшающий ключ? Алгоритм
- 29. Алгоритм Дейкстры с отрицательными весами
- 30. Алгоритм Дейкстры на трехмерном массиве
Возможно, это поможет научиться Python? Как основные структуры данных и т. Д.? Но я думаю, что у вас нет времени на это ... – nikow
Я уже делал немного Python, хотя никогда не сталкивался с тем, что, по моему мнению, является «сложной» ситуацией, подобной этой ситуации в отношении структур данных, поэтому я спасибо всем за ваши ответы – user612041
Нужно ли * * быть представленным в компактном 2D-массиве C-стиля? Если это можно сделать с помощью объектов, вы можете использовать классы и встроенные структуры данных Python, чтобы язык соответствовал более корректно с проблемным доменом. В противном случае некоторые хак-аш-переоснащение со структурами С-стиля были бы неизбежны. Не нравится. – Santa