[英]Optimal Directed Dijkstra search in Python
我已经玩过写自己的堆并尝试使用堆来存储距离的有向Dijkstra算法。
我已经用Bellman-Ford(以及纸上)交叉检查了答案,所以我确信它运行正常,但是对我来说似乎太慢了。 我还创建了自己的Graph类来保存顶点的值/边的长度/头/尾
def dijkstra(G,root):
###Initialize values
root.value=0
h=heap.Heap(root)
for v in G.vertices:
if v==root:
continue
v.value=float('inf')
h.insert(v)
while len(h.nodes)>1:
m=h.extractmin()
##Only works for directed graphs
for E in m.edges:
if (E.v in h.nodes) and E.v.value>m.value+E.d:
#If head of the min vrtx is in the heap
E.v.value=m.value+E.d
h.check_parent(h.nodes.index(E.v)) #percolate up
在50k边缘和1k节点的输入上,完成需要> 30秒。 这是一个合理的时间期待与python? 假设算法是正确的,我的堆是否会成为限制因素?
(我也知道我正在直接修改/访问该类的成员,即v.value = ...,这是不好的做法?我没有特别声明它们是私有的)
感谢您的投入!
这是一个合理的时间期待与python?
在不知道系统规格的情况下无法回答这个问题。 尝试与预先构建的数据结构进行比较,例如https://docs.python.org/2/library/heapq.html
我的堆会成为限制因素吗?
是。
这是不好的做法?
这个问题有点不合适。 您在询问算法的同时询问OO。
最后,确保您的堆实现可以在O(1)
而不是O(n)
实现以下内容:
if (E.v in h.nodes)
顺便说一句,您不必支持堆中的操作。 您可以简单地为顶点设置另一个布尔属性,并在将其添加到堆中时将其设置为v.inHeap = True
,并在从堆中提取时将其设置为False
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.