【发布时间】:2014-08-29 21:02:04
【问题描述】:
我需要一种算法来找到我所说的“有序组合”(如果有的话,也许有人知道它的真实名称)。 当然,我已经尝试过自己想出一个算法,但我真的卡住了。
它应该如何工作:
给定 2 个元素列表(不是集合,这里的顺序很重要!)保证包含相同元素的元素,所有有序组合。 有序组合是一个 2 元组、3 元组、... n 元组(N 没有限制),这些元素在两个列表中以相同的顺序出现。
- 一个元素完全有可能在列表中出现多次。
- 但一个列表中的每个元素都保证在另一个列表中至少出现一次。
- 输出是否包含多次组合无关。
我不确定这是否清楚,所以这里有多个示例: (List1、List2、预期结果、注解)
ASDF
ADSF
Result: AS, AD, AF, SF, DF, ASF, ADF
注意:ASD 不是有效结果,因为在此组合的第二个列表中无法使用升序索引
ADSD
ASDD
Result: AD, AS, AD, DD, SD, ASD, ADD
注意:AD 出现两次,因为它可以从索引 1,2 和 1,4 以及在第二个列表 1,3 和 1,4 中创建。但如果它只出现一次也是正确的。此外 D 在两个列表中按顺序出现两次,因此这也允许 ADD 作为有效组合。
SDFG
SDFG
Result: SD, SF, SG, DF, DG, FG, SDF, SFG, SDG, DFG, SDFG,
注意:相同的输入;所有的组合都是可能的
ABCDEFG
GFEDCBA
Result: <empty>
注意:两个列表中没有以相同顺序出现的组合
QWRRRRRRR
WRQ
Result: WR
注意:在两个集合中以相同顺序出现的唯一组合是 WR
注意事项:
- 虽然它是一种与语言无关的算法,但我更喜欢包含 C# 或伪代码的答案,以便我能够理解它们。
- 我意识到较长的组合总是由较短的组合组成。示例:只有当 SD 和 DF 也可能时,SDF 才能成为有效结果。也许这有助于通过从较短的组合构建较长的组合来提高算法的性能。
- 速度在这里非常重要。这是实时使用的算法!
- 如果不清楚该算法的工作原理,请发表评论。我将添加一个示例来澄清它。
- 也许这个问题已经知道并解决了,但我不知道它的正确名称。
【问题讨论】:
-
我不是计算机科学家,但这感觉不是多项式的。
WR是WR WR WR WR WR WR WR的简化版。 -
对于
ADSD和ASDD,难道ASD也可以吗? -
@DavidEisenstat 是的,你当然是对的。我将编辑我的问题以包括 ASD。也可以添加!
-
另外,我想
SDFG本身缺少DFG?肯定会吹毛求疵,因为我很确定我理解正确。 -
@DavidEisenstat 是的,这也是一个有效(和必需)的结果