如何解决如何根据给定图中的项目子集进行拓扑排序?
我有以下问题:给您一个待办事项列表,其中某些项目取决于其他项目。编写一个函数,其中包含这些待办事项的子集,并返回要完成的所有待办事项的有序列表。给定的子集包含一个或多个这些待办事项。
我已经使用Kahn算法编写了一种拓扑排序,将给出的列表变成了邻接列表。当我有待办事项列表时,我开始将它们添加到另一个数组中,并在包含给定子集中的所有项时停止。
这行得通,但是我觉得这有点笨拙且效率低下,因为我要对整个列表进行排序,然后返回截断的版本。
关于如何使该解决方案更加优雅的任何想法?
解决方法
代替处理单独的过滤过程,您应该能够检查每个任务是否已添加到输出filteredTasks
中,因为它已处理为添加到orderedTasks
中。
由于orderedTasks
的唯一其他用途是检查其长度,因此您应该可以将其替换为计数器。
这可能不会使您的功能更快,但是会简化您的代码。
,不要认为这是一种拓扑类型。可以将其视为“首先执行依赖项,不要重复执行两次”。只要我们跟踪我们将要做的事情和已经完成的事情,这就是简单的递归函数。
以下Python解决方案可以使这一点更加清楚。
def arrange_tasks(dependencies,todo,in_order=None,done=None):
if in_order is None:
in_order = []
if done is None:
done = set()
for item in todo:
# Do we need to?
if item not in done:
# Marking it done first avoids deep recursion on dependency loops!
done.add(item)
# Make sure that dependencies happened.
arrange_tasks(dependencies,dependencies[item],in_order,done)
# And now this can happen.
in_order.append(item)
return in_order
print(arrange_tasks(
{
'make a sandwich': ['buy groceries'],'buy groceries': ['go to store'],'go to store': []
},['buy groceries']
))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。