アイテムとアイテムが依存するアイテムとの間のマッピングが与えられると、トポロジカル ソートはアイテムが依存するアイテムの前にアイテムがないようにアイテムを並べ替えます。
この Rosetta コード タスクにはPythonのソリューションがあり、並列処理できる項目を知ることができます。
あなたの入力を考えると、コードは次のようになります。
try:
from functools import reduce
except:
pass
data = { # From: http://stackoverflow.com/questions/18314250/optimized-algorithm-to-schedule-tasks-with-dependency
# This <- This (Reverse of how shown in question)
'B': set(['A']),
'C': set(['A']),
'D': set(['B']),
'F': set(['E']),
}
def toposort2(data):
for k, v in data.items():
v.discard(k) # Ignore self dependencies
extra_items_in_deps = reduce(set.union, data.values()) - set(data.keys())
data.update({item:set() for item in extra_items_in_deps})
while True:
ordered = set(item for item,dep in data.items() if not dep)
if not ordered:
break
yield ' '.join(sorted(ordered))
data = {item: (dep - ordered) for item,dep in data.items()
if item not in ordered}
assert not data, "A cyclic dependency exists amongst %r" % data
print ('\n'.join( toposort2(data) ))
次に、次の出力が生成されます。
A E
B C F
D
出力の 1 行の項目は、任意の下位順序で処理することも、実際には並行して処理することもできます。依存関係を維持するために、上位行のすべての項目が次の行の項目の前に処理される限り。