c > b
d > b
a > d
c > a
鉴于这种传递关系,计算所有这些关系的最有效算法是什么?
答案 0 :(得分:1)
构建图表,并使用topological sort按排序顺序检索节点。
如果使用am邻接列表表示和图表顶点的哈希映射,则总时间将为O(N),其中N
是您拥有的关系数。构建图表与您拥有的关系数量成线性关系。拓扑排序为O(| V | + | E |),其中| V |是顶点数,| E |是边数。边数等于关系数,即N
,V
的上限为2*N
,因此我们有O(3 * N),即O (N)。
答案 1 :(得分:1)
您在案例中实际描述的是拓扑排序问题:http://en.wikipedia.org/wiki/Topological_sorting
除了图表,您还有字母的排序。每个字母代表一个节点,每个比较运算符代表一个有向边。用于计算成对排序的拓扑排序的标准算法如下:
L ← Empty list that will contain the sorted elements
S ← Set of all nodes with no incoming edges
while S is non-empty do
remove a node n from S
add n to tail of L
for each node m with an edge e from n to m do
remove edge e from the graph
if m has no other incoming edges then
insert m into S
if graph has edges then
return error (graph has at least one cycle)
else
return L (a topologically sorted order)
请记住,为了找到订单,可能没有周期。即:
a < b //This
b < c //contains
c < a //a cycle!
这称为DAG。有向无环图。请参阅:http://en.wikipedia.org/wiki/Directed_acyclic_graph
以下是如何在Python中执行此操作的示例:Topological sort python