我有一组对象,我需要生成一个排序列表,但我的比较函数不完整,并为排序算法的“想象力”留下了一些空间。
具体来说,给出如下所示的树集合:
A E | | B--C F | D
我现有的是节点{A, B, C, D, E, F}
的集合,没有特定的顺序,以及测试直接父子关系的函数:
parent(A, B) parent(A, C) parent(B, D) parent(E, F)
我需要把这个变成一个父母来到他们孩子面前的清单,但除此之外,这个顺序并不重要。因此,任何这些结果都是可以接受的:
A, B, C, D, E, F. A, B, D, C, E, F. E, F, A, B, C, D. A, E, B, C, F, D.
这套装置很小,最多只有几打,所以我不太关心性能。我关注的是避免列表以外的临时数据结构:由于我使用的语言的限制,将这些项目组织到临时树(例如)中会很不愉快。
答案 0 :(得分:4)
我相信你正在寻找topological sort算法。
以下是维基百科文章中的相关算法:
L ← Empty list that will contain the sorted nodes
S ← Set of all nodes
function visit(node n)
if n has not been visited yet then
mark n as visited
for each node m with an edge from n to m do
visit(m)
add n to L
for each node n in S do
visit(n)
答案 1 :(得分:4)
您可以使用这个简单的算法:
while unsorted set is not empty {
elem = get element from unsorted set
while elem has parent and parent is in unsorted set {
elem = parent of elem
}
add elem to result list
remove elem from unsorted set
}