Python 如何提高该算法的性能?

Python 如何提高该算法的性能?,python,algorithm,Python,Algorithm,我有以下算法: 我有一个图和一个相关的图,我有一个拓扑排序(在图论中,“有向图的拓扑排序或拓扑排序是其顶点的线性排序,这样对于从顶点u到顶点v的每个有向边uv,在排序中u在v之前。”)。 给定一个start\u位置和一个end\u位置(与start\u位置不同),我想验证将位于start\u位置的列表元素移动到end\u位置是否保留拓扑顺序,即,如果在移动之后我仍然具有拓扑顺序 有两种情况:左移(如果开始位置>结束位置)和右移(否则) 以下是我的尝试: def验证(从位置:int,到位置:i

我有以下算法: 我有一个图和一个相关的图,我有一个拓扑排序(在图论中,“有向图的拓扑排序或拓扑排序是其顶点的线性排序,这样对于从顶点u到顶点v的每个有向边uv,在排序中u在v之前。”)。
给定一个
start\u位置
和一个
end\u位置
(与start\u位置不同),我想验证将位于
start\u位置
的列表元素移动到
end\u位置
是否保留拓扑顺序,即,如果在移动之后我仍然具有拓扑顺序

有两种情况:左移(如果
开始位置
>
结束位置
)和右移(否则)

以下是我的尝试:

def验证(从位置:int,到位置:int,节点列表:list[str],实例:pb.Problem):
如果从_位置<到_位置:
#右移
对于节点\u列表中的任务\u temp[从\u位置+1:到\u位置+1]:
if(节点列表[从位置],任务临时)在instance.all_前置程序中:
返回错误
返回真值
如果到_位置<从_位置:
#末班
对于节点\u列表中的任务\u temp[到\u位置:从\u位置]:
if(任务临时,节点列表[从位置])在instance.all_前置:
返回错误
返回真值
PS:
all_preducer
是一组元组(2个元素),具有图形的所有边


有没有办法使它更快?

简单的方法是渐进最优的:只需运行(新)排序并验证它是否满足拓扑标准。您可以通过维护到目前为止遇到的节点的位字段来实现这一点,并检查是否在位字段中设置了每个新节点的前置节点。这在节点和边的数量上需要线性时间,在最坏的情况下,任何正确的算法都需要线性时间


对于问题的其他变体(例如,测量移位的大小,或在预处理后优化每个查询的时间),可能有更好的方法。

“我想验证是否将列表中位于开始位置的元素移位到结束位置”——这意味着什么?@ScottHunter抱歉,我忘了继续这句话。我想验证将列表中位于
start\u位置的元素移动到
end\u位置是否保留了拓扑顺序,也就是说,移动后我是否仍然有拓扑顺序。你能解释一下“拓扑顺序”是什么吗?@Nathan“有向图的拓扑排序或拓扑排序是其顶点的线性排序,因此对于从顶点u到顶点v的每个有向边uv,在排序中u位于v之前。“如果您的算法要检查多个情况,那么将输入/输出关系移动到节点上是值得的。您可以通过
所有前辈
运行一次,对于每个元组
(A,B)
,您可以执行
A.out.append(B)
B.in.append(A)
。然后在验证时,检查
movedNode.in
.out
,应减少迭代次数。不,但如果我的答案中有任何内容不明确,请告诉我。首先,您认为这比@hackape注释中的答案好吗?如注释所示,将图形表示转换为邻接列表ts是我描述的方法所必需的。我有点困惑,我看不出你的方法和他的评论有什么区别(看看他的评论)