根据一组规则排列集合中的项目

时间:2011-08-06 14:37:58

标签: algorithm design-patterns

此问题是否有可用的特殊设计模式或算法?

有多个项目(A1,A2,A3 ..An),我想安排它们,其中一些与其他项目有关,只能在它们之前或之后出现。

例如,A2可以仅在A4之后放置,并且“An”可以放置在该组的末尾。但问题是,某些项目的顺序可以互换,并且基于序列,某些项目不应该在集合中。

对于考试,请考虑这种情况

共有6个项目

A1,A2,A3,A4,A5,A6

规则是

A1必须位于第一位(总是),

A2可以在A4之后,

A5只有在A3出现之前才能进入集合

A6出现在集合的末尾,它是一个强制性成员,但只有在所有其他有效项目都在它之前的集合中才能存在!

有效集合如下

A1,A4,A3,A2,A5,A6

A1,A4,A2,A6

无效集

A4,A3,A2,A5,A6(错过A1)

A1,A4,A3,A2,A5(错过A6)

A1,A3,A2,A6(A2仅在A4之后)

注意:我必须验证输入!和输入可以有任何订单!我的意思是我不想对我想要验证来自用户的输入集的项目进行排序

作为示例,基于上面的示例,以下集合都是有效的

{A1,A4,A3,A2,A5,A6}

{A1,A4,A2,A3,A5,A6}

{A1,A3,A4,A2,A5,A6}

{A1,A3,A5,A4,A2,A6}

因此,用户可以输入任何这些作为输入,并且所有这些都根据定义的条件有效!

任何可以应用于此问题的特殊设计模式或算法的想法?物品数量或规则可能会在未来发生变化!

“BalusC”已删除我的“设计模式”标签!但到目前为止,我认为处理此问题的最佳方法可能是命令模式。我的意思是我认为每个项目都是来自用户的命令,我为命令定义了一个验证过程(“canExecute”)我将用C#编写它,因为.Net中的ICommand接口有“canExecute”方法我想我会用它来根据条件验证命令。 (Execute方法只是将项添加到结果集中!)我还没编码,所以我不确定验证过程有多复杂。我想也许有人知道我如何结合命令模式和验证算法来实现目标。

我可能错了,所以任何想法或建议都会有所帮助。感谢。

1 个答案:

答案 0 :(得分:2)

这应该可以通过topological sort的变体来解决。

基本上,如果A i 必须在A之前,则构建一个有向无环图,其中有一个从A i 到A j 的边缘结果中的 j 。拓扑排序将为您提供A的有效订单。

这不会涉及某些项目可能缺失的规则,但这应该很容易在此之上进行分层。