从分层路径创建序数值

时间:2011-05-19 21:35:12

标签: algorithm sorting recursion

假设我有一组类似路径的结构:

A1 -> B1 -> C1
A1 -> B1 -> C2
A1 -> B2
A2
A3 -> B1
A4 -> B2 -> C3

现在,我想为这些路径中的每一个创建一个序数值,以便对它们进行排序,,而不知道有关集合中任何其他路径的任何信息

如果你想象代表XML节点之类的路径,那么As将是根级节点,Bs是第一个孩子等等。我想先按A排序,然后是B,然后是C,等等。这些路径是任意的深度和每个级别的任意数量的节点。

我现在一直在敲打数字操作一小时左右,并没有想出任何优雅的东西。不幸的是,我也不确定在搜索相关问题域时要使用哪些术语。

修改:实际上我很容易在集合中获得总数的路径,并在计算过程中获得该值。考虑到这一点,我将回到白板;谢谢@rrenaud。

2 个答案:

答案 0 :(得分:1)

如果你想保留订单,你真的需要知道分支因子,深度或条目总数的一些界限才能做到这一点。

矛盾证明。想想我,你的邪恶对手。假设你想出一个不知道总大小的编号系统,我会问你编号('A'),然后编号('B')。然后我会拿N =数字('B') - 数字('A'),并要求你去数字('A',1),('A',2),...('A' ,N + 1)。现在你搞砸了,你不可能给('A',N + 1)一致的数字。如果你已经尽了最大的努力,你已经没有空间了,给每个先前A的孩子提供连带数字。如果你没有做到最好的工作,你已经失败了。

答案 1 :(得分:0)

您在那里的表示是一个部分订单。也就是说,并非所有元素都具有可比性。您正在寻找部分订单的线性化(即包含此部分订单的总订单)。例如,假设我们有 A1 - > B1 A1 - > B2 我从这个信息中知道A1> B1和A1> B2 ..但我对B1和B2一无所知。所以有两种可能性。 A1 - > B1 - > B2或A1 - > B2 - > B1。 该问题也称为拓扑排序,它在O(n + m)n中运行:节点数,m:边。

获取以下链接: http://en.wikipedia.org/wiki/Linear_extension http://en.wikipedia.org/wiki/Topological_sorting