此问题是否有可用的特殊设计模式或算法?
有多个项目(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方法只是将项添加到结果集中!)我还没编码,所以我不确定验证过程有多复杂。我想也许有人知道我如何结合命令模式和验证算法来实现目标。
我可能错了,所以任何想法或建议都会有所帮助。感谢。
答案 0 :(得分:2)
这应该可以通过topological sort的变体来解决。
基本上,如果A i 必须在A之前,则构建一个有向无环图,其中有一个从A i 到A j 的边缘结果中的 j 。拓扑排序将为您提供A的有效订单。
这不会涉及某些项目可能缺失的规则,但这应该很容易在此之上进行分层。