问题描述
|
假设我有一组类似路径的结构:
A1 -> B1 -> C1
A1 -> B1 -> C2
A1 -> B2
A2
A3 -> B1
A4 -> B2 -> C3
现在,我想为这些路径中的每个路径创建一个序数值,以便可以对它们进行排序,而无需了解有关集合中任何其他路径的任何信息。
如果您想象路径表示XML节点之类的东西,那么根节点将成为根节点,B是第一个子节点,等等。我要先按A排序,然后按B排序,然后按C排序,等等。这些路径具有任意深度和每个级别上任意数量的节点。
我大约一个小时以来一直在动脑筋,没有想出任何优雅的方法。不幸的是,我不确定在搜索相关问题领域时应使用哪种术语。
编辑:实际上,对于我而言,获取集合中路径的总数并在计算过程中使用该值很容易。考虑到这一点,我将回到白板。谢谢@rrenaud。
解决方法
如果要保留顺序,则确实需要知道分支因子,深度或条目总数上的一些界限才能执行此操作。
矛盾证明。考虑我,你的邪恶对手。假设您想出一个不知道总大小限制的编号系统,我先问您Number(\'A \'),然后问Number(\'B \')。然后我将N = Number(\'B \')-Number(\'A \'),并要求您输入Number(\'A \',1),(\'A \',2 ),...(\'A \',N + 1)。现在您很困惑,您可能无法给(\'A \',N + 1)提供一致的数字。如果您已尽力做好了最好的工作,那么空间就用光了,给每个先前A的孩子的保守数字。如果您未尽最大努力,那么您已经迷失了方向。
,您所拥有的表示形式是偏序的。也就是说,并非所有元素都是可比较的。您正在寻找部分订单的线性化(即,包含该部分订单的总订单)。例如,假设我们有
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