如何根据给定图中的项目子集进行拓扑排序?

问题描述

我有以下问题:给您一个待办事项列表,其中某些项目取决于其他项目。编写一个函数,其中包含这些待办事项的子集,并返回要完成的所有待办事项的有序列表。给定的子集包含一个或多个这些待办事项。

我已经使用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']
))

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...