【发布时间】:2020-03-23 13:01:16
【问题描述】:
我有一个数字列表,我无法真正知道它们的真实值。假设list = [a,b,c,d]。但我有关于它们如何相互关联的信息:
a > b
b > d
d > c
因此我可以推断出按降序排序的列表是[ a, b, d, c]。
另一个更复杂的例子
relationships =
- g > b
- d > c > a
- d > g
- f > e > a
- f > e > d
在这种情况下,我们有多个可能的答案
Result:
[ [f, e, d, c, a, g, b],
[f, e, d, g, c, a, b],
[f, e, d, g, c, b, a],
... ]
仅举几例
我希望函数准确地返回我:所有可能答案的列表。关系是列表的列表,其中每个列表表示降序排序的关系。例如 relationships = [[a,b],[b,c]] 告诉我 "a > b" 和 "b > c" 。关系内部的内部列表不必具有相同的大小。如果输入无效/不可能,算法应该抛出错误。例如:
relationships = [[a,b],[b,c],[c,a] 是不可能的情况
什么是最有效的方法?我正在考虑使用图论,其中图不能是非循环的。例如 A -> B 意味着节点 A 去 B 意味着 A > B ,因此 B -> A 不能存在。有点像二叉树,但在这种情况下,我们只能允许 1 个,而不是每个节点允许 2 个子节点。
这是一个好主意吗?还是有人知道如何解决这个问题?
【问题讨论】:
-
这称为“拓扑排序”。我看到很多 Python 实现,尽管我不知道是否有任何支持您的“所有可能的答案”要求 - 典型的拓扑排序应用程序只需要一个答案。
-
这是Partial Order Sorting 上的相关答案,它证实您走在正确的轨道上,并提供更多信息和链接,例如Python Topological Sort 软件可能对您的任务有用。
-
哦,谢谢大家!知道它的术语会让整个世界变得不同。就是这样。我稍后会用我自己的实现来实现这个:)
标签: python algorithm sorting data-structures graph