我有依赖项和状态的作业列表。我想通过每个工作,并将依赖关系映射为树。树的结尾将是两个父依赖项都处于完成状态。然后没有必要走远。我不确定我是否应该使用递归,或者这是否真的是唯一的可能性。是否有可以帮助我的原生地图工具或数据结构?我将要迭代接近10K的工作。
Psuedo Code
def map_depends(job_depends):
for job in job_depends:
if job.status = done:
job_tree_map.append(job.name)
else:
map_depends(job.get('dependencies'))
def main():
for job in batch:
if job.get('dependencies'):
map_depends(job.get('dependencies'))
我正在谈论的内容的视觉描述。
-> job_depends1.status = done
main_job -> job_depends3 = running -> job_depends6 = done
-> job_depends2 = running......job_depends2 -> jon_depends4 = done
-> job_depends5 = done
答案 0 :(得分:1)
树是自然递归的数据结构,但是,任何可以递归写入的东西都可以使用显式堆栈迭代完成。
可悲的是,你没有得到"来自"直到CPython 3. [34],这使得递归生成器在早期版本中不切实际。
因此,如果你仍然以2.7为目标,你可能应该先递归写东西,让它们以这种方式工作,然后非递归地执行你的生成器。
对于堆栈,许多Python开发人员将在列表或acollections.deque上使用append和pop。我可能会为了抽象而使用http://stromberg.dnsalias.org/~strombrg/linked-list/,尽管在CPython中它常常很慢。
答案 1 :(得分:0)
如果树相当深,使用递归算法可能会导致堆栈溢出,因为CPython默认情况下具有1000个嵌套调用的限制。您可以使用sys.setrecursionlimit
设置自己的限制值,但通常不建议这样做。因此,在您的情况下,以迭代方式重写树遍历可能更好。
例如,您可以编写一个类似树过滤和遍历的函数(不是伪代码):
def walkjob(job):
if job is None:
return []
result = [job, ]
cursor = 0
while cursor < len(result):
job = result[cursor]
result.extend(list(
filter(lambda j: j.done,
job.children)))
cursor += 1
return result
这里用于REPL:
>>> from bunch import Bunch
>>> job = Bunch(value=1, done=True, children=[
... Bunch(value=2, done=True, children=[]),
... Bunch(value=3, done=True, children=[
... Bunch(value=4, done=False, children=[]),
... Bunch(value=5, done=True, children=[])])])
...
>>> map(lambda j: (j.value, j.done), walkjob(job))
[(1, True), (2, True), (3, True), (5, True)]
可能相关的问题: