繁体   English   中英

Python中的最佳Directed Dijkstra搜索

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM