lexicographical_topological_sort#
- lexicographical_topological_sort(G, key=None)[source]#
生成唯一字典序拓扑排序中的节点。
通过首先进行拓扑排序(通常有多个有效排序),然后按字典序排序,生成节点的唯一排序。
拓扑排序安排有向图的节点,使得每条有向边的上游节点先于下游节点。对于没有环的有向图,总能找到一个解决方案。可能存在多个有效解决方案。
字典序排序就是按字母顺序排序。在这里用于打破拓扑排序中的平局,并确定一个单一、唯一的排序。这在比较排序结果时很有用。
可以通过向
key=
参数提供一个函数来自定义字典序。键函数的定义与 Python 内置的sort()
中使用的相同。该函数接受一个参数并返回一个用于排序的键。如果节点名称不可排序,字典序排序可能会失败。请参见下面的示例。解决方案是向
key=
参数提供一个返回可排序键的函数。- Parameters:
- GNetworkX 有向图
一个有向无环图 (DAG)
- key函数, 可选
一个将节点名称转换为比较键的函数。它定义并解决排序顺序中的歧义。默认为恒等函数。
- Yields:
- nodes
按字典序拓扑排序顺序生成 G 的节点。
- Raises:
- NetworkXError
拓扑排序仅针对有向图定义。如果图
G
是无向的,则引发NetworkXError
。- NetworkXUnfeasible
如果
G
不是有向无环图 (DAG),则不存在拓扑排序,并引发NetworkXUnfeasible
异常。如果在处理返回的迭代器时G
发生了变化,也可能引发此异常。- RuntimeError
如果在处理返回的迭代器时
G
发生了变化。- TypeError
由于节点名称不可排序而引发。考虑使用
key=
参数来解决排序顺序中的歧义。
See also
Notes
该算法基于 “Introduction to Algorithms: A Creative Approach” [1] 中的描述和证明。
References
[1]Manber, U. (1989). Introduction to Algorithms - A Creative Approach. Addison-Wesley.
Examples
>>> DG = nx.DiGraph([(2, 1), (2, 5), (1, 3), (1, 4), (5, 4)]) >>> list(nx.lexicographical_topological_sort(DG)) [2, 1, 3, 5, 4] >>> list(nx.lexicographical_topological_sort(DG, key=lambda x: -x)) [2, 5, 1, 4, 3]
对于任何包含整数和字符串节点的图,排序将失败。Python 中未定义整数和字符串的比较。3 是大于还是小于 ‘red’?
>>> DG = nx.DiGraph([(1, "red"), (3, "red"), (1, "green"), (2, "blue")]) >>> list(nx.lexicographical_topological_sort(DG)) Traceback (most recent call last): ... TypeError: '<' not supported between instances of 'str' and 'int' ...
可以使用
key
函数解决不可比较的节点。这个示例函数允许通过返回一个元组来比较整数和字符串,其中第一个元素对于str
为 True,否则为 False。第二个元素是节点名称。这会将字符串和整数分开,以便它们仅在自身之间进行比较。>>> key = lambda node: (isinstance(node, str), node) >>> list(nx.lexicographical_topological_sort(DG, key=key)) [1, 2, 3, 'blue', 'green', 'red']