虽然有许多排序算法可供选择,但其中大多数仅适用于全序集,因为它们假定任意两个元素是可比较的。 然而,在部分排序集合中是否存在任何好的算法可用于排序,其中一些元素是不可比较的呢?也就是说,给定一个从部分排序集合S中提取出来的元素集合,输出排序x1,x2,...,xn的最佳方法是什么,使得如果 xi ≤ xj,那么i ≤ j?
虽然有许多排序算法可供选择,但其中大多数仅适用于全序集,因为它们假定任意两个元素是可比较的。 然而,在部分排序集合中是否存在任何好的算法可用于排序,其中一些元素是不可比较的呢?也就是说,给定一个从部分排序集合S中提取出来的元素集合,输出排序x1,x2,...,xn的最佳方法是什么,使得如果 xi ≤ xj,那么i ≤ j?
这里有一篇名为“Posets中的排序和选择”的论文可在arxiv.org上获取,讨论了O((w^2)nlog(n/w))级别的排序方法,其中w是poset的“宽度”。我没有阅读这篇论文,但看起来它涵盖了您正在寻找的内容。
拓扑排序适用于部分有序集合的排序。大多数算法是O(n^2)。以下是维基百科上的算法:
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)
这里有一个有用的视频示例。大多数类Unix系统都有tsort
命令。您可以按照以下方式使用tsort
解决视频中的布朗尼问题:
$ cat brownies.txt
preheat bake
water mix
dry_ingredients mix
grease pour
mix pour
pour bake
$ tsort brownies.txt
grease
dry_ingredients
water
preheat
mix
pour
bake